st_mesa_to_tgsi.c revision 3f6ce3454f4d1331234f74670c82595f84269b1b
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" 352dfd348e33f0152e3ab693ec3b53911331f5c349Vinson Lee#include "pipe/p_context.h" 362dfd348e33f0152e3ab693ec3b53911331f5c349Vinson Lee#include "pipe/p_screen.h" 37abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "pipe/p_state.h" 394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "tgsi/tgsi_ureg.h" 40af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "st_mesa_to_tgsi.h" 4162c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri#include "st_context.h" 42ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h" 43ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h" 44ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "util/u_math.h" 464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#include "util/u_memory.h" 474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 48b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 49b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul#define PROGRAM_ANY_CONST ((1 << PROGRAM_LOCAL_PARAM) | \ 50b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul (1 << PROGRAM_ENV_PARAM) | \ 51b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul (1 << PROGRAM_STATE_VAR) | \ 52b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul (1 << PROGRAM_NAMED_PARAM) | \ 53b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul (1 << PROGRAM_CONSTANT) | \ 54b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul (1 << PROGRAM_UNIFORM)) 55b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 56b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstruct label { 584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned branch_target; 594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned token; 604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell}; 614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 620766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 630766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul/** 640766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul * Intermediate state used during shader translation. 650766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul */ 664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstruct st_translate { 674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg; 684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst temps[MAX_PROGRAM_TEMPS]; 704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src *constants; 714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; 724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS]; 734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst address[1]; 744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src samplers[PIPE_MAX_SAMPLERS]; 752b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul struct ureg_src systemValues[SYSTEM_VALUE_MAX]; 764e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul 774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *inputMapping; 784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *outputMapping; 794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* For every instruction that contains a label (eg CALL), keep 814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * details so that we can go back afterwards and emit the correct 824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * tgsi instruction number for each label. 834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct label *labels; 854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_size; 864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_count; 874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Keep a record of the tgsi instruction number that each mesa 894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * instruction starts at, will be used to fix up labels after 904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * translation. 914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned *insn; 934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_size; 944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_count; 954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 96909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul unsigned procType; /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */ 974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean error; 994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell}; 1004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1022b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */ 1032b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paulstatic unsigned mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = { 1042b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul TGSI_SEMANTIC_FACE, 105da1544b39ebdf9b24414dcee214a5ccf76e74a77Christoph Bumiller TGSI_SEMANTIC_VERTEXID, 1062b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul TGSI_SEMANTIC_INSTANCEID 1072b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul}; 1082b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1092b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1104e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1114e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Make note of a branch to a label in the TGSI code. 1124e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * After we've emitted all instructions, we'll go over the list 1134e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * of labels built here and patch the TGSI code with the actual 1144e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * location of each label. 1154e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 1164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned *get_label( struct st_translate *t, 1174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned branch_target ) 1184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 1204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels_count + 1 >= t->labels_size) { 1224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->labels_size; 1234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); 1244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels = REALLOC( t->labels, 1254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->labels[0], 1264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size * sizeof t->labels[0] ); 1274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels == NULL) { 1284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static unsigned dummy; 1294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &dummy; 1314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell i = t->labels_count++; 1354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].branch_target = branch_target; 1364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &t->labels[i].token; 1374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1404e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1414e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Called prior to emitting the TGSI code for each Mesa instruction. 1424e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Allocate additional space for instructions if needed. 1434e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Update the insn[] array so the next Mesa instruction points to 1444e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * the next TGSI instruction. 1454e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 1464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void set_insn_start( struct st_translate *t, 1474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned start ) 1484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn_count + 1 >= t->insn_size) { 1504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->insn_size; 1514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); 1524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn = REALLOC( t->insn, 1534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->insn[0], 1544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size * sizeof t->insn[0] ); 1554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn == NULL) { 1564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 1584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->insn_count++] = start; 1624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1654e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1664e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa dst register to a TGSI ureg_dst register. 167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 1694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelldst_register( struct st_translate *t, 1704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 1754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 1764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 1784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->temps[index]; 1824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 184adbbaae7b925b212866bcba57e17db5824a16390Brian Paul if (t->procType == TGSI_PROCESSOR_VERTEX) 185adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < VERT_RESULT_MAX); 186adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else if (t->procType == TGSI_PROCESSOR_FRAGMENT) 187adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < FRAG_RESULT_MAX); 188adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else 189425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin assert(index < GEOM_RESULT_MAX); 190adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 191adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 192adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 1934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->outputs[t->outputMapping[index]]; 1944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 1964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->address[index]; 1974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 199c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 202af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2054e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 2064e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa src register to a TGSI ureg_src register. 2074e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 2094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellsrc_register( struct st_translate *t, 2104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 2119f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul GLint index ) 212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 2144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNDEFINED: 2154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_TEMPORARY: 2189846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2198e17adfdbd96ba1a11cda329ddfd2b997255ea20Jerome Glisse assert(index < Elements(t->temps)); 2204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 2214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 2224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->temps[index]); 2234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_NAMED_PARAM: 225c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell case PROGRAM_ENV_PARAM: 226ef1b9426918a29b7ddd28601b0e53ed683abb89aBrian Paul case PROGRAM_LOCAL_PARAM: 2274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNIFORM: 2289846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->constants[index]; 230337d3b2b391c50130fa825ee853a570e1a84d309Brian Paul case PROGRAM_STATE_VAR: 2319f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_CONSTANT: /* ie, immediate */ 2329f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (index < 0) 2339f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return ureg_DECL_constant( t->ureg, 0 ); 2349f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul else 2359f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return t->constants[index]; 2364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_INPUT: 2384ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->inputMapping[index] < Elements(t->inputs)); 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->inputs[t->inputMapping[index]]; 2404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_OUTPUT: 2424ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 2434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 244af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_ADDRESS: 2464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->address[index]); 247af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2482b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul case PROGRAM_SYSTEM_VALUE: 2492b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul assert(index < Elements(t->systemValues)); 2502b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul return t->systemValues[index]; 2512b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 252af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 253c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 255af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 256af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 257af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 259909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 260af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 261af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 262f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainunsigned 2633f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airliest_translate_texture_target( GLuint textarget, 2644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLboolean shadow ) 265af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (shadow) { 2674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 2694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 2704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 27119ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW1D_ARRAY; 27219ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW2D_ARRAY; 2732f275466f78b7268e4f7ae8890eafd4243a2b8b0Dave Airlie case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_SHADOWCUBE; 2744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: break; 2754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 2804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 2814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 2824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 2834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 2849b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_1D_ARRAY; 2859b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_2D_ARRAY; 2868cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu case TEXTURE_EXTERNAL_INDEX: return TGSI_TEXTURE_2D; 287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 288c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_TEXTURE_1D; 290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2944e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 2954e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_dst register from a Mesa dest register. 2964e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 2974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 2984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_dst( struct st_translate *t, 2994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_dst_register *DstReg, 300bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean saturate, 301bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_color) 302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst = dst_register( t, 3044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->File, 3054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->Index ); 3064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_writemask( dst, 3084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->WriteMask ); 3094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (saturate) 3114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_saturate( dst ); 312bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák else if (clamp_color && DstReg->File == PROGRAM_OUTPUT) { 313bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák /* Clamp colors for ARB_color_buffer_float. */ 314bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák switch (t->procType) { 315bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case TGSI_PROCESSOR_VERTEX: 316bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák /* XXX if the geometry shader is present, this must be done there 317bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák * instead of here. */ 318bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (DstReg->Index == VERT_RESULT_COL0 || 319bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_COL1 || 320bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_BFC0 || 321bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_BFC1) { 322bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák dst = ureg_saturate(dst); 323bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 324bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák break; 325bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 326bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case TGSI_PROCESSOR_FRAGMENT: 327bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (DstReg->Index >= FRAG_RESULT_COLOR) { 328bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák dst = ureg_saturate(dst); 329bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 330bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák break; 331bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 332bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 3334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (DstReg->RelAddr) 3354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return dst; 338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3414e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 3424e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_src register from a Mesa src register. 3434e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 3444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 3454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_src( struct st_translate *t, 3464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 34981dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 3501491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) { 3511491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin src = src_register( t, SrcReg->File, SrcReg->Index2 ); 3521491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (SrcReg->RelAddr2) 353425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]), 354425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin SrcReg->Index); 355425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin else 356425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension( src, SrcReg->Index); 357425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin } 358425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 3594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_swizzle( src, 3604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 3614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 3624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 3634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 364fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Negate == NEGATE_XYZW) 3664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_negate(src); 367fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Abs) 3694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_abs(src); 3704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3719f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (SrcReg->RelAddr) { 3724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_src_indirect( src, ureg_src(t->address[0])); 373dfe9dec04f707d61633665785600156d282d0d39Brian Paul if (SrcReg->File != PROGRAM_INPUT && 374dfe9dec04f707d61633665785600156d282d0d39Brian Paul SrcReg->File != PROGRAM_OUTPUT) { 375dfe9dec04f707d61633665785600156d282d0d39Brian Paul /* If SrcReg->Index was negative, it was set to zero in 376dfe9dec04f707d61633665785600156d282d0d39Brian Paul * src_register(). Reassign it now. But don't do this 377dfe9dec04f707d61633665785600156d282d0d39Brian Paul * for input/output regs since they get remapped while 378dfe9dec04f707d61633665785600156d282d0d39Brian Paul * const buffers don't. 379dfe9dec04f707d61633665785600156d282d0d39Brian Paul */ 380dfe9dec04f707d61633665785600156d282d0d39Brian Paul src.Index = SrcReg->Index; 381dfe9dec04f707d61633665785600156d282d0d39Brian Paul } 3829f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul } 3839f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul 3844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return src; 385af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 386af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 387909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul 3884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src swizzle_4v( struct ureg_src src, 3894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const unsigned *swz ) 390af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 3924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 3934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 395909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 3968c26cefec7ad52c4fa52fd1a89e18f463b85257bBrian Paul * Translate a SWZ instruction into a MOV, MUL or MAD instruction. EG: 3974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * SWZ dst, src.x-y10 3994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 4004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * becomes: 4014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 4024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 4034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 4044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void emit_swz( struct st_translate *t, 4054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst, 4064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 4074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 4084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 4094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negate_mask = SrcReg->Negate; 4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 4154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 4214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negative_one_mask = one_mask & negate_mask; 4244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned positive_one_mask = one_mask & ~negate_mask; 4254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src imm; 4274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned mul_swizzle[4] = {0,0,0,0}; 4294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned add_swizzle[4] = {0,0,0,0}; 4304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned src_swizzle[4] = {0,0,0,0}; 4314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_add = FALSE; 4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_mul = FALSE; 4334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask == 0) 4354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 4364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Is this just a MOV? 4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 4394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (zero_mask == 0 && 4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell one_mask == 0 && 4414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell { 4434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 4444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 445762c1d11ffbb5179e44117397559e7cc2dfe9cefBrian Paul } 446af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ZERO 0 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ONE 1 4494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_NEG_ONE 2 450af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell imm = ureg_imm3f( ureg, 0, 1, -1 ); 452af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < 4; i++) { 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned bit = 1 << i; 455ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 4564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask & bit) { 4574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (positive_one_mask & bit) { 4584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ONE; 4604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 46193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 4624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (negative_one_mask & bit) { 4634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_NEG_ONE; 4654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 4664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (zero_mask & bit) { 4684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 472af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 4734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 4754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_mul = TRUE; 4764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (negate_mask & bit) { 4774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_NEG_ONE; 4784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 4804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ONE; 48193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 4844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (need_mul && need_add) { 4874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MAD( ureg, 4884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ), 4914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 4924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_mul) { 4944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MUL( ureg, 4954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ) ); 4984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_add) { 5004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, 5014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 5024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 5034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 5044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 505c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 5064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ZERO 5094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ONE 5104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_NEG_ONE 5114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5148ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul/** 5158ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Negate the value of DDY to match GL semantics where (0,0) is the 5168ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * lower-left corner of the window. 5178ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Note that the GL_ARB_fragment_coord_conventions extension will 5188ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * effect this someday. 5198ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul */ 5208ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paulstatic void emit_ddy( struct st_translate *t, 5218ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_dst dst, 5228ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul const struct prog_src_register *SrcReg ) 5238ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul{ 5248ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_program *ureg = t->ureg; 5258ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_src src = translate_src( t, SrcReg ); 526c90baf444ca91d06ae5be392a04c0c8119cb08ddBrian Paul src = ureg_negate( src ); 5278ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul ureg_DDY( ureg, dst, src ); 5288ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul} 5298ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 5308ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5323f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airliestatic unsigned 5334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_opcode( unsigned op ) 5344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 5354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( op ) { 536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 5374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ARL; 538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 5394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ABS; 540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 5414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ADD; 542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 5434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNLOOP; 544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 5454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNSUB; 546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 5474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRA; 548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 5494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRK; 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 5514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CAL; 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 5534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CMP; 554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 5554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CONT; 556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 5574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_COS; 558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 5594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDX; 560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 5614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDY; 5628343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 5634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2; 5648343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 5654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2A; 566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 5674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP3; 568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 5694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP4; 570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 5714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DPH; 572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 5734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DST; 574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 5754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ELSE; 576da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 577da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_EMIT; 578da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 579da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_ENDPRIM; 580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 5814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDIF; 582af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 5834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDLOOP; 584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 5854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDSUB; 586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 5874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EX2; 588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 5894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EXP; 590af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 5914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FLR; 592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 5934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FRC; 594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 5954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_IF; 5963225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 5974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TRUNC; 598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 5994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KIL; 600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 6014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KILP; 602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 6034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LG2; 604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 6054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LOG; 606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 6074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LIT; 608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 6094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LRP; 610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 6114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAD; 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 6134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAX; 614af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MIN; 616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 6174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MOV; 618af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 6194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MUL; 620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 6214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 6228343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM; 6248343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM4; 626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 6274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_POW; 628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 6294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RCP; 630af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 6314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RET; 632af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 6334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RSQ; 634af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 6354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SCS; 636af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 6374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SEQ; 638af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 6394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGE; 640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 6414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGT; 642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 6434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SIN; 644af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 6454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLE; 646af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 6474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLT; 648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 6494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SNE; 6508343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 6514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SSG; 652af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 6534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SUB; 654af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 6554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TEX; 656af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 6574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXB; 658af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 6594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXD; 660af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 6614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXL; 662af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 6634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXP; 664af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 6654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_XPD; 666af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 6674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_END; 668af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 669c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 6704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 671af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 672af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 673af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 674af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void 6764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellcompile_instruction( 6774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate *t, 678bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák const struct prog_instruction *inst, 679bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_dst_color_output) 680af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 6814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 6824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint i; 683350f12fb657a2ac860796c179233fa357e4bf46cVinson Lee struct ureg_dst dst[1] = { { 0 } }; 6844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src[4]; 6854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_dst; 6864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_src; 687af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 6894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_src = _mesa_num_inst_src_regs( inst->Opcode ); 6903eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 6914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (num_dst) 6924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = translate_dst( t, 6934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &inst->DstReg, 694bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák inst->SaturateMode, 695bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák clamp_dst_color_output); 696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < num_src; i++) 6984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[i] = translate_src( t, &inst->SrcReg[i] ); 699814d4ff83a515fe161cfb86c8b1492e2218051feBrian 7004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( inst->Opcode ) { 7014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SWZ: 7024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_swz( t, dst[0], &inst->SrcReg[0] ); 7034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 7048978627ad0e236796758d4912822b3428a649987Brian 7054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_BGNLOOP: 7064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_CAL: 7074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ELSE: 7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ENDLOOP: 7094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_IF: 710c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(num_dst == 0); 7114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_label_insn( ureg, 7124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src, 7144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell get_label( t, inst->BranchTarget )); 7154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 716814d4ff83a515fe161cfb86c8b1492e2218051feBrian 7174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TEX: 7184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXB: 7194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXD: 7204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXL: 7214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXP: 7224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[num_src++] = t->samplers[inst->TexSrcUnit]; 7234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_tex_insn( ureg, 7244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7263f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airlie st_translate_texture_target( inst->TexSrcTarget, 7274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->TexShadow ), 7282083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie NULL, 0, 7294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SCS: 7334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 7344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 739af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_XPD: 7414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 7424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7484e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE1: 7494e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE2: 7504e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE3: 7514e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE4: 7524e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell /* At some point, a motivated person could add a better 7534e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * implementation of noise. Currently not even the nvidia 7544e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * binary drivers do anything more than this. In any case, the 7554e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * place to do this is in the GL state tracker, not the poor 7564e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * driver. 7574e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell */ 7584e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) ); 7594e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell break; 7604e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7618ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul case OPCODE_DDY: 7628ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul emit_ddy( t, dst[0], &inst->SrcReg[0] ); 7638ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul break; 7644e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: 7664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 771401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 772401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 773401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7744e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul 77562c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri/** 776f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * Emit the TGSI instructions for inverting and adjusting WPOS. 777d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * This code is unavoidable because it also depends on whether 778d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM). 7794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 780401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paulstatic void 781f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumilleremit_wpos_adjustment( struct st_translate *t, 782f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller const struct gl_program *program, 783f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller boolean invert, 784f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX, GLfloat adjY[2]) 785401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul{ 7864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 787401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fragment program uses fragment position input. 7894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Need to replace instances of INPUT[WPOS] with temp T 7904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * where T = INPUT[WPOS] by y is inverted. 7914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 792d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák static const gl_state_index wposTransformState[STATE_LENGTH] 793d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM, 0, 0, 0 }; 7944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* XXX: note we are modifying the incoming shader here! Need to 7964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * do this before emitting the constant decls below, or this 7974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * will be missed: 7984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 799d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák unsigned wposTransConst = _mesa_add_state_reference(program->Parameters, 800d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wposTransformState); 801401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 802d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst ); 803f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 8044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 805401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 806f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* First, apply the coordinate shift: */ 807f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjX || adjY[0] || adjY[1]) { 808f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjY[0] != adjY[1]) { 809f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Adjust the y coordinate by adjY[1] or adjY[0] respectively 810f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * depending on whether inversion is actually going to be applied 811f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * or not, which is determined by testing against the inversion 812f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * state variable used below, which will be either +1 or -1. 813f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 814f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst adj_temp = ureg_DECL_temporary(ureg); 815f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller 816f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_CMP(ureg, adj_temp, 817f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_scalar(wpostrans, invert ? 2 : 0), 818f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f), 819f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[1], 0.0f, 0.0f)); 820f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, ureg_src(adj_temp)); 821f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 822f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, 823f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f)); 824f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 825f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller wpos_input = ureg_src(wpos_temp); 826f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 827f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* MOV wpos_temp, input[wpos] 828f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 82962c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri ureg_MOV( ureg, wpos_temp, wpos_input ); 83062c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri } 831401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 832f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be 833f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion/identity, or the other way around if we're drawing to an FBO. 834f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 835d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák if (invert) { 836d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy 837d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 838d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 839d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 840d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 841d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 0), 842d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 1)); 843d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } else { 844d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww 845d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 846d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 847d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 848d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 849d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 2), 850d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 3)); 851d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } 852401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 8534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Use wpos_temp as position input from here on: 8544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 856401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 857401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 858401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 859af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 860489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * Emit fragment position/ooordinate code. 861489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul */ 862489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulstatic void 863489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulemit_wpos(struct st_context *st, 864489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct st_translate *t, 865489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_program *program, 866489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct ureg_program *ureg) 867489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul{ 868489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_fragment_program *fp = 869489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul (const struct gl_fragment_program *) program; 870489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct pipe_screen *pscreen = st->pipe->screen; 871f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX = 0.0f; 872f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjY[2] = { 0.0f, 0.0f }; 873489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul boolean invert = FALSE; 874489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 875f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Query the pixel center conventions supported by the pipe driver and set 876f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * adjX, adjY to help out if it cannot handle the requested one internally. 877f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 878f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * The bias of the y-coordinate depends on whether y-inversion takes place 879f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * (adjY[1]) or not (adjY[0]), which is in turn dependent on whether we are 880f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * drawing to an FBO (causes additional inversion), and whether the the pipe 881f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * driver origin and the requested origin differ (the latter condition is 882f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * stored in the 'invert' variable). 883f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 884f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * For height = 100 (i = integer, h = half-integer, l = lower, u = upper): 885f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 886f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * center shift only: 887f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * i -> h: +0.5 888f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * h -> i: -0.5 889f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 890f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion only: 891f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,i: ( 0.0 + 1.0) * -1 + 100 = 99 892f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,h: ( 0.5 + 0.0) * -1 + 100 = 99.5 893f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,i: (99.0 + 1.0) * -1 + 100 = 0 894f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,h: (99.5 + 0.0) * -1 + 100 = 0.5 895f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 896f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion and center shift: 897f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,h: ( 0.0 + 0.5) * -1 + 100 = 99.5 898f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,i: ( 0.5 + 0.5) * -1 + 100 = 99 899f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,h: (99.0 + 0.5) * -1 + 100 = 0.5 900f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,i: (99.5 + 0.5) * -1 + 100 = 0 901f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 902489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->OriginUpperLeft) { 90323490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in upper-left */ 904489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) { 90523490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin */ 906489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 907489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { 90823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin, need to invert Y */ 909489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 910489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 911489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 912489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 913489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 914489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 915489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 91623490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in lower-left */ 917489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) 91823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin */ 919489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 920489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) 92123490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin, need to invert Y */ 922489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 923489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 924489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 925489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 926489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 927489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->PixelCenterInteger) { 92823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center integer */ 929f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 93023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer */ 931f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 1.0f; 932489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 933f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 934f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 93523490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer, need to bias X,Y */ 936f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = -0.5f; 937f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[0] = -0.5f; 938f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 0.5f; 939f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 940489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 941489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 942489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 943489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 94423490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center half integer */ 945489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 94623490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer */ 947489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 948489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 94923490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer, need to bias X,Y */ 950f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = adjY[0] = adjY[1] = 0.5f; 951489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 952489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 953489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 954489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 955489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 956489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 957489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul /* we invert after adjustment so that we avoid the MOV to temporary, 958489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * and reuse the adjustment ADD instead */ 959f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller emit_wpos_adjustment(t, program, invert, adjX, adjY); 960489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul} 961489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 962489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 963489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul/** 9647725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back. 9657725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * TGSI uses +1 for front, -1 for back. 9667725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * This function converts the TGSI value to the GL value. Simply clamping/ 9677725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * saturating the value to [0,1] does the job. 9687725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9697725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulstatic void 9707725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulemit_face_var( struct st_translate *t, 9717725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul const struct gl_program *program ) 9727725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul{ 9737725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_program *ureg = t->ureg; 9747725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_dst face_temp = ureg_DECL_temporary( ureg ); 9757725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]]; 9767725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9777725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* MOV_SAT face_temp, input[face] 9787725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9797725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul face_temp = ureg_saturate( face_temp ); 9807725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul ureg_MOV( ureg, face_temp, face_input ); 9817725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9827725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* Use face_temp as face input from here on: 9837725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9847725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp); 9857725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul} 9867725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9870766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 988890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggerstatic void 989890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggeremit_edgeflags( struct st_translate *t, 990890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const struct gl_program *program ) 991890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger{ 992890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_program *ureg = t->ureg; 993890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_dst edge_dst = t->outputs[t->outputMapping[VERT_RESULT_EDGE]]; 994890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_src edge_src = t->inputs[t->inputMapping[VERT_ATTRIB_EDGEFLAG]]; 995890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger 996890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger ureg_MOV( ureg, edge_dst, edge_src ); 997890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger} 9987725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9990766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 10007725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul/** 1001af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 1002af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 1003af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 1004af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 1005af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 1006af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 1007909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param inputSemanticIndex the semantic index (ex: which texcoord) for 1008909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each input 1009af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 1010af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 1011af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 1012af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 1013af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 1014909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param outputSemanticIndex the semantic index (ex: which texcoord) for 1015909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each output 1016af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 10170766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY 1018af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1019a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheideggerenum pipe_error 102081234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 1021f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx, 1022af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 1023a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger struct ureg_program *ureg, 1024af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 1025af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 1026af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 1027af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 1028af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 1029af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 1030af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 1031af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 1032af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 1033890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const ubyte outputSemanticIndex[], 1034bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean passthrough_edgeflags, 1035bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_color) 1036af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 10374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate translate, *t; 10384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 1039e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz enum pipe_error ret = PIPE_OK; 1040401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 10417c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numInputs <= Elements(t->inputs)); 10427c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numOutputs <= Elements(t->outputs)); 10437c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 10444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t = &translate; 10454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell memset(t, 0, sizeof *t); 1046af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->procType = procType; 10484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputMapping = inputMapping; 10494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputMapping = outputMapping; 1050a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell t->ureg = ureg; 1051af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1052be0cdd77eaee3de4d3fcd6f5832f4796990247f3Brian Paul /*_mesa_print_program(program);*/ 1053af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1054af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 1055af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 1056af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1057af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 1058af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 1059ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul if (program->InputFlags[0] & PROG_PARAM_BIT_CYL_WRAP) { 1060ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input_cyl(ureg, 1061ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1062ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1063ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i], 1064ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul TGSI_CYLINDRICAL_WRAP_X); 1065ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1066ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul else { 1067ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input(ureg, 1068ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1069ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1070ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i]); 1071ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1072af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 10734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->InputsRead & FRAG_BIT_WPOS) { 10754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Must do this after setting up t->inputs, and before 10764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * emitting constant references, below: 10774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1078489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul emit_wpos(st_context(ctx), t, program, ureg); 1079af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1080af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10817725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul if (program->InputsRead & FRAG_BIT_FACE) { 10827725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul emit_face_var( t, program ); 10837725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul } 10847725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 10854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* 10864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Declare output attributes. 10874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1088af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 1089af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 1090af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 10914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 10924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_POSITION, /* Z / Depth */ 10934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 10944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_writemask( t->outputs[i], 10964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_WRITEMASK_Z ); 1097af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1098ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie case TGSI_SEMANTIC_STENCIL: 1099ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_DECL_output( ureg, 1100ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_SEMANTIC_STENCIL, /* Stencil */ 1101ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie outputSemanticIndex[i] ); 1102ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_writemask( t->outputs[i], 1103ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_WRITEMASK_Y ); 1104ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie break; 1105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 11064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 11074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_COLOR, 11084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 1109af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 1111c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 1112c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 1113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1115da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1116da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (procType == TGSI_PROCESSOR_GEOMETRY) { 1117da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numInputs; i++) { 1118da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->inputs[i] = ureg_DECL_gs_input(ureg, 1119da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 1120da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticName[i], 1121da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticIndex[i]); 1122da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1123da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1124da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numOutputs; i++) { 1125da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->outputs[i] = ureg_DECL_output( ureg, 1126da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticName[i], 1127da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticIndex[i] ); 1128da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 11317c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(procType == TGSI_PROCESSOR_VERTEX); 11327c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 11334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numInputs; i++) { 11344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_vs_input(ureg, i); 1135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numOutputs; i++) { 11384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 11394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticName[i], 11404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 1141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1142890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (passthrough_edgeflags) 1143890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger emit_edgeflags( t, program ); 1144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11465d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 11474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 11483eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 1149c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( program->NumAddressRegs == 1 ); 11504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->address[0] = ureg_DECL_address( ureg ); 11513eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 11523eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 11532b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul /* Declare misc input registers 11542b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul */ 11552b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul { 11562b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul GLbitfield sysInputs = program->SystemValuesRead; 11572b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned numSys = 0; 11582b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul for (i = 0; sysInputs; i++) { 11592b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul if (sysInputs & (1 << i)) { 11602b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned semName = mesa_sysval_to_semantic[i]; 11612b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul t->systemValues[i] = ureg_DECL_system_value(ureg, numSys, semName, 0); 1162b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca if (semName == TGSI_SEMANTIC_INSTANCEID || 1163b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca semName == TGSI_SEMANTIC_VERTEXID) { 1164b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca /* From Gallium perspective, these system values are always 1165b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * integer, and require native integer support. However, if 1166b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * native integer is supported on the vertex stage but not the 1167b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * pixel stage (e.g, i915g + draw), Mesa will generate IR that 1168b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * assumes these system values are floats. To resolve the 1169b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * inconsistency, we insert a U2F. 1170b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca */ 1171b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct st_context *st = st_context(ctx); 1172b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct pipe_screen *pscreen = st->pipe->screen; 1173b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca assert(procType == TGSI_PROCESSOR_VERTEX); 1174b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca assert(pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_INTEGERS)); 1175b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca if (!ctx->Const.NativeIntegers) { 1176b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct ureg_dst temp = ureg_DECL_local_temporary(t->ureg); 1177b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca ureg_U2F( t->ureg, ureg_writemask(temp, TGSI_WRITEMASK_X), t->systemValues[i]); 1178b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca t->systemValues[i] = ureg_scalar(ureg_src(temp), 0); 1179b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca } 1180b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca } 11812b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul numSys++; 11822b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul sysInputs &= ~(1 << i); 11832b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11842b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11852b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11862b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1187b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & (1 << PROGRAM_TEMPORARY)) { 1188b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* If temps are accessed with indirect addressing, declare temporaries 1189b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * in sequential order. Else, we declare them on demand elsewhere. 1190b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul */ 1191b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul for (i = 0; i < program->NumTemporaries; i++) { 1192b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */ 1193b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul t->temps[i] = ureg_DECL_temporary( t->ureg ); 1194b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1195b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1196b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 11974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit constants and immediates. Mesa uses a single index space 11984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * for these, so we put all the translated regs in t->constants. 11995d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 12005d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 12013f6ce3454f4d1331234f74670c82595f84269b1bBrian Paul t->constants = calloc( program->Parameters->NumParameters, 12024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell sizeof t->constants[0] ); 1203e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz if (t->constants == NULL) { 1204e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz ret = PIPE_ERROR_OUT_OF_MEMORY; 12054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell goto out; 1206e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz } 1207b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 12085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 12098978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 12108978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 12119f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_LOCAL_PARAM: 12128978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 12138978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 12148978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 12154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 12165d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1218b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* Emit immediates only when there's no indirect addressing of 1219b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * the const buffer. 1220b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * FIXME: Be smarter and recognize param arrays: 12214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * indirect addressing is only valid within the referenced 12224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * array. 12234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 1225b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & PROGRAM_ANY_CONST) 12264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 12274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else 12284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = 12294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_DECL_immediate( ureg, 1230b30bbd7436bdb9727d3766ba9c07abd610e6dda8Bryan Cain (const float*) program->Parameters->ParameterValues[i], 12314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4 ); 12325d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12335d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 12344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 12358978627ad0e236796758d4912822b3428a649987Brian } 12368978627ad0e236796758d4912822b3428a649987Brian } 12378978627ad0e236796758d4912822b3428a649987Brian } 12388978627ad0e236796758d4912822b3428a649987Brian 1239814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 1240d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1241814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 12424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->samplers[i] = ureg_DECL_sampler( ureg, i ); 1243814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1244814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1245814d4ff83a515fe161cfb86c8b1492e2218051feBrian 12464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit each instruction in turn: 12474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < program->NumInstructions; i++) { 12494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell set_insn_start( t, ureg_get_instruction_number( ureg )); 1250bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák compile_instruction( t, &program->Instructions[i], clamp_color ); 1251401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 1252401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 12534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fix up all emitted labels: 12544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < t->labels_count; i++) { 12564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_fixup_label( ureg, 12574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].token, 12584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->labels[i].branch_target] ); 12594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 12604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellout: 12624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->insn); 12634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->labels); 12644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->constants); 12654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->error) { 12674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: translate error flag set\n", __FUNCTION__); 1268af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1270e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz return ret; 1271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 1272734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1273734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1274734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca/** 127532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg * Tokens cannot be free with free otherwise the builtin gallium 1276734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca * malloc debugging will get confused. 1277734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca */ 1278734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecavoid 1279734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecast_free_tokens(const struct tgsi_token *tokens) 1280734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca{ 1281734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca FREE((void *)tokens); 1282734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca} 1283