st_mesa_to_tgsi.c revision f1188d4464c78bfa0cd114d9331de8fba70724ac
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 t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); 123fb8d6b41d89c6221c8477eab229ecf0750c2c4e0Brian Paul t->labels = realloc(t->labels, t->labels_size * sizeof t->labels[0]); 1244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels == NULL) { 1254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static unsigned dummy; 1264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &dummy; 1284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell i = t->labels_count++; 1324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].branch_target = branch_target; 1334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &t->labels[i].token; 1344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1374e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1384e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Called prior to emitting the TGSI code for each Mesa instruction. 1394e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Allocate additional space for instructions if needed. 1404e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Update the insn[] array so the next Mesa instruction points to 1414e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * the next TGSI instruction. 1424e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 1434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void set_insn_start( struct st_translate *t, 1444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned start ) 1454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn_count + 1 >= t->insn_size) { 1474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); 148fb8d6b41d89c6221c8477eab229ecf0750c2c4e0Brian Paul t->insn = realloc(t->insn, t->insn_size * sizeof t->insn[0]); 1494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn == NULL) { 1504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 1524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->insn_count++] = start; 1564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1594e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1604e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa dst register to a TGSI ureg_dst register. 161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 1634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelldst_register( struct st_translate *t, 1644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 1694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 1704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 1724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->temps[index]; 1764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 178adbbaae7b925b212866bcba57e17db5824a16390Brian Paul if (t->procType == TGSI_PROCESSOR_VERTEX) 179adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < VERT_RESULT_MAX); 180adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else if (t->procType == TGSI_PROCESSOR_FRAGMENT) 181adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < FRAG_RESULT_MAX); 182adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else 183425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin assert(index < GEOM_RESULT_MAX); 184adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 185adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 186adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 1874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->outputs[t->outputMapping[index]]; 1884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 189af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 1904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->address[index]; 1914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 193c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 1944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1994e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 2004e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa src register to a TGSI ureg_src register. 2014e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 2034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellsrc_register( struct st_translate *t, 2044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 2059f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul GLint index ) 206af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 207af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNDEFINED: 2094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_TEMPORARY: 2129846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2138e17adfdbd96ba1a11cda329ddfd2b997255ea20Jerome Glisse assert(index < Elements(t->temps)); 2144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 2154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 2164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->temps[index]); 2174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_NAMED_PARAM: 219c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell case PROGRAM_ENV_PARAM: 220ef1b9426918a29b7ddd28601b0e53ed683abb89aBrian Paul case PROGRAM_LOCAL_PARAM: 2214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNIFORM: 2229846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->constants[index]; 224337d3b2b391c50130fa825ee853a570e1a84d309Brian Paul case PROGRAM_STATE_VAR: 2259f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_CONSTANT: /* ie, immediate */ 2269f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (index < 0) 2279f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return ureg_DECL_constant( t->ureg, 0 ); 2289f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul else 2299f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return t->constants[index]; 2304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_INPUT: 2324ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->inputMapping[index] < Elements(t->inputs)); 2334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->inputs[t->inputMapping[index]]; 2344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_OUTPUT: 2364ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 238af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_ADDRESS: 2404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->address[index]); 241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2422b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul case PROGRAM_SYSTEM_VALUE: 2432b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul assert(index < Elements(t->systemValues)); 2442b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul return t->systemValues[index]; 2452b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 246af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 247c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 249af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 250af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 251af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 253909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 254af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 255af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 256f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainunsigned 2573f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airliest_translate_texture_target( GLuint textarget, 2584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLboolean shadow ) 259af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (shadow) { 2614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 2634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 2644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 26519ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW1D_ARRAY; 26619ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW2D_ARRAY; 2672f275466f78b7268e4f7ae8890eafd4243a2b8b0Dave Airlie case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_SHADOWCUBE; 2684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: break; 2694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 2744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 2754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 2764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 2774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 2789b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_1D_ARRAY; 2799b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_2D_ARRAY; 2808cd0873d319cefce74164147c9855e81f051d1e1Chia-I Wu case TEXTURE_EXTERNAL_INDEX: return TGSI_TEXTURE_2D; 281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 282c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_TEXTURE_1D; 284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2884e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 2894e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_dst register from a Mesa dest register. 2904e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 2914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 2924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_dst( struct st_translate *t, 2934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_dst_register *DstReg, 294bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean saturate, 295bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_color) 296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst = dst_register( t, 2984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->File, 2994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->Index ); 3004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_writemask( dst, 3024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->WriteMask ); 3034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (saturate) 3054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_saturate( dst ); 306bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák else if (clamp_color && DstReg->File == PROGRAM_OUTPUT) { 307bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák /* Clamp colors for ARB_color_buffer_float. */ 308bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák switch (t->procType) { 309bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case TGSI_PROCESSOR_VERTEX: 310bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák /* XXX if the geometry shader is present, this must be done there 311bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák * instead of here. */ 312bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (DstReg->Index == VERT_RESULT_COL0 || 313bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_COL1 || 314bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_BFC0 || 315bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák DstReg->Index == VERT_RESULT_BFC1) { 316bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák dst = ureg_saturate(dst); 317bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 318bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák break; 319bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák 320bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák case TGSI_PROCESSOR_FRAGMENT: 321bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák if (DstReg->Index >= FRAG_RESULT_COLOR) { 322bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák dst = ureg_saturate(dst); 323bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 324bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák break; 325bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 326bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák } 3274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (DstReg->RelAddr) 3294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return dst; 332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3354e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 3364e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_src register from a Mesa src register. 3374e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 3384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 3394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_src( struct st_translate *t, 3404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 34381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 3441491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) { 3451491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin src = src_register( t, SrcReg->File, SrcReg->Index2 ); 3461491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (SrcReg->RelAddr2) 347425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]), 348425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin SrcReg->Index); 349425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin else 350425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension( src, SrcReg->Index); 351425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin } 352425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 3534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_swizzle( src, 3544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 3554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 3564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 3574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 358fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Negate == NEGATE_XYZW) 3604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_negate(src); 361fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Abs) 3634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_abs(src); 3644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3659f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (SrcReg->RelAddr) { 3664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_src_indirect( src, ureg_src(t->address[0])); 367dfe9dec04f707d61633665785600156d282d0d39Brian Paul if (SrcReg->File != PROGRAM_INPUT && 368dfe9dec04f707d61633665785600156d282d0d39Brian Paul SrcReg->File != PROGRAM_OUTPUT) { 369dfe9dec04f707d61633665785600156d282d0d39Brian Paul /* If SrcReg->Index was negative, it was set to zero in 370dfe9dec04f707d61633665785600156d282d0d39Brian Paul * src_register(). Reassign it now. But don't do this 371dfe9dec04f707d61633665785600156d282d0d39Brian Paul * for input/output regs since they get remapped while 372dfe9dec04f707d61633665785600156d282d0d39Brian Paul * const buffers don't. 373dfe9dec04f707d61633665785600156d282d0d39Brian Paul */ 374dfe9dec04f707d61633665785600156d282d0d39Brian Paul src.Index = SrcReg->Index; 375dfe9dec04f707d61633665785600156d282d0d39Brian Paul } 3769f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul } 3779f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul 3784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return src; 379af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 380af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 381909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul 3824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src swizzle_4v( struct ureg_src src, 3834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const unsigned *swz ) 384af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 3864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 3874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 389909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 3908c26cefec7ad52c4fa52fd1a89e18f463b85257bBrian Paul * Translate a SWZ instruction into a MOV, MUL or MAD instruction. EG: 3914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * SWZ dst, src.x-y10 3934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * becomes: 3954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 3974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 3984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void emit_swz( struct st_translate *t, 3994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst, 4004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 4014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 4024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 4034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 4044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negate_mask = SrcReg->Negate; 4064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 4084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 4094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 4114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 4134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 4154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negative_one_mask = one_mask & negate_mask; 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned positive_one_mask = one_mask & ~negate_mask; 4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src imm; 4214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned mul_swizzle[4] = {0,0,0,0}; 4234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned add_swizzle[4] = {0,0,0,0}; 4244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned src_swizzle[4] = {0,0,0,0}; 4254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_add = FALSE; 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_mul = FALSE; 4274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask == 0) 4294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 4304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Is this just a MOV? 4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 4334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (zero_mask == 0 && 4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell one_mask == 0 && 4354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 4364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell { 4374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 439762c1d11ffbb5179e44117397559e7cc2dfe9cefBrian Paul } 440af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ZERO 0 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ONE 1 4434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_NEG_ONE 2 444af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell imm = ureg_imm3f( ureg, 0, 1, -1 ); 446af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < 4; i++) { 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned bit = 1 << i; 449ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 4504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask & bit) { 4514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (positive_one_mask & bit) { 4524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ONE; 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 45593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 4564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (negative_one_mask & bit) { 4574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_NEG_ONE; 4594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 4604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (zero_mask & bit) { 4624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 465af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 466af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 4674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 4694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_mul = TRUE; 4704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (negate_mask & bit) { 4714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_NEG_ONE; 4724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 4744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ONE; 47593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 4784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (need_mul && need_add) { 4814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MAD( ureg, 4824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ), 4854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 4864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_mul) { 4884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MUL( ureg, 4894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ) ); 4924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_add) { 4944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, 4954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 4974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 499c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 5004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ZERO 5034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ONE 5044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_NEG_ONE 5054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 506af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5088ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul/** 5098ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Negate the value of DDY to match GL semantics where (0,0) is the 5108ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * lower-left corner of the window. 5118ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Note that the GL_ARB_fragment_coord_conventions extension will 5128ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * effect this someday. 5138ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul */ 5148ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paulstatic void emit_ddy( struct st_translate *t, 5158ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_dst dst, 5168ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul const struct prog_src_register *SrcReg ) 5178ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul{ 5188ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_program *ureg = t->ureg; 5198ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_src src = translate_src( t, SrcReg ); 520c90baf444ca91d06ae5be392a04c0c8119cb08ddBrian Paul src = ureg_negate( src ); 5218ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul ureg_DDY( ureg, dst, src ); 5228ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul} 5238ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 5248ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 5263f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airliestatic unsigned 5274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_opcode( unsigned op ) 5284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 5294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( op ) { 530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 5314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ARL; 532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 5334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ABS; 534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 5354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ADD; 536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 5374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNLOOP; 538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 5394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNSUB; 540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 5414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRA; 542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 5434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRK; 544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 5454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CAL; 546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 5474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CMP; 548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 5494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CONT; 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 5514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_COS; 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 5534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDX; 554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 5554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDY; 5568343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 5574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2; 5588343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 5594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2A; 560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 5614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP3; 562af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 5634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP4; 564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 5654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DPH; 566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 5674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DST; 568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 5694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ELSE; 570da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 571da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_EMIT; 572da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 573da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_ENDPRIM; 574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 5754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDIF; 576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 5774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDLOOP; 578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 5794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDSUB; 580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 5814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EX2; 582af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 5834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EXP; 584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 5854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FLR; 586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 5874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FRC; 588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 5894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_IF; 5903225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 5914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TRUNC; 592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 5934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KIL; 594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 5954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KILP; 596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 5974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LG2; 598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 5994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LOG; 600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 6014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LIT; 602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 6034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LRP; 604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 6054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAD; 606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 6074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAX; 608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 6094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MIN; 610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 6114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MOV; 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 6134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MUL; 614af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 6168343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 6174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM; 6188343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 6194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM4; 620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 6214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_POW; 622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RCP; 624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RET; 626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 6274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RSQ; 628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 6294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SCS; 630af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 6314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SEQ; 632af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 6334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGE; 634af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 6354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGT; 636af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 6374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SIN; 638af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 6394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLE; 640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 6414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLT; 642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 6434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SNE; 6448343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 6454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SSG; 646af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 6474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SUB; 648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 6494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TEX; 650af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 6514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXB; 652af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 6534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXD; 654af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 6554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXL; 656af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 6574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXP; 658af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 6594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_XPD; 660af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 6614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_END; 662af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 663c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 6644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 665af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 666af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 667af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 668af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void 6704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellcompile_instruction( 6714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate *t, 672bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák const struct prog_instruction *inst, 673bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_dst_color_output) 674af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 6754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 6764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint i; 677350f12fb657a2ac860796c179233fa357e4bf46cVinson Lee struct ureg_dst dst[1] = { { 0 } }; 6784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src[4]; 6794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_dst; 6804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_src; 681af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 6834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_src = _mesa_num_inst_src_regs( inst->Opcode ); 6843eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 6854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (num_dst) 6864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = translate_dst( t, 6874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &inst->DstReg, 688bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák inst->SaturateMode, 689bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák clamp_dst_color_output); 690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < num_src; i++) 6924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[i] = translate_src( t, &inst->SrcReg[i] ); 693814d4ff83a515fe161cfb86c8b1492e2218051feBrian 6944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( inst->Opcode ) { 6954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SWZ: 6964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_swz( t, dst[0], &inst->SrcReg[0] ); 6974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 6988978627ad0e236796758d4912822b3428a649987Brian 6994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_BGNLOOP: 7004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_CAL: 7014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ELSE: 7024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ENDLOOP: 7034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_IF: 704c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(num_dst == 0); 7054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_label_insn( ureg, 7064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src, 7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell get_label( t, inst->BranchTarget )); 7094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 710814d4ff83a515fe161cfb86c8b1492e2218051feBrian 7114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TEX: 7124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXB: 7134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXD: 7144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXL: 7154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXP: 7164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[num_src++] = t->samplers[inst->TexSrcUnit]; 7174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_tex_insn( ureg, 7184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7203f80b69b5f2093ffc624bb901ce34f0e289bc25dDave Airlie st_translate_texture_target( inst->TexSrcTarget, 7214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->TexShadow ), 7222083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie NULL, 0, 7234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SCS: 7274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 7284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_XPD: 7354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 7364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7424e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE1: 7434e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE2: 7444e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE3: 7454e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE4: 7464e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell /* At some point, a motivated person could add a better 7474e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * implementation of noise. Currently not even the nvidia 7484e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * binary drivers do anything more than this. In any case, the 7494e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * place to do this is in the GL state tracker, not the poor 7504e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * driver. 7514e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell */ 7524e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) ); 7534e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell break; 7544e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7558ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul case OPCODE_DDY: 7568ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul emit_ddy( t, dst[0], &inst->SrcReg[0] ); 7578ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul break; 7584e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: 7604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 765401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 766401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 767401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7684e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul 76962c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri/** 770f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * Emit the TGSI instructions for inverting and adjusting WPOS. 771d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * This code is unavoidable because it also depends on whether 772d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM). 7734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 774401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paulstatic void 775f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumilleremit_wpos_adjustment( struct st_translate *t, 776f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller const struct gl_program *program, 777f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller boolean invert, 778f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX, GLfloat adjY[2]) 779401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul{ 7804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 781401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fragment program uses fragment position input. 7834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Need to replace instances of INPUT[WPOS] with temp T 7844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * where T = INPUT[WPOS] by y is inverted. 7854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 786d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák static const gl_state_index wposTransformState[STATE_LENGTH] 787d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM, 0, 0, 0 }; 7884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* XXX: note we are modifying the incoming shader here! Need to 7904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * do this before emitting the constant decls below, or this 7914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * will be missed: 7924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 793d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák unsigned wposTransConst = _mesa_add_state_reference(program->Parameters, 794d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wposTransformState); 795401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 796d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst ); 797f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 7984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 799401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 800f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* First, apply the coordinate shift: */ 801f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjX || adjY[0] || adjY[1]) { 802f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjY[0] != adjY[1]) { 803f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Adjust the y coordinate by adjY[1] or adjY[0] respectively 804f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * depending on whether inversion is actually going to be applied 805f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * or not, which is determined by testing against the inversion 806f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * state variable used below, which will be either +1 or -1. 807f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 808f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst adj_temp = ureg_DECL_temporary(ureg); 809f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller 810f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_CMP(ureg, adj_temp, 811f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_scalar(wpostrans, invert ? 2 : 0), 812f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f), 813f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[1], 0.0f, 0.0f)); 814f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, ureg_src(adj_temp)); 815f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 816f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, 817f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f)); 818f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 819f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller wpos_input = ureg_src(wpos_temp); 820f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 821f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* MOV wpos_temp, input[wpos] 822f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 82362c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri ureg_MOV( ureg, wpos_temp, wpos_input ); 82462c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri } 825401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 826f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be 827f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion/identity, or the other way around if we're drawing to an FBO. 828f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 829d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák if (invert) { 830d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy 831d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 832d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 833d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 834d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 835d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 0), 836d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 1)); 837d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } else { 838d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww 839d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 840d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 841d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 842d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 843d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 2), 844d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 3)); 845d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } 846401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 8474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Use wpos_temp as position input from here on: 8484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 850401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 851401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 852401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 853af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 854489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * Emit fragment position/ooordinate code. 855489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul */ 856489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulstatic void 857489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulemit_wpos(struct st_context *st, 858489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct st_translate *t, 859489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_program *program, 860489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct ureg_program *ureg) 861489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul{ 862489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_fragment_program *fp = 863489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul (const struct gl_fragment_program *) program; 864489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct pipe_screen *pscreen = st->pipe->screen; 865f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX = 0.0f; 866f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjY[2] = { 0.0f, 0.0f }; 867489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul boolean invert = FALSE; 868489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 869f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Query the pixel center conventions supported by the pipe driver and set 870f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * adjX, adjY to help out if it cannot handle the requested one internally. 871f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 872f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * The bias of the y-coordinate depends on whether y-inversion takes place 873f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * (adjY[1]) or not (adjY[0]), which is in turn dependent on whether we are 874f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * drawing to an FBO (causes additional inversion), and whether the the pipe 875f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * driver origin and the requested origin differ (the latter condition is 876f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * stored in the 'invert' variable). 877f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 878f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * For height = 100 (i = integer, h = half-integer, l = lower, u = upper): 879f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 880f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * center shift only: 881f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * i -> h: +0.5 882f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * h -> i: -0.5 883f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 884f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion only: 885f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,i: ( 0.0 + 1.0) * -1 + 100 = 99 886f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,h: ( 0.5 + 0.0) * -1 + 100 = 99.5 887f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,i: (99.0 + 1.0) * -1 + 100 = 0 888f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,h: (99.5 + 0.0) * -1 + 100 = 0.5 889f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 890f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion and center shift: 891f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,h: ( 0.0 + 0.5) * -1 + 100 = 99.5 892f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,i: ( 0.5 + 0.5) * -1 + 100 = 99 893f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,h: (99.0 + 0.5) * -1 + 100 = 0.5 894f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,i: (99.5 + 0.5) * -1 + 100 = 0 895f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 896489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->OriginUpperLeft) { 89723490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in upper-left */ 898489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) { 89923490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin */ 900489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 901489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { 90223490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin, need to invert Y */ 903489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 904489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 905489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 906489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 907489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 908489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 909489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 91023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in lower-left */ 911489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) 91223490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin */ 913489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 914489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) 91523490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin, need to invert Y */ 916489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 917489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 918489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 919489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 920489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 921489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->PixelCenterInteger) { 92223490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center integer */ 923f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 92423490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer */ 925f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 1.0f; 926489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 927f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 928f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 92923490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer, need to bias X,Y */ 930f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = -0.5f; 931f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[0] = -0.5f; 932f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 0.5f; 933f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 934489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 935489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 936489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 937489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 93823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center half integer */ 939489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 94023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer */ 941489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 942489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 94323490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer, need to bias X,Y */ 944f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = adjY[0] = adjY[1] = 0.5f; 945489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 946489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 947489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 948489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 949489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 950489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 951489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul /* we invert after adjustment so that we avoid the MOV to temporary, 952489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * and reuse the adjustment ADD instead */ 953f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller emit_wpos_adjustment(t, program, invert, adjX, adjY); 954489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul} 955489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 956489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 957489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul/** 9587725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back. 9597725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * TGSI uses +1 for front, -1 for back. 9607725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * This function converts the TGSI value to the GL value. Simply clamping/ 9617725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * saturating the value to [0,1] does the job. 9627725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9637725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulstatic void 9647725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulemit_face_var( struct st_translate *t, 9657725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul const struct gl_program *program ) 9667725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul{ 9677725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_program *ureg = t->ureg; 9687725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_dst face_temp = ureg_DECL_temporary( ureg ); 9697725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]]; 9707725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9717725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* MOV_SAT face_temp, input[face] 9727725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9737725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul face_temp = ureg_saturate( face_temp ); 9747725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul ureg_MOV( ureg, face_temp, face_input ); 9757725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9767725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* Use face_temp as face input from here on: 9777725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9787725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp); 9797725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul} 9807725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9810766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 982890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggerstatic void 983890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggeremit_edgeflags( struct st_translate *t, 984890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const struct gl_program *program ) 985890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger{ 986890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_program *ureg = t->ureg; 987890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_dst edge_dst = t->outputs[t->outputMapping[VERT_RESULT_EDGE]]; 988890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_src edge_src = t->inputs[t->inputMapping[VERT_ATTRIB_EDGEFLAG]]; 989890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger 990890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger ureg_MOV( ureg, edge_dst, edge_src ); 991890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger} 9927725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9930766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 9947725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul/** 995af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 996af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 997af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 998af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 999af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 1000af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 1001909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param inputSemanticIndex the semantic index (ex: which texcoord) for 1002909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each input 1003af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 1004af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 1005af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 1006af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 1007af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 1008909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param outputSemanticIndex the semantic index (ex: which texcoord) for 1009909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each output 1010af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 10110766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY 1012af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1013a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheideggerenum pipe_error 101481234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 1015f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx, 1016af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 1017a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger struct ureg_program *ureg, 1018af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 1019af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 1020af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 1021af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 1022af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 1023af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 1024af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 1025af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 1026af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 1027890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const ubyte outputSemanticIndex[], 1028bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean passthrough_edgeflags, 1029bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák boolean clamp_color) 1030af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 10314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate translate, *t; 10324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 1033e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz enum pipe_error ret = PIPE_OK; 1034401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 10357c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numInputs <= Elements(t->inputs)); 10367c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numOutputs <= Elements(t->outputs)); 10377c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 10384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t = &translate; 10394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell memset(t, 0, sizeof *t); 1040af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->procType = procType; 10424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputMapping = inputMapping; 10434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputMapping = outputMapping; 1044a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell t->ureg = ureg; 1045af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1046be0cdd77eaee3de4d3fcd6f5832f4796990247f3Brian Paul /*_mesa_print_program(program);*/ 1047af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1048af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 1049af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 1050af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1051af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 1052af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 1053ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul if (program->InputFlags[0] & PROG_PARAM_BIT_CYL_WRAP) { 1054ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input_cyl(ureg, 1055ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1056ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1057ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i], 1058ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul TGSI_CYLINDRICAL_WRAP_X); 1059ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1060ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul else { 1061ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input(ureg, 1062ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1063ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1064ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i]); 1065ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1066af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 10674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->InputsRead & FRAG_BIT_WPOS) { 10694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Must do this after setting up t->inputs, and before 10704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * emitting constant references, below: 10714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1072489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul emit_wpos(st_context(ctx), t, program, ureg); 1073af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1074af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10757725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul if (program->InputsRead & FRAG_BIT_FACE) { 10767725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul emit_face_var( t, program ); 10777725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul } 10787725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 10794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* 10804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Declare output attributes. 10814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1082af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 1083af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 1084af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 10854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 10864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_POSITION, /* Z / Depth */ 10874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 10884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_writemask( t->outputs[i], 10904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_WRITEMASK_Z ); 1091af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1092ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie case TGSI_SEMANTIC_STENCIL: 1093ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_DECL_output( ureg, 1094ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_SEMANTIC_STENCIL, /* Stencil */ 1095ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie outputSemanticIndex[i] ); 1096ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_writemask( t->outputs[i], 1097ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_WRITEMASK_Y ); 1098ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie break; 1099af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 11004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 11014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_COLOR, 11024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 1103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 1105c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 1106c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 1107af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1108af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1109da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1110da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (procType == TGSI_PROCESSOR_GEOMETRY) { 1111da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numInputs; i++) { 1112da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->inputs[i] = ureg_DECL_gs_input(ureg, 1113da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 1114da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticName[i], 1115da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticIndex[i]); 1116da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1117da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1118da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numOutputs; i++) { 1119da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->outputs[i] = ureg_DECL_output( ureg, 1120da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticName[i], 1121da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticIndex[i] ); 1122da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 11257c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(procType == TGSI_PROCESSOR_VERTEX); 11267c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 11274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numInputs; i++) { 11284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_vs_input(ureg, i); 1129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numOutputs; i++) { 11324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 11334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticName[i], 11344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 1135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1136890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (passthrough_edgeflags) 1137890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger emit_edgeflags( t, program ); 1138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 11414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 11423eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 1143c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( program->NumAddressRegs == 1 ); 11444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->address[0] = ureg_DECL_address( ureg ); 11453eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 11463eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 11472b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul /* Declare misc input registers 11482b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul */ 11492b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul { 11502b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul GLbitfield sysInputs = program->SystemValuesRead; 11512b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned numSys = 0; 11522b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul for (i = 0; sysInputs; i++) { 11532b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul if (sysInputs & (1 << i)) { 11542b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned semName = mesa_sysval_to_semantic[i]; 11552b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul t->systemValues[i] = ureg_DECL_system_value(ureg, numSys, semName, 0); 1156b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca if (semName == TGSI_SEMANTIC_INSTANCEID || 1157b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca semName == TGSI_SEMANTIC_VERTEXID) { 1158b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca /* From Gallium perspective, these system values are always 1159b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * integer, and require native integer support. However, if 1160b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * native integer is supported on the vertex stage but not the 1161b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * pixel stage (e.g, i915g + draw), Mesa will generate IR that 1162b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * assumes these system values are floats. To resolve the 1163b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca * inconsistency, we insert a U2F. 1164b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca */ 1165b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct st_context *st = st_context(ctx); 1166b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct pipe_screen *pscreen = st->pipe->screen; 1167b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca assert(procType == TGSI_PROCESSOR_VERTEX); 1168b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca assert(pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_INTEGERS)); 1169b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca if (!ctx->Const.NativeIntegers) { 1170b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca struct ureg_dst temp = ureg_DECL_local_temporary(t->ureg); 1171b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca ureg_U2F( t->ureg, ureg_writemask(temp, TGSI_WRITEMASK_X), t->systemValues[i]); 1172b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca t->systemValues[i] = ureg_scalar(ureg_src(temp), 0); 1173b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca } 1174b3ba0a7afa6311e12852fb1373452e480f89ea96José Fonseca } 11752b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul numSys++; 11762b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul sysInputs &= ~(1 << i); 11772b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11782b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11792b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11802b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1181b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & (1 << PROGRAM_TEMPORARY)) { 1182b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* If temps are accessed with indirect addressing, declare temporaries 1183b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * in sequential order. Else, we declare them on demand elsewhere. 1184b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul */ 1185b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul for (i = 0; i < program->NumTemporaries; i++) { 1186b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */ 1187b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul t->temps[i] = ureg_DECL_temporary( t->ureg ); 1188b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1189b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1190b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 11914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit constants and immediates. Mesa uses a single index space 11924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * for these, so we put all the translated regs in t->constants. 11935d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 11945d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 11953f6ce3454f4d1331234f74670c82595f84269b1bBrian Paul t->constants = calloc( program->Parameters->NumParameters, 11964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell sizeof t->constants[0] ); 1197e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz if (t->constants == NULL) { 1198e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz ret = PIPE_ERROR_OUT_OF_MEMORY; 11994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell goto out; 1200e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz } 1201b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 12025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 12038978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 12048978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 12059f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_LOCAL_PARAM: 12068978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 12078978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 12088978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 12094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 12105d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1212b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* Emit immediates only when there's no indirect addressing of 1213b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * the const buffer. 1214b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * FIXME: Be smarter and recognize param arrays: 12154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * indirect addressing is only valid within the referenced 12164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * array. 12174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 1219b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & PROGRAM_ANY_CONST) 12204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 12214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else 12224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = 12234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_DECL_immediate( ureg, 1224b30bbd7436bdb9727d3766ba9c07abd610e6dda8Bryan Cain (const float*) program->Parameters->ParameterValues[i], 12254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4 ); 12265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 12284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 12298978627ad0e236796758d4912822b3428a649987Brian } 12308978627ad0e236796758d4912822b3428a649987Brian } 12318978627ad0e236796758d4912822b3428a649987Brian } 12328978627ad0e236796758d4912822b3428a649987Brian 1233814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 1234d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1235814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 12364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->samplers[i] = ureg_DECL_sampler( ureg, i ); 1237814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1238814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1239814d4ff83a515fe161cfb86c8b1492e2218051feBrian 12404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit each instruction in turn: 12414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < program->NumInstructions; i++) { 12434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell set_insn_start( t, ureg_get_instruction_number( ureg )); 1244bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák compile_instruction( t, &program->Instructions[i], clamp_color ); 1245401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 1246401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 12474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fix up all emitted labels: 12484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < t->labels_count; i++) { 12504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_fixup_label( ureg, 12514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].token, 12524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->labels[i].branch_target] ); 12534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 12544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellout: 12564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->insn); 12574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->labels); 12584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->constants); 12594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->error) { 12614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: translate error flag set\n", __FUNCTION__); 1262af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1263af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1264e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz return ret; 1265af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 1266734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1267734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1268734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca/** 126932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg * Tokens cannot be free with free otherwise the builtin gallium 1270734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca * malloc debugging will get confused. 1271734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca */ 1272734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecavoid 1273734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecast_free_tokens(const struct tgsi_token *tokens) 1274734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca{ 1275f1188d4464c78bfa0cd114d9331de8fba70724acBrian Paul ureg_free_tokens(tokens); 1276734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca} 1277