st_mesa_to_tgsi.c revision 19ff7666f3ab58b91cf39bc5ec23d1d0b3d230ba
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 774e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul /* Extra info for handling point size clamping in vertex shader */ 784e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul struct ureg_dst pointSizeResult; /**< Actual point size output register */ 794e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul struct ureg_src pointSizeConst; /**< Point size range constant register */ 804e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul GLint pointSizeOutIndex; /**< Temp point size output register */ 814e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul GLboolean prevInstWrotePointSize; 824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *inputMapping; 844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const GLuint *outputMapping; 854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* For every instruction that contains a label (eg CALL), keep 874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * details so that we can go back afterwards and emit the correct 884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * tgsi instruction number for each label. 894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct label *labels; 914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_size; 924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned labels_count; 934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Keep a record of the tgsi instruction number that each mesa 954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * instruction starts at, will be used to fix up labels after 964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * translation. 974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned *insn; 994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_size; 1004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned insn_count; 1014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 102909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul unsigned procType; /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */ 1034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean error; 1054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell}; 1064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1082b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */ 1092b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paulstatic unsigned mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = { 1102b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul TGSI_SEMANTIC_FACE, 1112b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul TGSI_SEMANTIC_INSTANCEID 1122b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul}; 1132b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1142b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1154e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1164e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Make note of a branch to a label in the TGSI code. 1174e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * After we've emitted all instructions, we'll go over the list 1184e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * of labels built here and patch the TGSI code with the actual 1194e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * location of each label. 1204e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 1214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic unsigned *get_label( struct st_translate *t, 1224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned branch_target ) 1234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 1254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels_count + 1 >= t->labels_size) { 1274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->labels_size; 1284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); 1294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels = REALLOC( t->labels, 1304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->labels[0], 1314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels_size * sizeof t->labels[0] ); 1324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->labels == NULL) { 1334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell static unsigned dummy; 1344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &dummy; 1364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell i = t->labels_count++; 1404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].branch_target = branch_target; 1414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return &t->labels[i].token; 1424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1454e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1464e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Called prior to emitting the TGSI code for each Mesa instruction. 1474e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Allocate additional space for instructions if needed. 1484e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Update the insn[] array so the next Mesa instruction points to 1494e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * the next TGSI instruction. 1504e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 1514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void set_insn_start( struct st_translate *t, 1524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned start ) 1534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 1544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn_count + 1 >= t->insn_size) { 1554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned old_size = t->insn_size; 1564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); 1574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn = REALLOC( t->insn, 1584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell old_size * sizeof t->insn[0], 1594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn_size * sizeof t->insn[0] ); 1604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->insn == NULL) { 1614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->error = TRUE; 1624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 1634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 1654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->insn_count++] = start; 1674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 1684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1704e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 1714e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa dst register to a TGSI ureg_dst register. 172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 1744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelldst_register( struct st_translate *t, 1754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 1764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint index ) 177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 1804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 1814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 1834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 1844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 1854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->temps[index]; 1874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 188af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 1893b2bdde1b2ee93f77c01f5a94ebb7778192c15f8Brian Paul if (t->procType == TGSI_PROCESSOR_VERTEX && index == VERT_RESULT_PSIZ) 1904e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->prevInstWrotePointSize = GL_TRUE; 191adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 192adbbaae7b925b212866bcba57e17db5824a16390Brian Paul if (t->procType == TGSI_PROCESSOR_VERTEX) 193adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < VERT_RESULT_MAX); 194adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else if (t->procType == TGSI_PROCESSOR_FRAGMENT) 195adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(index < FRAG_RESULT_MAX); 196adbbaae7b925b212866bcba57e17db5824a16390Brian Paul else 197425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin assert(index < GEOM_RESULT_MAX); 198adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 199adbbaae7b925b212866bcba57e17db5824a16390Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 200adbbaae7b925b212866bcba57e17db5824a16390Brian Paul 2014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->outputs[t->outputMapping[index]]; 2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 2044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->address[index]; 2054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 206af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 207c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_dst_undef(); 209af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2134e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 2144e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Map a Mesa src register to a TGSI ureg_src register. 2154e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 2164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 2174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellsrc_register( struct st_translate *t, 2184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell gl_register_file file, 2199f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul GLint index ) 220af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 2224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNDEFINED: 2234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 224af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_TEMPORARY: 2269846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2278e17adfdbd96ba1a11cda329ddfd2b997255ea20Jerome Glisse assert(index < Elements(t->temps)); 2284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (ureg_dst_is_undef(t->temps[index])) 2294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->temps[index] = ureg_DECL_temporary( t->ureg ); 2304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->temps[index]); 2314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_NAMED_PARAM: 233c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell case PROGRAM_ENV_PARAM: 234ef1b9426918a29b7ddd28601b0e53ed683abb89aBrian Paul case PROGRAM_LOCAL_PARAM: 2354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_UNIFORM: 2369846b0627149e221c9fbd7c3379e33fb68e68511Vinson Lee assert(index >= 0); 2374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->constants[index]; 238337d3b2b391c50130fa825ee853a570e1a84d309Brian Paul case PROGRAM_STATE_VAR: 2399f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_CONSTANT: /* ie, immediate */ 2409f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (index < 0) 2419f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return ureg_DECL_constant( t->ureg, 0 ); 2429f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul else 2439f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul return t->constants[index]; 2444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_INPUT: 2464ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->inputMapping[index] < Elements(t->inputs)); 2474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return t->inputs[t->inputMapping[index]]; 2484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 2494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_OUTPUT: 2504ae2bdcb150aa87557c8f1648445e84bfb926986Brian Paul assert(t->outputMapping[index] < Elements(t->outputs)); 2514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 252af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case PROGRAM_ADDRESS: 2544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src(t->address[index]); 255af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2562b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul case PROGRAM_SYSTEM_VALUE: 2572b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul assert(index < Elements(t->systemValues)); 2582b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul return t->systemValues[index]; 2592b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 260af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 261c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_src_undef(); 263af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 264af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 265af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 267909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 268af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 270f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainunsigned 2714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_texture_target( GLuint textarget, 2724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLboolean shadow ) 273af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 2744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (shadow) { 2754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 2774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 2784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 27919ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW1D_ARRAY; 28019ff7666f3ab58b91cf39bc5ec23d1d0b3d230baMarek Olšák case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW2D_ARRAY; 2814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: break; 2824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( textarget ) { 2864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 2874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 2884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 2894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 2904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 2919b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_1D_ARRAY; 2929b56a2cb626b254bcb7b7202e6babd1b5570208fBrian Paul case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_2D_ARRAY; 293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 294c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 2954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_TEXTURE_1D; 296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3004e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 3014e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_dst register from a Mesa dest register. 3024e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 3034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_dst 3044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_dst( struct st_translate *t, 3054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_dst_register *DstReg, 3064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean saturate ) 307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst = dst_register( t, 3094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->File, 3104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->Index ); 3114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_writemask( dst, 3134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell DstReg->WriteMask ); 3144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (saturate) 3164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_saturate( dst ); 3174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (DstReg->RelAddr) 3194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return dst; 322af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 3244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3254e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul/** 3264e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Create a TGSI ureg_src register from a Mesa src register. 3274e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 3284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src 3294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_src( struct st_translate *t, 3304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 33381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 3341491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) { 3351491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin src = src_register( t, SrcReg->File, SrcReg->Index2 ); 3361491c6aa2de17760ab157a3fe71e45006e4eecf6Zack Rusin if (SrcReg->RelAddr2) 337425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]), 338425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin SrcReg->Index); 339425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin else 340425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin src = ureg_src_dimension( src, SrcReg->Index); 341425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin } 342425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 3434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_swizzle( src, 3444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 3454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 3464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 3474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 348fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Negate == NEGATE_XYZW) 3504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_negate(src); 351fd31f92cea0ce8613a22d8f4b3c75b340bcc5689Keith Whitwell 3524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (SrcReg->Abs) 3534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_abs(src); 3544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3559f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul if (SrcReg->RelAddr) { 3564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src = ureg_src_indirect( src, ureg_src(t->address[0])); 357dfe9dec04f707d61633665785600156d282d0d39Brian Paul if (SrcReg->File != PROGRAM_INPUT && 358dfe9dec04f707d61633665785600156d282d0d39Brian Paul SrcReg->File != PROGRAM_OUTPUT) { 359dfe9dec04f707d61633665785600156d282d0d39Brian Paul /* If SrcReg->Index was negative, it was set to zero in 360dfe9dec04f707d61633665785600156d282d0d39Brian Paul * src_register(). Reassign it now. But don't do this 361dfe9dec04f707d61633665785600156d282d0d39Brian Paul * for input/output regs since they get remapped while 362dfe9dec04f707d61633665785600156d282d0d39Brian Paul * const buffers don't. 363dfe9dec04f707d61633665785600156d282d0d39Brian Paul */ 364dfe9dec04f707d61633665785600156d282d0d39Brian Paul src.Index = SrcReg->Index; 365dfe9dec04f707d61633665785600156d282d0d39Brian Paul } 3669f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul } 3679f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul 3684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return src; 369af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 371909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul 3724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic struct ureg_src swizzle_4v( struct ureg_src src, 3734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const unsigned *swz ) 374af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 3754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 3764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 3774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 379909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul/** 3808c26cefec7ad52c4fa52fd1a89e18f463b85257bBrian Paul * Translate a SWZ instruction into a MOV, MUL or MAD instruction. EG: 3814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * SWZ dst, src.x-y10 3834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * becomes: 3854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * 3864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 3874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 3884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void emit_swz( struct st_translate *t, 3894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst, 3904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_src_register *SrcReg ) 3914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 3924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 3934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 3944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negate_mask = SrcReg->Negate; 3964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 3974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 3984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 3994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 4004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 4014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 4034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 4044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 4054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 4064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned negative_one_mask = one_mask & negate_mask; 4084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned positive_one_mask = one_mask & ~negate_mask; 4094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src imm; 4114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned mul_swizzle[4] = {0,0,0,0}; 4134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned add_swizzle[4] = {0,0,0,0}; 4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned src_swizzle[4] = {0,0,0,0}; 4154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_add = FALSE; 4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell boolean need_mul = FALSE; 4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask == 0) 4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Is this just a MOV? 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 4234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (zero_mask == 0 && 4244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell one_mask == 0 && 4254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell { 4274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 429762c1d11ffbb5179e44117397559e7cc2dfe9cefBrian Paul } 430af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ZERO 0 4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_ONE 1 4334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#define IMM_NEG_ONE 2 434af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell imm = ureg_imm3f( ureg, 0, 1, -1 ); 436af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < 4; i++) { 4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned bit = 1 << i; 439ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (dst.WriteMask & bit) { 4414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (positive_one_mask & bit) { 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ONE; 4444295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 44593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 4464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (negative_one_mask & bit) { 4474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_NEG_ONE; 4494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 4504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (zero_mask & bit) { 4524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ZERO; 4534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_add = TRUE; 455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 456af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 4574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell add_swizzle[i] = IMM_ZERO; 4584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 4594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell need_mul = TRUE; 4604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (negate_mask & bit) { 4614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_NEG_ONE; 4624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 4644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell mul_swizzle[i] = IMM_ONE; 46593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 466af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 467af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 4684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (need_mul && need_add) { 4714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MAD( ureg, 4724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ), 4754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 4764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_mul) { 4784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MUL( ureg, 4794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( src, src_swizzle ), 4814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, mul_swizzle ) ); 4824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else if (need_add) { 4844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_MOV( ureg, 4854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, 4864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell swizzle_4v( imm, add_swizzle ) ); 4874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 4884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else { 489c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 4904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4924295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ZERO 4934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_ONE 4944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell#undef IMM_NEG_ONE 4954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell} 496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 4988ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul/** 4998ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Negate the value of DDY to match GL semantics where (0,0) is the 5008ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * lower-left corner of the window. 5018ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * Note that the GL_ARB_fragment_coord_conventions extension will 5028ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul * effect this someday. 5038ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul */ 5048ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paulstatic void emit_ddy( struct st_translate *t, 5058ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_dst dst, 5068ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul const struct prog_src_register *SrcReg ) 5078ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul{ 5088ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_program *ureg = t->ureg; 5098ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul struct ureg_src src = translate_src( t, SrcReg ); 510c90baf444ca91d06ae5be392a04c0c8119cb08ddBrian Paul src = ureg_negate( src ); 5118ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul ureg_DDY( ureg, dst, src ); 5128ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul} 5138ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 5148ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul 515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 516f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainunsigned 5174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwelltranslate_opcode( unsigned op ) 5184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell{ 5194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( op ) { 520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 5214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ARL; 522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 5234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ABS; 524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 5254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ADD; 526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 5274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNLOOP; 528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 5294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BGNSUB; 530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 5314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRA; 532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 5334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_BRK; 534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 5354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CAL; 536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 5374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CMP; 538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 5394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_CONT; 540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 5414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_COS; 542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 5434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDX; 544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 5454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DDY; 5468343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 5474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2; 5488343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 5494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP2A; 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 5514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP3; 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 5534295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DP4; 554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 5554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DPH; 556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 5574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_DST; 558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 5594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ELSE; 560da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_EMIT_VERTEX: 561da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_EMIT; 562da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case OPCODE_END_PRIMITIVE: 563da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin return TGSI_OPCODE_ENDPRIM; 564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 5654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDIF; 566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 5674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDLOOP; 568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 5694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_ENDSUB; 570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 5714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EX2; 572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 5734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_EXP; 574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 5754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FLR; 576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 5774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_FRC; 578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 5794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_IF; 5803225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 5814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TRUNC; 582af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 5834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KIL; 584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 5854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_KILP; 586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 5874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LG2; 588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 5894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LOG; 590af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 5914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LIT; 592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 5934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_LRP; 594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 5954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAD; 596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 5974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MAX; 598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 5994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MIN; 600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 6014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MOV; 602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 6034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_MUL; 604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 6054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 6068343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 6074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM; 6088343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 6094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NRM4; 610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 6114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_POW; 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 6134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RCP; 614af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RET; 616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 6174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_RSQ; 618af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 6194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SCS; 620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 6214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SEQ; 622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGE; 624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SGT; 626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 6274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SIN; 628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 6294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLE; 630af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 6314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SLT; 632af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 6334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SNE; 6348343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 6354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SSG; 636af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 6374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_SUB; 638af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 6394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TEX; 640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 6414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXB; 642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 6434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXD; 644af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 6454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXL; 646af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 6474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_TXP; 648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 6494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_XPD; 650af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 6514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_END; 652af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 653c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( 0 ); 6544295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return TGSI_OPCODE_NOP; 655af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 656af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 657af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 658af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellstatic void 6604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellcompile_instruction( 6614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate *t, 6624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell const struct prog_instruction *inst ) 663af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 6644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 6654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell GLuint i; 6664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_dst dst[1]; 6674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src src[4]; 6684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_dst; 6694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned num_src; 670af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 6724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell num_src = _mesa_num_inst_src_regs( inst->Opcode ); 6733eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 6744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (num_dst) 6754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = translate_dst( t, 6764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &inst->DstReg, 6774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->SaturateMode ); 678af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < num_src; i++) 6804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[i] = translate_src( t, &inst->SrcReg[i] ); 681814d4ff83a515fe161cfb86c8b1492e2218051feBrian 6824295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell switch( inst->Opcode ) { 6834295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SWZ: 6844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell emit_swz( t, dst[0], &inst->SrcReg[0] ); 6854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 6868978627ad0e236796758d4912822b3428a649987Brian 6874295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_BGNLOOP: 6884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_CAL: 6894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ELSE: 6904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_ENDLOOP: 6914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_IF: 692c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(num_dst == 0); 6934295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_label_insn( ureg, 6944295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 6954295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src, 6964295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell get_label( t, inst->BranchTarget )); 6974295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 698814d4ff83a515fe161cfb86c8b1492e2218051feBrian 6994295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TEX: 7004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXB: 7014295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXD: 7024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXL: 7034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_TXP: 7044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src[num_src++] = t->samplers[inst->TexSrcUnit]; 7054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_tex_insn( ureg, 7064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7074295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_texture_target( inst->TexSrcTarget, 7094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inst->TexShadow ), 7102083a276eb270b748d1c2668eb9faa5aadc8e700Dave Airlie NULL, 0, 7114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell return; 713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_SCS: 7154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 7164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 721af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell case OPCODE_XPD: 7234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 7244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 7304e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE1: 7314e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE2: 7324e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE3: 7334e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell case OPCODE_NOISE4: 7344e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell /* At some point, a motivated person could add a better 7354e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * implementation of noise. Currently not even the nvidia 7364e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * binary drivers do anything more than this. In any case, the 7374e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * place to do this is in the GL state tracker, not the poor 7384e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell * driver. 7394e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell */ 7404e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) ); 7414e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell break; 7424e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7438ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul case OPCODE_DDY: 7448ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul emit_ddy( t, dst[0], &inst->SrcReg[0] ); 7458ce17134431ec27666e8fba2fa4bd22ba3f3ed18Brian Paul break; 7464e1d51786e0657c7430d731ac464f2a73e32eddfKeith Whitwell 7474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell default: 7484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_insn( ureg, 7494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell translate_opcode( inst->Opcode ), 7504295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell dst, num_dst, 7514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell src, num_src ); 7524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 753401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 754401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 755401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7564e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul 75762c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri/** 758f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * Emit the TGSI instructions for inverting and adjusting WPOS. 759d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * This code is unavoidable because it also depends on whether 760d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák * a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM). 7614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 762401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paulstatic void 763f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumilleremit_wpos_adjustment( struct st_translate *t, 764f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller const struct gl_program *program, 765f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller boolean invert, 766f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX, GLfloat adjY[2]) 767401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul{ 7684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_program *ureg = t->ureg; 769401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 7704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fragment program uses fragment position input. 7714295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Need to replace instances of INPUT[WPOS] with temp T 7724295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * where T = INPUT[WPOS] by y is inverted. 7734295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 774d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák static const gl_state_index wposTransformState[STATE_LENGTH] 775d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM, 0, 0, 0 }; 7764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 7774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* XXX: note we are modifying the incoming shader here! Need to 7784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * do this before emitting the constant decls below, or this 7794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * will be missed: 7804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 781d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák unsigned wposTransConst = _mesa_add_state_reference(program->Parameters, 782d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wposTransformState); 783401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 784d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst ); 785f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 7864295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 787401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 788f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* First, apply the coordinate shift: */ 789f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjX || adjY[0] || adjY[1]) { 790f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (adjY[0] != adjY[1]) { 791f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Adjust the y coordinate by adjY[1] or adjY[0] respectively 792f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * depending on whether inversion is actually going to be applied 793f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * or not, which is determined by testing against the inversion 794f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * state variable used below, which will be either +1 or -1. 795f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 796f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller struct ureg_dst adj_temp = ureg_DECL_temporary(ureg); 797f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller 798f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_CMP(ureg, adj_temp, 799f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_scalar(wpostrans, invert ? 2 : 0), 800f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f), 801f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[1], 0.0f, 0.0f)); 802f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, ureg_src(adj_temp)); 803f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 804f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_ADD(ureg, wpos_temp, wpos_input, 805f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f)); 806f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 807f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller wpos_input = ureg_src(wpos_temp); 808f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } else { 809f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* MOV wpos_temp, input[wpos] 810f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 81162c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri ureg_MOV( ureg, wpos_temp, wpos_input ); 81262c673b6ac65d27ed83acc92434874b45f75db5cLuca Barbieri } 813401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 814f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be 815f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion/identity, or the other way around if we're drawing to an FBO. 816f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 817d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák if (invert) { 818d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy 819d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 820d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 821d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 822d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 823d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 0), 824d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 1)); 825d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } else { 826d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww 827d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák */ 828d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_MAD( ureg, 829d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 830d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák wpos_input, 831d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 2), 832d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák ureg_scalar(wpostrans, 3)); 833d531f9c2f5c78468d913fc509b223760ac1c1124Marek Olšák } 834401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 8354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Use wpos_temp as position input from here on: 8364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 8374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 838401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul} 839401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 840401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 841af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 842489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * Emit fragment position/ooordinate code. 843489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul */ 844489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulstatic void 845489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paulemit_wpos(struct st_context *st, 846489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct st_translate *t, 847489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_program *program, 848489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct ureg_program *ureg) 849489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul{ 850489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul const struct gl_fragment_program *fp = 851489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul (const struct gl_fragment_program *) program; 852489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul struct pipe_screen *pscreen = st->pipe->screen; 853f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjX = 0.0f; 854f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller GLfloat adjY[2] = { 0.0f, 0.0f }; 855489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul boolean invert = FALSE; 856489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 857f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller /* Query the pixel center conventions supported by the pipe driver and set 858f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * adjX, adjY to help out if it cannot handle the requested one internally. 859f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 860f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * The bias of the y-coordinate depends on whether y-inversion takes place 861f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * (adjY[1]) or not (adjY[0]), which is in turn dependent on whether we are 862f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * drawing to an FBO (causes additional inversion), and whether the the pipe 863f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * driver origin and the requested origin differ (the latter condition is 864f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * stored in the 'invert' variable). 865f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 866f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * For height = 100 (i = integer, h = half-integer, l = lower, u = upper): 867f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 868f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * center shift only: 869f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * i -> h: +0.5 870f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * h -> i: -0.5 871f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 872f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion only: 873f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,i: ( 0.0 + 1.0) * -1 + 100 = 99 874f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,h: ( 0.5 + 0.0) * -1 + 100 = 99.5 875f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,i: (99.0 + 1.0) * -1 + 100 = 0 876f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,h: (99.5 + 0.0) * -1 + 100 = 0.5 877f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * 878f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * inversion and center shift: 879f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,i -> u,h: ( 0.0 + 0.5) * -1 + 100 = 99.5 880f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * l,h -> u,i: ( 0.5 + 0.5) * -1 + 100 = 99 881f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,i -> l,h: (99.0 + 0.5) * -1 + 100 = 0.5 882f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller * u,h -> l,i: (99.5 + 0.5) * -1 + 100 = 0 883f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller */ 884489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->OriginUpperLeft) { 88523490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in upper-left */ 886489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) { 88723490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin */ 888489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 889489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { 89023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin, need to invert Y */ 891489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 892489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 893489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 894489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 895489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 896489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 897489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 89823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants origin in lower-left */ 899489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) 90023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports lower-left origin */ 901489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 902489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) 90323490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports upper-left origin, need to invert Y */ 904489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul invert = TRUE; 905489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 906489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 907489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 908489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 909489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (fp->PixelCenterInteger) { 91023490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center integer */ 911f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 91223490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer */ 913f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 1.0f; 914489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 915f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 916f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 91723490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer, need to bias X,Y */ 918f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = -0.5f; 919f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[0] = -0.5f; 920f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjY[1] = 0.5f; 921f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller } 922489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 923489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 924489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 925489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else { 92623490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* Fragment shader wants pixel center half integer */ 927489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 92823490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center half integer */ 929489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 930489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 93123490d7a8bb77cc0a39ffe7c1ce83ce8e9e9c5bbBrian Paul /* the driver supports pixel center integer, need to bias X,Y */ 932f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller adjX = adjY[0] = adjY[1] = 0.5f; 933489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 934489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 935489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul else 936489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul assert(0); 937489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul } 938489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 939489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul /* we invert after adjustment so that we avoid the MOV to temporary, 940489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul * and reuse the adjustment ADD instead */ 941f986a6560f3ee9a79b89e9409e3a9ac52b53315cChristoph Bumiller emit_wpos_adjustment(t, program, invert, adjX, adjY); 942489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul} 943489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 944489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul 945489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul/** 9467725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back. 9477725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * TGSI uses +1 for front, -1 for back. 9487725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * This function converts the TGSI value to the GL value. Simply clamping/ 9497725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul * saturating the value to [0,1] does the job. 9507725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9517725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulstatic void 9527725744433827509d1da1cf1b27cda4bc8012ef3Brian Paulemit_face_var( struct st_translate *t, 9537725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul const struct gl_program *program ) 9547725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul{ 9557725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_program *ureg = t->ureg; 9567725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_dst face_temp = ureg_DECL_temporary( ureg ); 9577725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]]; 9587725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9597725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* MOV_SAT face_temp, input[face] 9607725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9617725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul face_temp = ureg_saturate( face_temp ); 9627725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul ureg_MOV( ureg, face_temp, face_input ); 9637725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9647725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul /* Use face_temp as face input from here on: 9657725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul */ 9667725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp); 9677725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul} 9687725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9690766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 970890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggerstatic void 971890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheideggeremit_edgeflags( struct st_translate *t, 972890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const struct gl_program *program ) 973890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger{ 974890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_program *ureg = t->ureg; 975890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_dst edge_dst = t->outputs[t->outputMapping[VERT_RESULT_EDGE]]; 976890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger struct ureg_src edge_src = t->inputs[t->inputMapping[VERT_ATTRIB_EDGEFLAG]]; 977890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger 978890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger ureg_MOV( ureg, edge_dst, edge_src ); 979890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger} 9807725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 9810766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul 9827725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul/** 983af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 984af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 985af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 986af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 987af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 988af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 989909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param inputSemanticIndex the semantic index (ex: which texcoord) for 990909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each input 991af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 992af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 993af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 994af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 995af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 996909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * \param outputSemanticIndex the semantic index (ex: which texcoord) for 997909ab3377f7c61049c1fb29b8898e7d84489ce21Brian Paul * each output 998af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 9990766780a98a86c474c70dcd0179d697b906ecfdbBrian Paul * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY 1000af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1001a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheideggerenum pipe_error 100281234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 1003f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx, 1004af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 1005a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger struct ureg_program *ureg, 1006af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 1007af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 1008af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 1009af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 1010af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 1011af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 1012af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 1013af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 1014af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 1015890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger const ubyte outputSemanticIndex[], 1016890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger boolean passthrough_edgeflags ) 1017af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 10184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell struct st_translate translate, *t; 10194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell unsigned i; 1020e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz enum pipe_error ret = PIPE_OK; 1021401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 10227c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numInputs <= Elements(t->inputs)); 10237c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(numOutputs <= Elements(t->outputs)); 10247c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 10254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t = &translate; 10264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell memset(t, 0, sizeof *t); 1027af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->procType = procType; 10294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputMapping = inputMapping; 10304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputMapping = outputMapping; 1031a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell t->ureg = ureg; 10324e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->pointSizeOutIndex = -1; 10334e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->prevInstWrotePointSize = GL_FALSE; 1034af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1035be0cdd77eaee3de4d3fcd6f5832f4796990247f3Brian Paul /*_mesa_print_program(program);*/ 1036af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1037af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 1038af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 1039af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 1040af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 1041af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 1042ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul if (program->InputFlags[0] & PROG_PARAM_BIT_CYL_WRAP) { 1043ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input_cyl(ureg, 1044ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1045ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1046ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i], 1047ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul TGSI_CYLINDRICAL_WRAP_X); 1048ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1049ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul else { 1050ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul t->inputs[i] = ureg_DECL_fs_input(ureg, 1051ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticName[i], 1052ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul inputSemanticIndex[i], 1053ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul interpMode[i]); 1054ae4dde6598eacb64bf865037bdaea2041499aa27Brian Paul } 1055af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 10564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (program->InputsRead & FRAG_BIT_WPOS) { 10584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Must do this after setting up t->inputs, and before 10594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * emitting constant references, below: 10604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1061489eced800cb0f20a1e1d66b84a048e4df99503bBrian Paul emit_wpos(st_context(ctx), t, program, ureg); 1062af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1063af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 10647725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul if (program->InputsRead & FRAG_BIT_FACE) { 10657725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul emit_face_var( t, program ); 10667725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul } 10677725744433827509d1da1cf1b27cda4bc8012ef3Brian Paul 10684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* 10694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * Declare output attributes. 10704295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 1071af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 1072af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 1073af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 10744295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 10754295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_POSITION, /* Z / Depth */ 10764295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 10774295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 10784295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_writemask( t->outputs[i], 10794295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_WRITEMASK_Z ); 1080af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1081ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie case TGSI_SEMANTIC_STENCIL: 1082ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_DECL_output( ureg, 1083ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_SEMANTIC_STENCIL, /* Stencil */ 1084ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie outputSemanticIndex[i] ); 1085ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie t->outputs[i] = ureg_writemask( t->outputs[i], 1086ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie TGSI_WRITEMASK_Y ); 1087ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie break; 1088af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 10894295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 10904295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_SEMANTIC_COLOR, 10914295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 1092af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 1093af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 1094c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert(0); 1095c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 1096af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1097af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1098da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1099da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin else if (procType == TGSI_PROCESSOR_GEOMETRY) { 1100da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numInputs; i++) { 1101da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->inputs[i] = ureg_DECL_gs_input(ureg, 1102da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 1103da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticName[i], 1104da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputSemanticIndex[i]); 1105da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1106da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1107da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < numOutputs; i++) { 1108da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin t->outputs[i] = ureg_DECL_output( ureg, 1109da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticName[i], 1110da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputSemanticIndex[i] ); 1111da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 11147c6a89727543e7f0b72b792ec77f02565337e923Brian Paul assert(procType == TGSI_PROCESSOR_VERTEX); 11157c6a89727543e7f0b72b792ec77f02565337e923Brian Paul 11164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numInputs; i++) { 11174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->inputs[i] = ureg_DECL_vs_input(ureg, i); 1118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1119af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < numOutputs; i++) { 11214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->outputs[i] = ureg_DECL_output( ureg, 11224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticName[i], 11234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputSemanticIndex[i] ); 11242c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger if ((outputSemanticName[i] == TGSI_SEMANTIC_PSIZE) && program->Id) { 11254e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul /* Writing to the point size result register requires special 11264e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * handling to implement clamping. 11274e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 11282c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger static const gl_state_index pointSizeClampState[STATE_LENGTH] 11292c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger = { STATE_INTERNAL, STATE_POINT_SIZE_IMPL_CLAMP, 0, 0, 0 }; 11302c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger /* XXX: note we are modifying the incoming shader here! Need to 11312c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * do this before emitting the constant decls below, or this 11322c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger * will be missed: 11332c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger */ 11347d2db19fe581ede34dd1f396f1e0bd46ea5c3776Brian Paul unsigned pointSizeClampConst = 11357d2db19fe581ede34dd1f396f1e0bd46ea5c3776Brian Paul _mesa_add_state_reference(program->Parameters, 11367d2db19fe581ede34dd1f396f1e0bd46ea5c3776Brian Paul pointSizeClampState); 11372c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger struct ureg_dst psizregtemp = ureg_DECL_temporary( ureg ); 11382c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger t->pointSizeConst = ureg_DECL_constant( ureg, pointSizeClampConst ); 11394e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->pointSizeResult = t->outputs[i]; 11404e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->pointSizeOutIndex = i; 11412c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger t->outputs[i] = psizregtemp; 11422c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 1143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1144890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (passthrough_edgeflags) 1145890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger emit_edgeflags( t, program ); 1146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 11485d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 11494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 11503eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 1151c0de2ed5055b951ff523c3b25eecfc82d1f307efKeith Whitwell debug_assert( program->NumAddressRegs == 1 ); 11524295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->address[0] = ureg_DECL_address( ureg ); 11533eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 11543eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 11552b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul /* Declare misc input registers 11562b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul */ 11572b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul { 11582b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul GLbitfield sysInputs = program->SystemValuesRead; 11592b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned numSys = 0; 11602b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul for (i = 0; sysInputs; i++) { 11612b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul if (sysInputs & (1 << i)) { 11622b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul unsigned semName = mesa_sysval_to_semantic[i]; 11632b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul t->systemValues[i] = ureg_DECL_system_value(ureg, numSys, semName, 0); 11642b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul numSys++; 11652b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul sysInputs &= ~(1 << i); 11662b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11672b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11682b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul } 11692b5e1e5287df5cae218b6f83d2638853d250aff9Brian Paul 1170b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & (1 << PROGRAM_TEMPORARY)) { 1171b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* If temps are accessed with indirect addressing, declare temporaries 1172b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * in sequential order. Else, we declare them on demand elsewhere. 1173b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul */ 1174b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul for (i = 0; i < program->NumTemporaries; i++) { 1175b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */ 1176b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul t->temps[i] = ureg_DECL_temporary( t->ureg ); 1177b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1178b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul } 1179b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 11804295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit constants and immediates. Mesa uses a single index space 11814295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * for these, so we put all the translated regs in t->constants. 11825d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 11835d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 11844295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants = CALLOC( program->Parameters->NumParameters, 11854295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell sizeof t->constants[0] ); 1186e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz if (t->constants == NULL) { 1187e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz ret = PIPE_ERROR_OUT_OF_MEMORY; 11884295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell goto out; 1189e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz } 1190b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul 11915d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 11928978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 11938978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 11949f544394c1d059ce09c8bb2b5e11f5e871c7915fBrian Paul case PROGRAM_LOCAL_PARAM: 11958978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 11968978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 11978978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 11984295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 11995d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12004295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 1201b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul /* Emit immediates only when there's no indirect addressing of 1202b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * the const buffer. 1203b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul * FIXME: Be smarter and recognize param arrays: 12044295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * indirect addressing is only valid within the referenced 12054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell * array. 12064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 1208b3e3d0da586812c61f7bd3933a9a3c2511b8d55bBrian Paul if (program->IndirectRegisterFiles & PROGRAM_ANY_CONST) 12094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = ureg_DECL_constant( ureg, i ); 12104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell else 12114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->constants[i] = 12124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_DECL_immediate( ureg, 1213b30bbd7436bdb9727d3766ba9c07abd610e6dda8Bryan Cain (const float*) program->Parameters->ParameterValues[i], 12144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4 ); 12155d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 12165d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 12174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell break; 12188978627ad0e236796758d4912822b3428a649987Brian } 12198978627ad0e236796758d4912822b3428a649987Brian } 12208978627ad0e236796758d4912822b3428a649987Brian } 12218978627ad0e236796758d4912822b3428a649987Brian 1222814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 1223d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 1224814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 12254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->samplers[i] = ureg_DECL_sampler( ureg, i ); 1226814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1227814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 1228814d4ff83a515fe161cfb86c8b1492e2218051feBrian 12294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Emit each instruction in turn: 12304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < program->NumInstructions; i++) { 12324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell set_insn_start( t, ureg_get_instruction_number( ureg )); 12334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell compile_instruction( t, &program->Instructions[i] ); 12342c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger 12354e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul if (t->prevInstWrotePointSize && program->Id) { 12364e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul /* The previous instruction wrote to the (fake) vertex point size 12374e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * result register. Now we need to clamp that value to the min/max 12384e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * point size range, putting the result into the real point size 12394e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * register. 12404e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * Note that we can't do this easily at the end of program due to 12414e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul * possible early return. 12424e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul */ 12432c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger set_insn_start( t, ureg_get_instruction_number( ureg )); 12447d2db19fe581ede34dd1f396f1e0bd46ea5c3776Brian Paul ureg_MAX( t->ureg, 12454e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul ureg_writemask(t->outputs[t->pointSizeOutIndex], WRITEMASK_X), 12464e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul ureg_src(t->outputs[t->pointSizeOutIndex]), 12472c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger ureg_swizzle(t->pointSizeConst, 1,1,1,1)); 12484e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul ureg_MIN( t->ureg, ureg_writemask(t->pointSizeResult, WRITEMASK_X), 12494e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul ureg_src(t->outputs[t->pointSizeOutIndex]), 12502c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger ureg_swizzle(t->pointSizeConst, 2,2,2,2)); 12512c326e72664e65166c68b027b26aaf373f3be36dRoland Scheidegger } 12524e9c3bbc60c2dd491ca45d3a5e0b9e156b1bc225Brian Paul t->prevInstWrotePointSize = GL_FALSE; 1253401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul } 1254401cbd0d2365e5b2d371a2a01edf1cecca4a99ddBrian Paul 12554295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* Fix up all emitted labels: 12564295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell */ 12574295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell for (i = 0; i < t->labels_count; i++) { 12584295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell ureg_fixup_label( ureg, 12594295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->labels[i].token, 12604295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell t->insn[t->labels[i].branch_target] ); 12614295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell } 12624295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12634295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwellout: 12644295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->insn); 12654295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->labels); 12664295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell FREE(t->constants); 12674295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 12684295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell if (t->error) { 12694295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell debug_printf("%s: translate error flag set\n", __FUNCTION__); 1270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1272e5347ca94dd58351aa81ec09addd537f1dbc3e9dMarcin Slusarz return ret; 1273af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 1274734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1275734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca 1276734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca/** 127732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg * Tokens cannot be free with free otherwise the builtin gallium 1278734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca * malloc debugging will get confused. 1279734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca */ 1280734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecavoid 1281734a498ed47b35c9e8e7172d19465aca640fa323José Fonsecast_free_tokens(const struct tgsi_token *tokens) 1282734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca{ 1283734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca FREE((void *)tokens); 1284734a498ed47b35c9e8e7172d19465aca640fa323José Fonseca} 1285