st_mesa_to_tgsi.c revision a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa
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 80909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul unsigned procType; /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */ 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 * Map mesa register file to TGSI register file. 131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 1334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelldst_register( struct st_translate *t, 1344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 1394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 1404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 1424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->temps[index]; 1464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 1484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->outputs[t->outputMapping[index]]; 1494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 1514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->address[index]; 1524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 154c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 1554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 1614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellsrc_register( struct st_translate *t, 1624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 1664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNDEFINED: 1674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_TEMPORARY: 1704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->temps[index]); 1734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_STATE_VAR: 1754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_NAMED_PARAM: 176c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell case PROGRAM_ENV_PARAM: 1774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNIFORM: 178c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell case PROGRAM_CONSTANT: /* ie, immediate */ 1794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->constants[index]; 1804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_INPUT: 1824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->inputs[t->inputMapping[index]]; 1834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_OUTPUT: 1854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_ADDRESS: 1884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->address[index]); 189af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 190af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 191c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 1924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 193af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 197909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 2004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned 2014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_texture_target( GLuint textarget, 2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLboolean shadow ) 203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (shadow) { 2054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 2074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 2094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: break; 2104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 2154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 2164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 2174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 2184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 220c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_TEXTURE_1D; 222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 224af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 2274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_dst( struct st_translate *t, 2284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_dst_register *DstReg, 2294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean saturate ) 230af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst = dst_register( t, 2324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->File, 2334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->Index ); 2344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_writemask( dst, 2364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->WriteMask ); 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (saturate) 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_saturate( dst ); 2404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (DstReg->RelAddr) 2424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 243af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return dst; 245af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 246af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 2494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_src( struct st_translate *t, 2504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 251af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 25381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 2544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_swizzle( src, 2554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 2564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 2574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 2584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 259fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 2604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Negate == NEGATE_XYZW) 2614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_negate(src); 262fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 2634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Abs) 2644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_abs(src); 2654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->RelAddr) 2674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_src_indirect( src, ureg_src(t->address[0])); 2684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return src; 270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 272909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul 2734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src swizzle_4v( struct ureg_src src, 2744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const unsigned *swz ) 275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 2774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 2784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 280909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 2818c26cefec7ad52c4fa52fd1a89e18f463b85257bBrian Paul * Translate a SWZ instruction into a MOV, MUL or MAD instruction. EG: 2824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * SWZ dst, src.x-y10 2844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * becomes: 2864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 2874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 2884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 2894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void emit_swz( struct st_translate *t, 2904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst, 2914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 2924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 2934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 2944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 2954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negate_mask = SrcReg->Negate; 2974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 2994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 3004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 3014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 3024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 3044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 3054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 3064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 3074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negative_one_mask = one_mask & negate_mask; 3094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned positive_one_mask = one_mask & ~negate_mask; 3104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src imm; 3124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 3134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned mul_swizzle[4] = {0,0,0,0}; 3144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned add_swizzle[4] = {0,0,0,0}; 3154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned src_swizzle[4] = {0,0,0,0}; 3164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_add = FALSE; 3174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_mul = FALSE; 3184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask == 0) 3204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 3214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Is this just a MOV? 3234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 3244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (zero_mask == 0 && 3254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell one_mask == 0 && 3264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 3274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell { 3284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 3294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 330762c1d11ffbb5179e44117397559e7cc2dfe9cefBrian Paul } 331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ZERO 0 3334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ONE 1 3344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_NEG_ONE 2 335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell imm = ureg_imm3f( ureg, 0, 1, -1 ); 337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < 4; i++) { 3394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned bit = 1 << i; 340ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 3414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask & bit) { 3424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (positive_one_mask & bit) { 3434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ONE; 3454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 34693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 3474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (negative_one_mask & bit) { 3484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_NEG_ONE; 3504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 3514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (zero_mask & bit) { 3534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 3544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 3554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 356af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 357af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 3584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 3594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 3604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_mul = TRUE; 3614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (negate_mask & bit) { 3624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_NEG_ONE; 3634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 3654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ONE; 36693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 367af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 368af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 3694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (need_mul && need_add) { 3724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MAD( ureg, 3734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 3754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ), 3764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 3774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_mul) { 3794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MUL( ureg, 3804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 3824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ) ); 3834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_add) { 3854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, 3864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 3874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 3884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 3894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 390c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 3914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 392af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ZERO 3944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ONE 3954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_NEG_ONE 3964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 397af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 398af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3998ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul/** 4008ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Negate the value of DDY to match GL semantics where (0,0) is the 4018ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * lower-left corner of the window. 4028ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Note that the GL_ARB_fragment_coord_conventions extension will 4038ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * effect this someday. 4048ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul */ 4058ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paulstatic void emit_ddy( struct st_translate *t, 4068ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_dst dst, 4078ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul const struct prog_src_register *SrcReg ) 4088ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul{ 4098ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_program *ureg = t->ureg; 4108ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_src src = translate_src( t, SrcReg ); 411c90baf444ca91d06ae5be392a04c0c8119cb08ddBrian Paul src = ureg_negate( src ); 4128ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul ureg_DDY( ureg, dst, src ); 4138ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul} 4148ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 4158ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 416af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_opcode( unsigned op ) 4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( op ) { 421af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ARL; 423af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 4244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ABS; 425af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ADD; 427af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNLOOP; 429af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 4304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNSUB; 431af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRA; 433af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRK; 435af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 4364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CAL; 437af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CMP; 439af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CONT; 441af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_COS; 443af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 4444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDX; 445af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 4464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDY; 4478343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2; 4498343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 4504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2A; 451af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 4524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP3; 453af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP4; 455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 4564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DPH; 457af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 4584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DST; 459af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 4604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ELSE; 461af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 4624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDIF; 463af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 4644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDLOOP; 465af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 4664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDSUB; 467af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 4684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EX2; 469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 4704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EXP; 471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 4724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FLR; 473af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 4744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FRC; 475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 4764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_IF; 4773225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 4784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TRUNC; 479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 4804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KIL; 481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 4824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KILP; 483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 4844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LG2; 485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 4864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LOG; 487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 4884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LIT; 489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 4904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LRP; 491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 4924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAD; 493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 4944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAX; 495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 4964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MIN; 497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 4984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MOV; 499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 5004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MUL; 501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 5024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 5038343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 5044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM; 5058343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 5064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM4; 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 5084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_POW; 509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 5104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RCP; 511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 5124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RET; 513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 5144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RSQ; 515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 5164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SCS; 517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 5184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SEQ; 519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 5204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGE; 521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 5224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGT; 523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 5244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SIN; 525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 5264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLE; 527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 5284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLT; 529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 5304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SNE; 5318343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 5324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SSG; 533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 5344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SUB; 535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 5364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TEX; 537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 5384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXB; 539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 5404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXD; 541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 5424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXL; 543af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 5444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXP; 545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 5464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_XPD; 547af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 5484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_END; 549af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 550c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 5514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void 5574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellcompile_instruction( 5584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate *t, 5594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_instruction *inst ) 560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 5614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 5624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint i; 5634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst[1]; 5644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src[4]; 5654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_dst; 5664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_src; 567af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 5694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_src = _mesa_num_inst_src_regs( inst->Opcode ); 5703eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 5714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (num_dst) 5724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = translate_dst( t, 5734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &inst->DstReg, 5744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->SaturateMode ); 575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < num_src; i++) 5774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[i] = translate_src( t, &inst->SrcReg[i] ); 578814d4ff83a515fe161cfb86c8b1492e2218051feBrian 5794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( inst->Opcode ) { 5804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SWZ: 5814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_swz( t, dst[0], &inst->SrcReg[0] ); 5824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 5838978627ad0e236796758d4912822b3428a649987Brian 5844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_BGNLOOP: 5854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_CAL: 5864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ELSE: 5874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ENDLOOP: 5884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_IF: 589c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(num_dst == 0); 5904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_label_insn( ureg, 5914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 5924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src, 5934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell get_label( t, inst->BranchTarget )); 5944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 595814d4ff83a515fe161cfb86c8b1492e2218051feBrian 5964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TEX: 5974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXB: 5984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXD: 5994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXL: 6004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXP: 6014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[num_src++] = t->samplers[inst->TexSrcUnit]; 6024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_tex_insn( ureg, 6034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_texture_target( inst->TexSrcTarget, 6064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->TexShadow ), 6074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SCS: 6114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 6124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 617af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_XPD: 6194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 6204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 625af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6264e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE1: 6274e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE2: 6284e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE3: 6294e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE4: 6304e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell /* At some point, a motivated person could add a better 6314e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * implementation of noise. Currently not even the nvidia 6324e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * binary drivers do anything more than this. In any case, the 6334e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * place to do this is in the GL state tracker, not the poor 6344e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * driver. 6354e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell */ 6364e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) ); 6374e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell break; 6384e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 6398ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul case OPCODE_DDY: 6408ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul emit_ddy( t, dst[0], &inst->SrcReg[0] ); 6418ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul break; 6424e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 6434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: 6444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 6454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 6474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 6484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 649401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 650401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 651401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 652401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell/** 6544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Emit the TGSI instructions for inverting the WPOS y coordinate. 6554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 656401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paulstatic void 6574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellemit_inverted_wpos( struct st_translate *t, 6584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct gl_program *program ) 659401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul{ 6604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 661401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fragment program uses fragment position input. 6634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Need to replace instances of INPUT[WPOS] with temp T 6644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * where T = INPUT[WPOS] by y is inverted. 6654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static const gl_state_index winSizeState[STATE_LENGTH] 6674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell = { STATE_INTERNAL, STATE_FB_SIZE, 0, 0, 0 }; 6684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 6694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* XXX: note we are modifying the incoming shader here! Need to 6704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * do this before emitting the constant decls below, or this 6714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * will be missed: 6724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned winHeightConst = _mesa_add_state_reference(program->Parameters, 6744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell winSizeState); 675401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src winsize = ureg_DECL_constant( ureg, winHeightConst ); 6774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 6784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 679401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* MOV wpos_temp, input[wpos] 6814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, wpos_temp, wpos_input ); 683401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* SUB wpos_temp.y, winsize_const, wpos_input 6854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_SUB( ureg, 6874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 6884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell winsize, 6894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell wpos_input); 690401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 6914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Use wpos_temp as position input from here on: 6924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 6934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 694401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 695401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 696401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 6987725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back. 6997725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * TGSI uses +1 for front, -1 for back. 7007725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * This function converts the TGSI value to the GL value. Simply clamping/ 7017725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * saturating the value to [0,1] does the job. 7027725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 7037725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulstatic void 7047725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulemit_face_var( struct st_translate *t, 7057725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul const struct gl_program *program ) 7067725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul{ 7077725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_program *ureg = t->ureg; 7087725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_dst face_temp = ureg_DECL_temporary( ureg ); 7097725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]]; 7107725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 7117725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* MOV_SAT face_temp, input[face] 7127725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 7137725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul face_temp = ureg_saturate( face_temp ); 7147725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul ureg_MOV( ureg, face_temp, face_input ); 7157725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 7167725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* Use face_temp as face input from here on: 7177725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 7187725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp); 7197725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul} 7207725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 7217725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 7227725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul/** 723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 729909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param inputSemanticIndex the semantic index (ex: which texcoord) for 730909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each input 731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 732af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 735af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 736909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param outputSemanticIndex the semantic index (ex: which texcoord) for 737909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each output 738af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 7394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * \return array of translated tokens, caller's responsibility to free 740af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 7414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellconst struct tgsi_token * 74281234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 743d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul GLcontext *ctx, 744a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 745af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 746af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 751af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 752af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 753af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 754af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 7559953fe4cb48b02a0d75735b88173f0ed170a77f2Keith Whitwell const ubyte outputSemanticIndex[] ) 756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 7574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate translate, *t; 7584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct tgsi_token *tokens = NULL; 7594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 760401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t = &translate; 7624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell memset(t, 0, sizeof *t); 763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->procType = procType; 7654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputMapping = inputMapping; 7664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputMapping = outputMapping; 767a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell t->ureg = ureg; 768af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 769be0cdd77eaee3de4d3fcd6f5832f4796990247f3Brian Paul /*_mesa_print_program(program);*/ 770af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 771af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 772af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 773af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 774af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 775af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 7764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_fs_input(ureg, 7774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputSemanticName[i], 7784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputSemanticIndex[i], 7794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell interpMode[i]); 780af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 7814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->InputsRead & FRAG_BIT_WPOS) { 7834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Must do this after setting up t->inputs, and before 7844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * emitting constant references, below: 7854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 7864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_inverted_wpos( t, program ); 787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 788af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7897725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul if (program->InputsRead & FRAG_BIT_FACE) { 7907725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul emit_face_var( t, program ); 7917725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul } 7927725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 7934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* 7944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Declare output attributes. 7954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 796af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 7994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 8004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_POSITION, /* Z / Depth */ 8014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 8024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_writemask( t->outputs[i], 8044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_WRITEMASK_Z ); 805af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 806af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 8074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 8084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_COLOR, 8094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 810af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 811af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 812c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 813c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 816af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 817af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 8184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numInputs; i++) { 8194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_vs_input(ureg, i); 820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numOutputs; i++) { 8234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 8244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticName[i], 8254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 826af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 827af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 828af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8295d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 8304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8313eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 832c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( program->NumAddressRegs == 1 ); 8334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->address[0] = ureg_DECL_address( ureg ); 8343eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 8353eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 83625e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca 8374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit constants and immediates. Mesa uses a single index space 8384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * for these, so we put all the translated regs in t->constants. 8395d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 8405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 8414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants = CALLOC( program->Parameters->NumParameters, 8434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell sizeof t->constants[0] ); 8444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->constants == NULL) 8454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell goto out; 8464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8475d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 8488978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 8498978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 8508978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 8518978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 8528978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 8534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 8545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 8554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 8564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit immediates only when there is no address register 8574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * in use. FIXME: Be smarter and recognize param arrays: 8584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * indirect addressing is only valid within the referenced 8594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * array. 8604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8615d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 8624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->NumAddressRegs > 0) 8634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 8644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else 8654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = 8664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_DECL_immediate( ureg, 8674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell program->Parameters->ParameterValues[i], 8684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4 ); 8695d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 8705d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 8714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 8728978627ad0e236796758d4912822b3428a649987Brian } 8738978627ad0e236796758d4912822b3428a649987Brian } 8748978627ad0e236796758d4912822b3428a649987Brian } 8758978627ad0e236796758d4912822b3428a649987Brian 876814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 877d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 878814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 8794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->samplers[i] = ureg_DECL_sampler( ureg, i ); 880814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 881814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 882814d4ff83a515fe161cfb86c8b1492e2218051feBrian 8834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit each instruction in turn: 8844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < program->NumInstructions; i++) { 8864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell set_insn_start( t, ureg_get_instruction_number( ureg )); 8874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell compile_instruction( t, &program->Instructions[i] ); 888401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 889401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 8904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fix up all emitted labels: 8914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < t->labels_count; i++) { 8934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_fixup_label( ureg, 8944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].token, 8954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->labels[i].branch_target] ); 8964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 8974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 898a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return PIPE_OK; 8994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 9004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellout: 9014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->insn); 9024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->labels); 9034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->constants); 9044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 9054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->error) { 9064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: translate error flag set\n", __FUNCTION__); 9074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE((void *)tokens); 9084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell tokens = NULL; 909af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 910af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 9114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (!tokens) { 9124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 913f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz _mesa_print_program(program); 914c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 915358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz } 916358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz 917a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return PIPE_ERROR_OUT_OF_MEMORY; 918af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 919734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 920734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 921734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca/** 922734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca * Tokens cannot be free with _mesa_free otherwise the builtin gallium 923734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca * malloc debugging will get confused. 924734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca */ 925734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecavoid 926734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecast_free_tokens(const struct tgsi_token *tokens) 927734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca{ 928734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca FREE((void *)tokens); 929734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca} 930