st_mesa_to_tgsi.c revision 4295b34d25f40f38b8cfd3ebdc64aef29d0666db
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 304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Michal Krol, 314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Keith Whitwell 32af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 33af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 34abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_compiler.h" 35abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "pipe/p_state.h" 374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "tgsi/tgsi_ureg.h" 38af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "st_mesa_to_tgsi.h" 39c5841425433f003af76f03435de719c40635005aJosé Fonseca#include "shader/prog_instruction.h" 40af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "shader/prog_parameter.h" 41095ca0acd8019e8f2da89f9320b92ce4a96a140eBrian Paul#include "shader/prog_print.h" 42ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "util/u_math.h" 444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "util/u_memory.h" 454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstruct label { 474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned branch_target; 484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned token; 494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell}; 504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstruct st_translate { 524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg; 534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst temps[MAX_PROGRAM_TEMPS]; 554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src *constants; 564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; 574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS]; 584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst address[1]; 594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src samplers[PIPE_MAX_SAMPLERS]; 604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *inputMapping; 624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *outputMapping; 634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* For every instruction that contains a label (eg CALL), keep 654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * details so that we can go back afterwards and emit the correct 664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * tgsi instruction number for each label. 674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct label *labels; 694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_size; 704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_count; 714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Keep a record of the tgsi instruction number that each mesa 734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * instruction starts at, will be used to fix up labels after 744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * translation. 754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned *insn; 774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_size; 784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_count; 794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLenum procType; 814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean error; 834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell}; 844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned *get_label( struct st_translate *t, 874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned branch_target ) 884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels_count + 1 >= t->labels_size) { 924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->labels_size; 934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); 944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels = REALLOC( t->labels, 954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->labels[0], 964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size * sizeof t->labels[0] ); 974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels == NULL) { 984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static unsigned dummy; 994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &dummy; 1014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell i = t->labels_count++; 1054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].branch_target = branch_target; 1064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &t->labels[i].token; 1074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void set_insn_start( struct st_translate *t, 1114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned start ) 1124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn_count + 1 >= t->insn_size) { 1144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->insn_size; 1154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); 1164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn = REALLOC( t->insn, 1174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->insn[0], 1184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size * sizeof t->insn[0] ); 1194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn == NULL) { 1204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 1224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->insn_count++] = start; 1264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file to TGSI register file. 132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 1344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelldst_register( struct st_translate *t, 1354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 1404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 1414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 1434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->temps[index]; 1474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 1494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->outputs[t->outputMapping[index]]; 1504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 1524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->address[index]; 1534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 1564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 1634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellsrc_register( struct st_translate *t, 1644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 1684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNDEFINED: 1694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_TEMPORARY: 1724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->temps[index]); 1754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_STATE_VAR: 1774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_NAMED_PARAM: 1784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNIFORM: 1794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_CONSTANT: 1804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->constants[index]; 1814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_INPUT: 1834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->inputs[t->inputMapping[index]]; 1844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_OUTPUT: 1864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 187af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_ADDRESS: 1894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->address[index]); 190af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 191af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 1924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell assert( 0 ); 1934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 2014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned 2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_texture_target( GLuint textarget, 2034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLboolean shadow ) 204af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (shadow) { 2064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 2094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 2104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: break; 2114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 2164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 2174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 2184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 2194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 220af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 2224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_TEXTURE_1D; 223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 224af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 225af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 2294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_dst( struct st_translate *t, 2304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_dst_register *DstReg, 2314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean saturate ) 232af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst = dst_register( t, 2344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->File, 2354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->Index ); 2364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_writemask( dst, 2384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->WriteMask ); 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (saturate) 2414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_saturate( dst ); 2424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (DstReg->RelAddr) 2444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 245af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return dst; 247af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 248af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 2544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_src( struct st_translate *t, 2554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 256af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 25881dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 2594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_swizzle( src, 2604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 2614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 2624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 2634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 264fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 2654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Negate == NEGATE_XYZW) 2664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_negate(src); 267fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 2684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Abs) 2694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_abs(src); 2704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->RelAddr) 2724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_src_indirect( src, ureg_src(t->address[0])); 2734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return src; 275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src swizzle_4v( struct ureg_src src, 2784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const unsigned *swz ) 279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 2814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 2824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell/* Translate SWZ instructions into a single MAD. EG: 2854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * SWZ dst, src.x-y10 2874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * becomes: 2894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 2914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 2924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void emit_swz( struct st_translate *t, 2934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst, 2944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 2954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 2964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 2974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 2984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negate_mask = SrcReg->Negate; 3004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 3024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 3034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 3044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 3054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 3074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 3084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 3094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 3104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negative_one_mask = one_mask & negate_mask; 3124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned positive_one_mask = one_mask & ~negate_mask; 3134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src imm; 3154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 3164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned mul_swizzle[4] = {0,0,0,0}; 3174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned add_swizzle[4] = {0,0,0,0}; 3184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned src_swizzle[4] = {0,0,0,0}; 3194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_add = FALSE; 3204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_mul = FALSE; 3214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask == 0) 3234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 3244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Is this just a MOV? 3264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 3274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (zero_mask == 0 && 3284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell one_mask == 0 && 3294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 3304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell { 3314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 3324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 333762c1d11ffbb5179e44117397559e7cc2dfe9cefBrian Paul } 334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ZERO 0 3364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ONE 1 3374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_NEG_ONE 2 338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell imm = ureg_imm3f( ureg, 0, 1, -1 ); 340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < 4; i++) { 3424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned bit = 1 << i; 343ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 3444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask & bit) { 3454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (positive_one_mask & bit) { 3464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ONE; 3484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 34993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 3504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (negative_one_mask & bit) { 3514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_NEG_ONE; 3534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 3544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (zero_mask & bit) { 3564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 3584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 359af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 360af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 3614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 3624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 3634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_mul = TRUE; 3644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (negate_mask & bit) { 3654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_NEG_ONE; 3664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 3684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ONE; 36993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 371af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 3724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 373af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (need_mul && need_add) { 3754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MAD( ureg, 3764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 3784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ), 3794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 3804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_mul) { 3824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MUL( ureg, 3834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 3854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ) ); 3864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_add) { 3884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, 3894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 3914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 3934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell assert(0); 3944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 395af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ZERO 3974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ONE 3984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_NEG_ONE 3994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 400af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 401af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 402af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned 4044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_opcode( unsigned op ) 4054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 4064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( op ) { 407af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 4084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ARL; 409af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ABS; 411af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ADD; 413af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNLOOP; 415af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNSUB; 417af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRA; 419af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRK; 421af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CAL; 423af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 4244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CMP; 425af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CONT; 427af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_COS; 429af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 4304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDX; 431af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDY; 4338343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2; 4358343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 4364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2A; 437af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP3; 439af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP4; 441af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DPH; 443af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 4444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DST; 445af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 4464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ELSE; 447af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDIF; 449af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 4504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDLOOP; 451af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 4524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDSUB; 453af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EX2; 455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 4564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EXP; 457af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 4584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FLR; 459af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 4604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FRC; 461af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 4624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_IF; 4633225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 4644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TRUNC; 465af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 4664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KIL; 467af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 4684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KILP; 469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 4704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LG2; 471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 4724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LOG; 473af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 4744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LIT; 475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 4764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LRP; 477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 4784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAD; 479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 4804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAX; 481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 4824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MIN; 483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 4844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MOV; 485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 4864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MUL; 487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE1: 4884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOISE1; 489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE2: 4904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOISE2; 491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE3: 4924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOISE3; 493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE4: 4944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOISE4; 495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 4964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 4978343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 4984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM; 4998343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 5004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM4; 501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 5024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_POW; 503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 5044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RCP; 505af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 5064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RET; 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 5084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RSQ; 509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 5104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SCS; 511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 5124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SEQ; 513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 5144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGE; 515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 5164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGT; 517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 5184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SIN; 519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 5204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLE; 521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 5224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLT; 523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 5244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SNE; 5258343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 5264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SSG; 527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 5284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SUB; 529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SWZ: 5304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SWZ; 531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 5324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TEX; 533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 5344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXB; 535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 5364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXD; 537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 5384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXL; 539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 5404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXP; 541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 5424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_XPD; 543af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 5444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_END; 545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 5474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 549af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void 5534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellcompile_instruction( 5544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate *t, 5554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_instruction *inst ) 556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 5574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 5584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint i; 5594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst[1]; 5604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src[4]; 5614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_dst; 5624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_src; 563af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 5654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_src = _mesa_num_inst_src_regs( inst->Opcode ); 5663eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 5674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (num_dst) 5684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = translate_dst( t, 5694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &inst->DstReg, 5704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->SaturateMode ); 571af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < num_src; i++) 5734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[i] = translate_src( t, &inst->SrcReg[i] ); 574814d4ff83a515fe161cfb86c8b1492e2218051feBrian 5754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( inst->Opcode ) { 5764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SWZ: 5774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_swz( t, dst[0], &inst->SrcReg[0] ); 5784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 5798978627ad0e236796758d4912822b3428a649987Brian 5804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_BGNLOOP: 5814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_CAL: 5824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ELSE: 5834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ENDLOOP: 5844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_IF: 5854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell assert(num_dst == 0); 586814d4ff83a515fe161cfb86c8b1492e2218051feBrian 5874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Currently assuming a 1:1 relationship between mesa 5884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * instructions and TGSI instructions. That won't always be the 5894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * case, and to be generic we'll have to make a table of labels 5904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * that get fixed up afterwards. Or make labels symbolic in 5914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * TGSI. 5924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 5934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_label_insn( ureg, 5944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 5954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src, 5964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell get_label( t, inst->BranchTarget )); 5974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 598814d4ff83a515fe161cfb86c8b1492e2218051feBrian 5994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TEX: 6004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXB: 6014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXD: 6024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXL: 6034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXP: 6044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[num_src++] = t->samplers[inst->TexSrcUnit]; 6054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_tex_insn( ureg, 6064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_texture_target( inst->TexSrcTarget, 6094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->TexShadow ), 6104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 613af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SCS: 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 6164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 621af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_XPD: 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 6244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 629af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: 6314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 636401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 6374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 638401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 639401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 640401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 641401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 642401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 643401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 644401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 645401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell/** 6474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Emit the TGSI instructions for inverting the WPOS y coordinate. 6484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 649401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paulstatic void 6504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellemit_inverted_wpos( struct st_translate *t, 6514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct gl_program *program ) 652401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul{ 6534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 654401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fragment program uses fragment position input. 6564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Need to replace instances of INPUT[WPOS] with temp T 6574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * where T = INPUT[WPOS] by y is inverted. 6584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static const gl_state_index winSizeState[STATE_LENGTH] 6604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell = { STATE_INTERNAL, STATE_FB_SIZE, 0, 0, 0 }; 6614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 6624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* XXX: note we are modifying the incoming shader here! Need to 6634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * do this before emitting the constant decls below, or this 6644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * will be missed: 6654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned winHeightConst = _mesa_add_state_reference(program->Parameters, 6674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell winSizeState); 668401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src winsize = ureg_DECL_constant( ureg, winHeightConst ); 6704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 6714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 672401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* MOV wpos_temp, input[wpos] 6744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, wpos_temp, wpos_input ); 676401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* SUB wpos_temp.y, winsize_const, wpos_input 6784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_SUB( ureg, 6804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 6814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell winsize, 6824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell wpos_input); 683401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Use wpos_temp as position input from here on: 6854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 687401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 688401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 689401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 691af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 692af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex the semantic index (ex: which texcoord) for each input 700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex the semantic index (ex: which texcoord) for each output 707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * \return array of translated tokens, caller's responsibility to free 709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 7104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellconst struct tgsi_token * 71181234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 712d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul GLcontext *ctx, 713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 719af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 720c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul const GLbitfield inputFlags[], 721af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticIndex[], 7254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLbitfield outputFlags[] ) 726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 7274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate translate, *t; 7284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg; 7294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct tgsi_token *tokens = NULL; 7304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 731401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t = &translate; 7334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell memset(t, 0, sizeof *t); 734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->procType = procType; 7364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputMapping = inputMapping; 7374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputMapping = outputMapping; 7384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->ureg = ureg_create( procType ); 7394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->ureg == NULL) 7404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return NULL; 741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg = t->ureg; 743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell _mesa_print_program(program); 745af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 746af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 7514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_fs_input(ureg, 7524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputSemanticName[i], 7534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputSemanticIndex[i], 7544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell interpMode[i]); 755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 7564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->InputsRead & FRAG_BIT_WPOS) { 7584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Must do this after setting up t->inputs, and before 7594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * emitting constant references, below: 7604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 7614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_inverted_wpos( t, program ); 762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* 7654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Declare output attributes. 7664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 767af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 768af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 769af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 7704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 7714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_POSITION, /* Z / Depth */ 7724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 7734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_writemask( t->outputs[i], 7754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_WRITEMASK_Z ); 776af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 777af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 7784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 7794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_COLOR, 7804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 781af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 782af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 783c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca assert(0); 784c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 786af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 788af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 7894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numInputs; i++) { 7904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_vs_input(ureg, i); 791af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 792af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numOutputs; i++) { 7944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 7954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticName[i], 7964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8005d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 8014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8023eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 8033eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol assert( program->NumAddressRegs == 1 ); 8044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->address[0] = ureg_DECL_address( ureg ); 8053eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 8063eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 80725e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca 8084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit constants and immediates. Mesa uses a single index space 8094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * for these, so we put all the translated regs in t->constants. 8105d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 8115d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 8124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants = CALLOC( program->Parameters->NumParameters, 8144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell sizeof t->constants[0] ); 8154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->constants == NULL) 8164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell goto out; 8174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 8198978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 8208978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 8218978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 8228978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 8238978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 8244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 8255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 8264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit immediates only when there is no address register 8284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * in use. FIXME: Be smarter and recognize param arrays: 8294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * indirect addressing is only valid within the referenced 8304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * array. 8314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8325d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 8334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->NumAddressRegs > 0) 8344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 8354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else 8364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = 8374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_DECL_immediate( ureg, 8384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell program->Parameters->ParameterValues[i], 8394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4 ); 8405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 8415d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 8424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 8438978627ad0e236796758d4912822b3428a649987Brian } 8448978627ad0e236796758d4912822b3428a649987Brian } 8458978627ad0e236796758d4912822b3428a649987Brian } 8468978627ad0e236796758d4912822b3428a649987Brian 847814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 848d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 849814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 8504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->samplers[i] = ureg_DECL_sampler( ureg, i ); 851814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 852814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 853814d4ff83a515fe161cfb86c8b1492e2218051feBrian 8544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit each instruction in turn: 8554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < program->NumInstructions; i++) { 8574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell set_insn_start( t, ureg_get_instruction_number( ureg )); 8584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell compile_instruction( t, &program->Instructions[i] ); 859401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 860401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 8614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fix up all emitted labels: 8624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < t->labels_count; i++) { 8644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_fixup_label( ureg, 8654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].token, 8664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->labels[i].branch_target] ); 8674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 8684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell tokens = ureg_get_tokens( ureg, NULL ); 8704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_destroy( ureg ); 8714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellout: 8734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->insn); 8744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->labels); 8754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->constants); 8764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->error) { 8784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: translate error flag set\n", __FUNCTION__); 8794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE((void *)tokens); 8804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell tokens = NULL; 881af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 882af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (!tokens) { 8844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 885f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz _mesa_print_program(program); 886358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz assert(0); 887358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz } 888358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz 8894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return tokens; 890af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 891