st_mesa_to_tgsi.c revision f1188d4464c78bfa0cd114d9331de8fba70724ac
1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org/************************************************************************** 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * All Rights Reserved. 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Permission is hereby granted, free of charge, to any person obtaining a 721d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org * copy of this software and associated documentation files (the 85de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org * "Software"), to deal in the Software without restriction, including 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * the following conditions: 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org * The above copyright notice and this permission notice (including the 1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org * next paragraph) shall be included in all copies or substantial portions 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * of the Software. 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * 263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org **************************************************************************/ 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/* 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * \author 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Michal Krol, 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Keith Whitwell 32c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 34c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "pipe/p_compiler.h" 35c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "pipe/p_context.h" 363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "pipe/p_screen.h" 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "pipe/p_shader_tokens.h" 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "pipe/p_state.h" 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "tgsi/tgsi_ureg.h" 40d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "st_mesa_to_tgsi.h" 41d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "st_context.h" 42c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "program/prog_instruction.h" 43e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org#include "program/prog_parameter.h" 448432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_debug.h" 458432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_math.h" 468432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org#include "util/u_memory.h" 4741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org 493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define PROGRAM_ANY_CONST ((1 << PROGRAM_LOCAL_PARAM) | \ 503e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org (1 << PROGRAM_ENV_PARAM) | \ 51a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org (1 << PROGRAM_STATE_VAR) | \ 52c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (1 << PROGRAM_NAMED_PARAM) | \ 53c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (1 << PROGRAM_CONSTANT) | \ 54c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (1 << PROGRAM_UNIFORM)) 553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 56c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstruct label { 58c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned branch_target; 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned token; 60c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}; 61c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Intermediate state used during shader translation. 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 66c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstruct st_translate { 67c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_program *ureg; 68c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org struct ureg_dst temps[MAX_PROGRAM_TEMPS]; 70c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src *constants; 71c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_dst outputs[PIPE_MAX_SHADER_OUTPUTS]; 72c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src inputs[PIPE_MAX_SHADER_INPUTS]; 73c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_dst address[1]; 74c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src samplers[PIPE_MAX_SAMPLERS]; 75c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src systemValues[SYSTEM_VALUE_MAX]; 76e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 77c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const GLuint *inputMapping; 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLuint *outputMapping; 79c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 80ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org /* For every instruction that contains a label (eg CALL), keep 81ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * details so that we can go back afterwards and emit the correct 82a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org * tgsi instruction number for each label. 83c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct label *labels; 8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned labels_size; 8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned labels_count; 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org /* Keep a record of the tgsi instruction number that each mesa 89c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * instruction starts at, will be used to fix up labels after 90ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * translation. 917c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org */ 927c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org unsigned *insn; 937c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org unsigned insn_size; 94ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unsigned insn_count; 95ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 963e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org unsigned procType; /**< TGSI_PROCESSOR_VERTEX/FRAGMENT */ 97c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 98c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org boolean error; 995b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}; 100e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 101c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 1025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org/** Map Mesa's SYSTEM_VALUE_x to TGSI_SEMANTIC_x */ 10370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgstatic unsigned mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = { 10470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org TGSI_SEMANTIC_FACE, 10570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org TGSI_SEMANTIC_VERTEXID, 10670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org TGSI_SEMANTIC_INSTANCEID 10770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org}; 1085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org 1105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org/** 1115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org * Make note of a branch to a label in the TGSI code. 1125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org * After we've emitted all instructions, we'll go over the list 113e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * of labels built here and patch the TGSI code with the actual 1145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org * location of each label. 115c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */ 116c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic unsigned *get_label( struct st_translate *t, 117c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org unsigned branch_target ) 118c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{ 119c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org unsigned i; 120c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 121c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (t->labels_count + 1 >= t->labels_size) { 122c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->labels_size = 1 << (util_logbase2(t->labels_size) + 1); 123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org t->labels = realloc(t->labels, t->labels_size * sizeof t->labels[0]); 1243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (t->labels == NULL) { 125c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static unsigned dummy; 126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->error = TRUE; 127c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return &dummy; 128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 131c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org i = t->labels_count++; 132c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->labels[i].branch_target = branch_target; 133c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return &t->labels[i].token; 134c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 135c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 136c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 137c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/** 138c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Called prior to emitting the TGSI code for each Mesa instruction. 139c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Allocate additional space for instructions if needed. 140c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Update the insn[] array so the next Mesa instruction points to 141c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * the next TGSI instruction. 142c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */ 143c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic void set_insn_start( struct st_translate *t, 144c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org unsigned start ) 145dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org{ 146c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (t->insn_count + 1 >= t->insn_size) { 147c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->insn_size = 1 << (util_logbase2(t->insn_size) + 1); 148c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->insn = realloc(t->insn, t->insn_size * sizeof t->insn[0]); 149c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (t->insn == NULL) { 150dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org t->error = TRUE; 151c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return; 152c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 153c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org } 154c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 155c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->insn[t->insn_count++] = start; 156c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 157c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 158c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 159c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/** 160c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org * Map a Mesa dst register to a TGSI ureg_dst register. 161c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */ 162c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic struct ureg_dst 163c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgdst_register( struct st_translate *t, 164c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org gl_register_file file, 165c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org GLuint index ) 166c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{ 167c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org switch( file ) { 168c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_UNDEFINED: 169c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return ureg_dst_undef(); 170c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 171c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_TEMPORARY: 172c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (ureg_dst_is_undef(t->temps[index])) 173c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->temps[index] = ureg_DECL_temporary( t->ureg ); 174c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 175c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return t->temps[index]; 176c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 177dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org case PROGRAM_OUTPUT: 178c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (t->procType == TGSI_PROCESSOR_VERTEX) 179c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index < VERT_RESULT_MAX); 180248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org else if (t->procType == TGSI_PROCESSOR_FRAGMENT) 181c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index < FRAG_RESULT_MAX); 182dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org else 183c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index < GEOM_RESULT_MAX); 184c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 185c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(t->outputMapping[index] < Elements(t->outputs)); 186068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 187068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return t->outputs[t->outputMapping[index]]; 188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 189e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case PROGRAM_ADDRESS: 190fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org return t->address[index]; 191fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org 192fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org default: 193fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org debug_assert( 0 ); 194dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org return ureg_dst_undef(); 195dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org } 196c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org} 197c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 198068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 199c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/** 200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * Map a Mesa src register to a TGSI ureg_src register. 201c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */ 202c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgstatic struct ureg_src 203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comsrc_register( struct st_translate *t, 204c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com gl_register_file file, 205c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org GLint index ) 206e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{ 207e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org switch( file ) { 2083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case PROGRAM_UNDEFINED: 2093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return ureg_src_undef(); 210c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 211c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_TEMPORARY: 212c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index >= 0); 213c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index < Elements(t->temps)); 214c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org if (ureg_dst_is_undef(t->temps[index])) 215c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org t->temps[index] = ureg_DECL_temporary( t->ureg ); 216dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org return ureg_src(t->temps[index]); 217fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org 218c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_NAMED_PARAM: 219c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_ENV_PARAM: 220c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_LOCAL_PARAM: 221c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_UNIFORM: 222c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(index >= 0); 223068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return t->constants[index]; 2242c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org case PROGRAM_STATE_VAR: 225068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case PROGRAM_CONSTANT: /* ie, immediate */ 226068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org if (index < 0) 227068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return ureg_DECL_constant( t->ureg, 0 ); 228068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org else 229068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return t->constants[index]; 230068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 231068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case PROGRAM_INPUT: 232068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org assert(t->inputMapping[index] < Elements(t->inputs)); 233c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return t->inputs[t->inputMapping[index]]; 234e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 235c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_OUTPUT: 236c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org assert(t->outputMapping[index] < Elements(t->outputs)); 237c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return ureg_src(t->outputs[t->outputMapping[index]]); /* not needed? */ 238c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 239c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org case PROGRAM_ADDRESS: 240c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return ureg_src(t->address[index]); 2413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 2423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case PROGRAM_SYSTEM_VALUE: 2433e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org assert(index < Elements(t->systemValues)); 2443e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return t->systemValues[index]; 245c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 246c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org default: 247c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org debug_assert( 0 ); 248c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org return ureg_src_undef(); 24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 25143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2527c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 2537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org/** 2547c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org * Map mesa texture target to TGSI texture target. 255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */ 256ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgunsigned 2572c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgst_translate_texture_target( GLuint textarget, 2582c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org GLboolean shadow ) 2593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org{ 26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (shadow) { 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch( textarget ) { 262f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com case TEXTURE_1D_INDEX: return TGSI_TEXTURE_SHADOW1D; 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_2D_INDEX: return TGSI_TEXTURE_SHADOW2D; 26401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_SHADOWRECT; 265e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW1D_ARRAY; 26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_SHADOW2D_ARRAY; 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_SHADOWCUBE; 268145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com default: break; 269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch( textarget ) { 27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_1D_INDEX: return TGSI_TEXTURE_1D; 27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_2D_INDEX: return TGSI_TEXTURE_2D; 275c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case TEXTURE_3D_INDEX: return TGSI_TEXTURE_3D; 276e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case TEXTURE_CUBE_INDEX: return TGSI_TEXTURE_CUBE; 277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case TEXTURE_RECT_INDEX: return TGSI_TEXTURE_RECT; 278e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case TEXTURE_1D_ARRAY_INDEX: return TGSI_TEXTURE_1D_ARRAY; 27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEXTURE_2D_ARRAY_INDEX: return TGSI_TEXTURE_2D_ARRAY; 28001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org case TEXTURE_EXTERNAL_INDEX: return TGSI_TEXTURE_2D; 28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen debug_assert( 0 ); 28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TGSI_TEXTURE_1D; 2843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 2852c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org} 2865de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 2875de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 2882c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org/** 2892c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org * Create a TGSI ureg_dst register from a Mesa dest register. 2902c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org */ 2912c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgstatic struct ureg_dst 2922c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgtranslate_dst( struct st_translate *t, 2932c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org const struct prog_dst_register *DstReg, 2942c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org boolean saturate, 2955de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org boolean clamp_color) 296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{ 297c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_dst dst = dst_register( t, 298e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DstReg->File, 299c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DstReg->Index ); 300e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 301c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com dst = ureg_writemask( dst, 302c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DstReg->WriteMask ); 303c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 30401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (saturate) 30501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org dst = ureg_saturate( dst ); 306e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org else if (clamp_color && DstReg->File == PROGRAM_OUTPUT) { 307c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Clamp colors for ARB_color_buffer_float. */ 308c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org switch (t->procType) { 309c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case TGSI_PROCESSOR_VERTEX: 310e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org /* XXX if the geometry shader is present, this must be done there 3111845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * instead of here. */ 3121845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (DstReg->Index == VERT_RESULT_COL0 || 3133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org DstReg->Index == VERT_RESULT_COL1 || 3141845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org DstReg->Index == VERT_RESULT_BFC0 || 315c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com DstReg->Index == VERT_RESULT_BFC1) { 31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen dst = ureg_saturate(dst); 31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 3193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 320c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case TGSI_PROCESSOR_FRAGMENT: 321c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (DstReg->Index >= FRAG_RESULT_COLOR) { 322e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org dst = ureg_saturate(dst); 323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com break; 325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 327c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 328e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (DstReg->RelAddr) 329c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com dst = ureg_dst_indirect( dst, ureg_src(t->address[0]) ); 330c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return dst; 3321845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org} 333e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 334c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 335c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org/** 3363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * Create a TGSI ureg_src register from a Mesa src register. 3371845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org */ 3385de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgstatic struct ureg_src 339c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comtranslate_src( struct st_translate *t, 340e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org const struct prog_src_register *SrcReg ) 341c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org{ 342c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3443cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org if (t->procType == TGSI_PROCESSOR_GEOMETRY && SrcReg->HasIndex2) { 3453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org src = src_register( t, SrcReg->File, SrcReg->Index2 ); 3465de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (SrcReg->RelAddr2) 3475de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org src = ureg_src_dimension_indirect( src, ureg_src(t->address[0]), 348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com SrcReg->Index); 349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com else 350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com src = ureg_src_dimension( src, SrcReg->Index); 3513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 3523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 353c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com src = ureg_swizzle( src, 354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GET_SWZ( SrcReg->Swizzle, 0 ) & 0x3, 35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GET_SWZ( SrcReg->Swizzle, 1 ) & 0x3, 35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GET_SWZ( SrcReg->Swizzle, 2 ) & 0x3, 35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GET_SWZ( SrcReg->Swizzle, 3 ) & 0x3); 3585de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 3595de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (SrcReg->Negate == NEGATE_XYZW) 3605de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org src = ureg_negate(src); 361e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 3625de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (SrcReg->Abs) 363068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org src = ureg_abs(src); 364c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 365ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org if (SrcReg->RelAddr) { 366ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org src = ureg_src_indirect( src, ureg_src(t->address[0])); 3673e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (SrcReg->File != PROGRAM_INPUT && 368068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org SrcReg->File != PROGRAM_OUTPUT) { 3692c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org /* If SrcReg->Index was negative, it was set to zero in 3702c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org * src_register(). Reassign it now. But don't do this 371ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * for input/output regs since they get remapped while 3722c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org * const buffers don't. 3732c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org */ 3742c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org src.Index = SrcReg->Index; 3752c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org } 376ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 3773cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 378ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return src; 3792c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org} 3802c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org 3812c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org 3822c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgstatic struct ureg_src swizzle_4v( struct ureg_src src, 3832c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org const unsigned *swz ) 3842c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org{ 3852c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org return ureg_swizzle( src, swz[0], swz[1], swz[2], swz[3] ); 386c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 387c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 3883cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 3893cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org/** 3903cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org * Translate a SWZ instruction into a MOV, MUL or MAD instruction. EG: 391c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * 392c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * SWZ dst, src.x-y10 393c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * 394c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * becomes: 3953cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org * 3963cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org * MAD dst {1,-1,0,0}, src.xyxx, {0,0,1,0} 3973cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org */ 3983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgstatic void emit_swz( struct st_translate *t, 399c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_dst dst, 400ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org const struct prog_src_register *SrcReg ) 401ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org{ 402ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org struct ureg_program *ureg = t->ureg; 4033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org struct ureg_src src = src_register( t, SrcReg->File, SrcReg->Index ); 4043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 4053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org unsigned negate_mask = SrcReg->Negate; 406c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 407c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned one_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ONE) << 0 | 408c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ONE) << 1 | 409c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ONE) << 2 | 410c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ONE) << 3); 411c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 412e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org unsigned zero_mask = ((GET_SWZ(SrcReg->Swizzle, 0) == SWIZZLE_ZERO) << 0 | 413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 1) == SWIZZLE_ZERO) << 1 | 414c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 2) == SWIZZLE_ZERO) << 2 | 415c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (GET_SWZ(SrcReg->Swizzle, 3) == SWIZZLE_ZERO) << 3); 416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 4173cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org unsigned negative_one_mask = one_mask & negate_mask; 4183cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org unsigned positive_one_mask = one_mask & ~negate_mask; 4193cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 420c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct ureg_src imm; 421c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned i; 422c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned mul_swizzle[4] = {0,0,0,0}; 423c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned add_swizzle[4] = {0,0,0,0}; 424c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned src_swizzle[4] = {0,0,0,0}; 425c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com boolean need_add = FALSE; 426c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com boolean need_mul = FALSE; 4273cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org 4283cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org if (dst.WriteMask == 0) 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 4303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 4313e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org /* Is this just a MOV? 4323e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org */ 433c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (zero_mask == 0 && 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen one_mask == 0 && 435e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org (negate_mask == 0 || negate_mask == TGSI_WRITEMASK_XYZW)) 436c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 437c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ureg_MOV( ureg, dst, translate_src( t, SrcReg )); 438c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return; 439ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 440ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 441c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_ZERO 0 442c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_ONE 1 443c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define IMM_NEG_ONE 2 444c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 445c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com imm = ureg_imm3f( ureg, 0, 1, -1 ); 44633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 447fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org for (i = 0; i < 4; i++) { 44872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org unsigned bit = 1 << i; 449474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (dst.WriteMask & bit) { 451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (positive_one_mask & bit) { 452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org mul_swizzle[i] = IMM_ZERO; 453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org add_swizzle[i] = IMM_ONE; 454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org need_add = TRUE; 455c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 456c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com else if (negative_one_mask & bit) { 457c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mul_swizzle[i] = IMM_ZERO; 458a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org add_swizzle[i] = IMM_NEG_ONE; 459c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com need_add = TRUE; 460e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 461e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org else if (zero_mask & bit) { 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mul_swizzle[i] = IMM_ZERO; 463ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org add_swizzle[i] = IMM_ZERO; 464ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org need_add = TRUE; 465ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else { 467ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org add_swizzle[i] = IMM_ZERO; 468ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org src_swizzle[i] = GET_SWZ(SrcReg->Swizzle, i); 469ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org need_mul = TRUE; 470c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (negate_mask & bit) { 471c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com mul_swizzle[i] = IMM_NEG_ONE; 47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else { 47443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen mul_swizzle[i] = IMM_ONE; 475068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org } 476068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org } 4773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 4783e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 479068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 4805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (need_mul && need_add) { 4815de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org ureg_MAD( ureg, 482068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org dst, 4835de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org swizzle_4v( src, src_swizzle ), 484068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org swizzle_4v( imm, mul_swizzle ), 485068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org swizzle_4v( imm, add_swizzle ) ); 486068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org } 487e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org else if (need_mul) { 488068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org ureg_MUL( ureg, 489068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org dst, 490068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org swizzle_4v( src, src_swizzle ), 491068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org swizzle_4v( imm, mul_swizzle ) ); 4923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 4933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org else if (need_add) { 4943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org ureg_MOV( ureg, 4953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org dst, 496068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org swizzle_4v( imm, add_swizzle ) ); 497068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org } 498068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org else { 499068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org debug_assert(0); 500e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 5011845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 502068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_ZERO 503068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_ONE 504068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org#undef IMM_NEG_ONE 505068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org} 506068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 507068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 508068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org/** 509e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * Negate the value of DDY to match GL semantics where (0,0) is the 510068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * lower-left corner of the window. 511068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * Note that the GL_ARB_fragment_coord_conventions extension will 512068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * effect this someday. 513068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org */ 514068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic void emit_ddy( struct st_translate *t, 515068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org struct ureg_dst dst, 516068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org const struct prog_src_register *SrcReg ) 517e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org{ 5181845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org struct ureg_program *ureg = t->ureg; 519068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org struct ureg_src src = translate_src( t, SrcReg ); 520068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org src = ureg_negate( src ); 521068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org ureg_DDY( ureg, dst, src ); 522068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org} 523068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 524068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 525068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 526068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgstatic unsigned 527068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.orgtranslate_opcode( unsigned op ) 528c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{ 529f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org switch( op ) { 5301e71c4d02b6ae995c57bf1f7f3ce99a4ef88eba5mstarzinger@chromium.org case OPCODE_ARL: 531f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return TGSI_OPCODE_ARL; 532f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case OPCODE_ABS: 533f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return TGSI_OPCODE_ABS; 534f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case OPCODE_ADD: 535c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_ADD; 53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case OPCODE_BGNLOOP: 53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TGSI_OPCODE_BGNLOOP; 538c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_BGNSUB: 539f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return TGSI_OPCODE_BGNSUB; 540f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case OPCODE_BRA: 541f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return TGSI_OPCODE_BRA; 542f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case OPCODE_BRK: 543f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return TGSI_OPCODE_BRK; 544f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org case OPCODE_CAL: 545c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_CAL; 546717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org case OPCODE_CMP: 547717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org return TGSI_OPCODE_CMP; 548068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_CONT: 549068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_CONT; 550c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_COS: 551c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_COS; 552e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case OPCODE_DDX: 553068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_DDX; 554ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org case OPCODE_DDY: 555c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_DDY; 556c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_DP2: 5575de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return TGSI_OPCODE_DP2; 558ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org case OPCODE_DP2A: 559ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_DP2A; 560c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org case OPCODE_DP3: 561068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_DP3; 562068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_DP4: 563068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_DP4; 564068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_DPH: 565068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_DPH; 566068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_DST: 567068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_DST; 568068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_ELSE: 569068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_ELSE; 570068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_EMIT_VERTEX: 571068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_EMIT; 572068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_END_PRIMITIVE: 573068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_ENDPRIM; 574068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_ENDIF: 575068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_ENDIF; 576068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_ENDLOOP: 577068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_ENDLOOP; 578068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_ENDSUB: 579068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_ENDSUB; 580068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_EX2: 581068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_EX2; 582068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_EXP: 583068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_EXP; 584068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_FLR: 585068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_FLR; 586068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_FRC: 587068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_FRC; 588068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_IF: 589068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_IF; 590068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_TRUNC: 591c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_TRUNC; 592068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_KIL: 5933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_KIL; 5943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_KIL_NV: 595ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_KILP; 596c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_LG2: 597c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_LG2; 5983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_LOG: 5993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_LOG; 600c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_LIT: 601c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_LIT; 602717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org case OPCODE_LRP: 603068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_LRP; 604068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_MAD: 6055de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return TGSI_OPCODE_MAD; 606c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_MAX: 607c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_MAX; 6081845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org case OPCODE_MIN: 6093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_MIN; 610068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_MOV: 6113e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_MOV; 6123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_MUL: 613c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_MUL; 614c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_NOP: 615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_NOP; 616c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_NRM3: 617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_NRM; 6183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_NRM4: 6193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_NRM4; 620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_POW: 621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_POW; 622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_RCP: 623c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_RCP; 624c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_RET: 625ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_RET; 626c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org case OPCODE_RSQ: 627c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return TGSI_OPCODE_RSQ; 628068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_SCS: 629c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return TGSI_OPCODE_SCS; 630c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org case OPCODE_SEQ: 631ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_SEQ; 632068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_SGE: 633c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_SGE; 634068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_SGT: 6355de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return TGSI_OPCODE_SGT; 6363e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_SIN: 6373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_SIN; 6383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_SLE: 6393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_SLE; 6403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_SLT: 6413e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_SLT; 642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_SNE: 643c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_SNE; 64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case OPCODE_SSG: 645c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return TGSI_OPCODE_SSG; 646068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_SUB: 647c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org return TGSI_OPCODE_SUB; 648ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org case OPCODE_TEX: 649ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_TEX; 650068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_TXB: 651ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org return TGSI_OPCODE_TXB; 652ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org case OPCODE_TXD: 653068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org return TGSI_OPCODE_TXD; 654068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org case OPCODE_TXL: 6553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_TXL; 6563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_TXP: 657c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_TXP; 658c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_XPD: 659c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_XPD; 660c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_END: 661c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return TGSI_OPCODE_END; 662717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org default: 663717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org debug_assert( 0 ); 6643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return TGSI_OPCODE_NOP; 6653e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 666c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 667c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 668c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void 670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgcompile_instruction( 671e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org struct st_translate *t, 672e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org const struct prog_instruction *inst, 673e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org boolean clamp_dst_color_output) 674e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 675e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org struct ureg_program *ureg = t->ureg; 676e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GLuint i; 677e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org struct ureg_dst dst[1] = { { 0 } }; 678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org struct ureg_src src[4]; 679e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org unsigned num_dst; 6803e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org unsigned num_src; 681c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 682068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org num_dst = _mesa_num_inst_dst_regs( inst->Opcode ); 683c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com num_src = _mesa_num_inst_src_regs( inst->Opcode ); 684c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 685c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (num_dst) 686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com dst[0] = translate_dst( t, 68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen &inst->DstReg, 68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inst->SaturateMode, 68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen clamp_dst_color_output); 690c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 6917d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org for (i = 0; i < num_src; i++) 6927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org src[i] = translate_src( t, &inst->SrcReg[i] ); 6933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 6943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org switch( inst->Opcode ) { 695c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_SWZ: 696c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_swz( t, dst[0], &inst->SrcReg[0] ); 697c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return; 698c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 699c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_BGNLOOP: 700c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_CAL: 701c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_ELSE: 702e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org case OPCODE_ENDLOOP: 703c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_IF: 704c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com debug_assert(num_dst == 0); 705c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ureg_label_insn( ureg, 70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen translate_opcode( inst->Opcode ), 70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src, num_src, 7083e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org get_label( t, inst->BranchTarget )); 7093e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return; 7102c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 711c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_TEX: 712c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_TXB: 713c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_TXD: 7145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org case OPCODE_TXL: 715c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case OPCODE_TXP: 716c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com src[num_src++] = t->samplers[inst->TexSrcUnit]; 717c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ureg_tex_insn( ureg, 7183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org translate_opcode( inst->Opcode ), 719c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com dst, num_dst, 72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st_translate_texture_target( inst->TexSrcTarget, 72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen inst->TexShadow ), 72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL, 0, 7233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org src, num_src ); 7249258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return; 7252c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 726c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org case OPCODE_SCS: 727c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY ); 728c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org ureg_insn( ureg, 729c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org translate_opcode( inst->Opcode ), 730c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org dst, num_dst, 7317979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org src, num_src ); 73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case OPCODE_XPD: 735b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XYZ ); 736add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org ureg_insn( ureg, 7375de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org translate_opcode( inst->Opcode ), 7387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org dst, num_dst, 739add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org src, num_src ); 740add848f7b25aaacf2ebb523696c074d8be15e215ager@chromium.org break; 74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 742b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case OPCODE_NOISE1: 743b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case OPCODE_NOISE2: 744b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case OPCODE_NOISE3: 745b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case OPCODE_NOISE4: 746b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org /* At some point, a motivated person could add a better 747b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * implementation of noise. Currently not even the nvidia 748b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * binary drivers do anything more than this. In any case, the 749b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * place to do this is in the GL state tracker, not the poor 750c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * driver. 751c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 752c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ureg_MOV( ureg, dst[0], ureg_imm1f(ureg, 0.5) ); 753c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com break; 754c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 7553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case OPCODE_DDY: 756c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com emit_ddy( t, dst[0], &inst->SrcReg[0] ); 757c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com break; 758c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ureg_insn( ureg, 76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen translate_opcode( inst->Opcode ), 76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen dst, num_dst, 763c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com src, num_src ); 764c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com break; 765c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 766c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 768c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Emit the TGSI instructions for inverting and adjusting WPOS. 77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * This code is unavoidable because it also depends on whether 772c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM). 7733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org */ 774c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic void 775e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgemit_wpos_adjustment( struct st_translate *t, 776c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const struct gl_program *program, 777e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org boolean invert, 778c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GLfloat adjX, GLfloat adjY[2]) 779013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org{ 780013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org struct ureg_program *ureg = t->ureg; 781013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org 782c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Fragment program uses fragment position input. 7833e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * Need to replace instances of INPUT[WPOS] with temp T 784e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * where T = INPUT[WPOS] by y is inverted. 785c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 786c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static const gl_state_index wposTransformState[STATE_LENGTH] 787c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM, 0, 0, 0 }; 788c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 789c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* XXX: note we are modifying the incoming shader here! Need to 79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * do this before emitting the constant decls below, or this 791c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * will be missed: 79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen unsigned wposTransConst = _mesa_add_state_reference(program->Parameters, 79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen wposTransformState); 79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst ); 79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg ); 7983e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]]; 7993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 8003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org /* First, apply the coordinate shift: */ 8013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (adjX || adjY[0] || adjY[1]) { 8023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (adjY[0] != adjY[1]) { 8033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org /* Adjust the y coordinate by adjY[1] or adjY[0] respectively 80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * depending on whether inversion is actually going to be applied 80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * or not, which is determined by testing against the inversion 80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * state variable used below, which will be either +1 or -1. 807ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 808ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org struct ureg_dst adj_temp = ureg_DECL_temporary(ureg); 809ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 810ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_CMP(ureg, adj_temp, 8115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org ureg_scalar(wpostrans, invert ? 2 : 0), 812ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f), 813ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_imm4f(ureg, adjX, adjY[1], 0.0f, 0.0f)); 814ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_ADD(ureg, wpos_temp, wpos_input, ureg_src(adj_temp)); 815ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } else { 8165de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org ureg_ADD(ureg, wpos_temp, wpos_input, 817ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_imm4f(ureg, adjX, adjY[0], 0.0f, 0.0f)); 818ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 819ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org wpos_input = ureg_src(wpos_temp); 820ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } else { 821ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org /* MOV wpos_temp, input[wpos] 822ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 823ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_MOV( ureg, wpos_temp, wpos_input ); 824ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 825ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 826ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be 827ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * inversion/identity, or the other way around if we're drawing to an FBO. 828ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 829ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org if (invert) { 8305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org /* MAD wpos_temp.y, wpos_input, wpostrans.xxxx, wpostrans.yyyy 831ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 832ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_MAD( ureg, 833ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 8345de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org wpos_input, 8353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org ureg_scalar(wpostrans, 0), 836068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org ureg_scalar(wpostrans, 1)); 837ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } else { 8383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org /* MAD wpos_temp.y, wpos_input, wpostrans.zzzz, wpostrans.wwww 839ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 840ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_MAD( ureg, 841ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_writemask(wpos_temp, TGSI_WRITEMASK_Y ), 842ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org wpos_input, 843ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_scalar(wpostrans, 2), 844ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org ureg_scalar(wpostrans, 3)); 845ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 846ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 847ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org /* Use wpos_temp as position input from here on: 848ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 8493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp); 850ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org} 851ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 852ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org 853068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org/** 854068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * Emit fragment position/ooordinate code. 855ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org */ 856ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgstatic void 857ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgemit_wpos(struct st_context *st, 8583e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org struct st_translate *t, 8593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org const struct gl_program *program, 8603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org struct ureg_program *ureg) 861ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org{ 862ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org const struct gl_fragment_program *fp = 863ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org (const struct gl_fragment_program *) program; 864ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org struct pipe_screen *pscreen = st->pipe->screen; 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GLfloat adjX = 0.0f; 8662efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org GLfloat adjY[2] = { 0.0f, 0.0f }; 8672efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org boolean invert = FALSE; 8682efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org 8692efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org /* Query the pixel center conventions supported by the pipe driver and set 8702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * adjX, adjY to help out if it cannot handle the requested one internally. 8712efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * 8722efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * The bias of the y-coordinate depends on whether y-inversion takes place 8732efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * (adjY[1]) or not (adjY[0]), which is in turn dependent on whether we are 8742efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * drawing to an FBO (causes additional inversion), and whether the the pipe 8752efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * driver origin and the requested origin differ (the latter condition is 876e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org * stored in the 'invert' variable). 8772efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * 87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * For height = 100 (i = integer, h = half-integer, l = lower, u = upper): 87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 880f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org * center shift only: 8819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org * i -> h: +0.5 882c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * h -> i: -0.5 883c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * 8843484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * inversion only: 885f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org * l,i -> u,i: ( 0.0 + 1.0) * -1 + 100 = 99 886f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org * l,h -> u,h: ( 0.5 + 0.0) * -1 + 100 = 99.5 887ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * u,i -> l,i: (99.0 + 1.0) * -1 + 100 = 0 8883e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * u,h -> l,h: (99.5 + 0.0) * -1 + 100 = 0.5 889ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * 890ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * inversion and center shift: 891ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org * l,i -> u,h: ( 0.0 + 0.5) * -1 + 100 = 99.5 8923e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * l,h -> u,i: ( 0.5 + 0.5) * -1 + 100 = 99 8933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * u,i -> l,h: (99.0 + 0.5) * -1 + 100 = 0.5 89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * u,h -> l,i: (99.5 + 0.5) * -1 + 100 = 0 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 896ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org if (fp->OriginUpperLeft) { 897ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org /* Fragment shader wants origin in upper-left */ 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) { 899c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* the driver supports upper-left origin */ 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* the driver supports lower-left origin, need to invert Y */ 9033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen invert = TRUE; 90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 9063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org else 90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(0); 90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else { 910c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Fragment shader wants origin in lower-left */ 911c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) 912c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* the driver supports lower-left origin */ 91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); 914c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) 915c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* the driver supports upper-left origin, need to invert Y */ 916c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com invert = TRUE; 91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else 91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(0); 91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 92072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 9215de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (fp->PixelCenterInteger) { 922ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org /* Fragment shader wants pixel center integer */ 92372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 92472204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org /* the driver supports pixel center integer */ 92572204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org adjY[1] = 1.0f; 92672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 92772204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org } 92872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 92972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org /* the driver supports pixel center half integer, need to bias X,Y */ 93072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org adjX = -0.5f; 93172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org adjY[0] = -0.5f; 932b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org adjY[1] = 0.5f; 933a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 934e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org else 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(0); 936b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org } 93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else { 93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* Fragment shader wants pixel center half integer */ 939c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { 940c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* the driver supports pixel center half integer */ 941c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { 94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* the driver supports pixel center integer, need to bias X,Y */ 94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen adjX = adjY[0] = adjY[1] = 0.5f; 94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); 9467276f14ca716596e0a0d17539516370c1f453847kasper.lund } 947b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org else 94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(0); 94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 950e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 951c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* we invert after adjustment so that we avoid the MOV to temporary, 952e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * and reuse the adjustment ADD instead */ 95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen emit_wpos_adjustment(t, program, invert, adjX, adjY); 954c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 956e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 958c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * OpenGL's fragment gl_FrontFace input is 1 for front-facing, 0 for back. 959c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * TGSI uses +1 for front, -1 for back. 9607276f14ca716596e0a0d17539516370c1f453847kasper.lund * This function converts the TGSI value to the GL value. Simply clamping/ 961c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * saturating the value to [0,1] does the job. 9627276f14ca716596e0a0d17539516370c1f453847kasper.lund */ 9637276f14ca716596e0a0d17539516370c1f453847kasper.lundstatic void 9646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgemit_face_var( struct st_translate *t, 965c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com const struct gl_program *program ) 966c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com{ 9677276f14ca716596e0a0d17539516370c1f453847kasper.lund struct ureg_program *ureg = t->ureg; 9687d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org struct ureg_dst face_temp = ureg_DECL_temporary( ureg ); 9697d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org struct ureg_src face_input = t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]]; 9707d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 9717d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org /* MOV_SAT face_temp, input[face] 9727d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org */ 9737d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org face_temp = ureg_saturate( face_temp ); 9743e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org ureg_MOV( ureg, face_temp, face_input ); 9753e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 976c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Use face_temp as face input from here on: 97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 978e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org t->inputs[t->inputMapping[FRAG_ATTRIB_FACE]] = ureg_src(face_temp); 97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 980c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void 98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenemit_edgeflags( struct st_translate *t, 98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const struct gl_program *program ) 98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 9867d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org struct ureg_program *ureg = t->ureg; 987e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org struct ureg_dst edge_dst = t->outputs[t->outputMapping[VERT_RESULT_EDGE]]; 988e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org struct ureg_src edge_src = t->inputs[t->inputMapping[VERT_ATTRIB_EDGEFLAG]]; 989e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 9907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org ureg_MOV( ureg, edge_dst, edge_src ); 9917d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org} 9927d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org 993e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org 9947d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org/** 9957d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * Translate Mesa program to TGSI format. 9967d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param program the program to translate 9977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param numInputs number of input registers used 9987d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputMapping maps Mesa fragment program inputs to TGSI generic 99956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org * input indexes 10007d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputSemanticName the TGSI_SEMANTIC flag for each input 10017d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param inputSemanticIndex the semantic index (ex: which texcoord) for 100256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org * each input 10037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 100441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org * \param numOutputs number of output registers used 1005b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org * \param outputMapping maps Mesa fragment program outputs to TGSI 100641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org * generic outputs 10071845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * \param outputSemanticName the TGSI_SEMANTIC flag for each output 10081845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * \param outputSemanticIndex the semantic index (ex: which texcoord) for 10091845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org * each output 1010f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org * 1011f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org * \return PIPE_OK or PIPE_ERROR_OUT_OF_MEMORY 1012f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org */ 10137d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgenum pipe_error 10147d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.orgst_translate_mesa_program( 1015e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org struct gl_context *ctx, 1016e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org uint procType, 1017e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org struct ureg_program *ureg, 10187d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const struct gl_program *program, 10197d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org GLuint numInputs, 10201845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org const GLuint inputMapping[], 10217d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const ubyte inputSemanticName[], 10227d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const ubyte inputSemanticIndex[], 10237d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const GLuint interpMode[], 10247d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org GLuint numOutputs, 10257d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const GLuint outputMapping[], 10267d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const ubyte outputSemanticName[], 10277d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org const ubyte outputSemanticIndex[], 102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen boolean passthrough_edgeflags, 1029c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com boolean clamp_color) 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 1031c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com struct st_translate translate, *t; 1032c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned i; 103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen enum pipe_error ret = PIPE_OK; 103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(numInputs <= Elements(t->inputs)); 103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen assert(numOutputs <= Elements(t->outputs)); 103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen t = &translate; 1039e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org memset(t, 0, sizeof *t); 1040e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1041e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t->procType = procType; 1042e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t->inputMapping = inputMapping; 1043e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t->outputMapping = outputMapping; 1044e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t->ureg = ureg; 1045e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1046e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /*_mesa_print_program(program);*/ 1047e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1048e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* 1049e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * Declare input attributes. 1050e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 1051e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (procType == TGSI_PROCESSOR_FRAGMENT) { 1052e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (i = 0; i < numInputs; i++) { 1053e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (program->InputFlags[0] & PROG_PARAM_BIT_CYL_WRAP) { 1054e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org t->inputs[i] = ureg_DECL_fs_input_cyl(ureg, 1055e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org inputSemanticName[i], 1056057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org inputSemanticIndex[i], 1057057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org interpMode[i], 1058057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org TGSI_CYLINDRICAL_WRAP_X); 1059057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org } 1060057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org else { 10613484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org t->inputs[i] = ureg_DECL_fs_input(ureg, 1062e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org inputSemanticName[i], 1063e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org inputSemanticIndex[i], 10642c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org interpMode[i]); 10652c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 10662c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org } 10672c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org 1068e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org if (program->InputsRead & FRAG_BIT_WPOS) { 10692efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org /* Must do this after setting up t->inputs, and before 10702efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org * emitting constant references, below: 10712c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org */ 10722c4567981e65b51f161283f8635e110a73629c9ddanno@chromium.org emit_wpos(st_context(ctx), t, program, ureg); 10733484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org } 10743484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org 10753484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org if (program->InputsRead & FRAG_BIT_FACE) { 10763484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org emit_face_var( t, program ); 10773484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org } 1078e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 10796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org /* 1080ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org * Declare output attributes. 1081ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org */ 1082ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org for (i = 0; i < numOutputs; i++) { 108327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org switch (outputSemanticName[i]) { 108427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org case TGSI_SEMANTIC_POSITION: 10853484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org t->outputs[i] = ureg_DECL_output( ureg, 1086c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com TGSI_SEMANTIC_POSITION, /* Z / Depth */ 1087c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com outputSemanticIndex[i] ); 1088c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1089c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->outputs[i] = ureg_writemask( t->outputs[i], 109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TGSI_WRITEMASK_Z ); 109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 1092e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case TGSI_SEMANTIC_STENCIL: 1093ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org t->outputs[i] = ureg_DECL_output( ureg, 109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TGSI_SEMANTIC_STENCIL, /* Stencil */ 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen outputSemanticIndex[i] ); 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen t->outputs[i] = ureg_writemask( t->outputs[i], 1097f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org TGSI_WRITEMASK_Y ); 1098f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org break; 1099f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org case TGSI_SEMANTIC_COLOR: 1100f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org t->outputs[i] = ureg_DECL_output( ureg, 1101f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org TGSI_SEMANTIC_COLOR, 1102f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org outputSemanticIndex[i] ); 1103f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org break; 1104f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org default: 1105e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org debug_assert(0); 1106e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org return 0; 1107e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 1108f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org } 1109f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org } 1110f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org else if (procType == TGSI_PROCESSOR_GEOMETRY) { 1111f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org for (i = 0; i < numInputs; i++) { 1112f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org t->inputs[i] = ureg_DECL_gs_input(ureg, 1113f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org i, 1114f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org inputSemanticName[i], 1115f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org inputSemanticIndex[i]); 1116f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org } 1117f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org 1118f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org for (i = 0; i < numOutputs; i++) { 1119f116736e5fdd9974b8a15b5832b7022fe2e96634machenbach@chromium.org t->outputs[i] = ureg_DECL_output( ureg, 112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen outputSemanticName[i], 11213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org outputSemanticIndex[i] ); 112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1124c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org else { 1125defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org assert(procType == TGSI_PROCESSOR_VERTEX); 1126c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1127ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org for (i = 0; i < numInputs; i++) { 1128c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->inputs[i] = ureg_DECL_vs_input(ureg, i); 1129c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1130c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1131c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org for (i = 0; i < numOutputs; i++) { 1132ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org t->outputs[i] = ureg_DECL_output( ureg, 1133c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com outputSemanticName[i], 1134c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com outputSemanticIndex[i] ); 1135a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 1136c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (passthrough_edgeflags) 1137ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org emit_edgeflags( t, program ); 1138ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org } 1139c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1140c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Declare address register. 1141c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org */ 1142c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (program->NumAddressRegs > 0) { 1143c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com debug_assert( program->NumAddressRegs == 1 ); 1144c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->address[0] = ureg_DECL_address( ureg ); 1145c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1146c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 1147c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org /* Declare misc input registers 1148c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 1149c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com { 1150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com GLbitfield sysInputs = program->SystemValuesRead; 1151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned numSys = 0; 1152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (i = 0; sysInputs; i++) { 1153ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org if (sysInputs & (1 << i)) { 1154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned semName = mesa_sysval_to_semantic[i]; 1155c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->systemValues[i] = ureg_DECL_system_value(ureg, numSys, semName, 0); 1156c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (semName == TGSI_SEMANTIC_INSTANCEID || 1157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com semName == TGSI_SEMANTIC_VERTEXID) { 1158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* From Gallium perspective, these system values are always 1159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * integer, and require native integer support. However, if 1160defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org * native integer is supported on the vertex stage but not the 1161defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org * pixel stage (e.g, i915g + draw), Mesa will generate IR that 1162c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org * assumes these system values are floats. To resolve the 1163c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * inconsistency, we insert a U2F. 1164defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org */ 1165c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org struct st_context *st = st_context(ctx); 1166defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org struct pipe_screen *pscreen = st->pipe->screen; 1167c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org assert(procType == TGSI_PROCESSOR_VERTEX); 1168defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org assert(pscreen->get_shader_param(pscreen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_INTEGERS)); 1169c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org if (!ctx->Const.NativeIntegers) { 1170defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org struct ureg_dst temp = ureg_DECL_local_temporary(t->ureg); 117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ureg_U2F( t->ureg, ureg_writemask(temp, TGSI_WRITEMASK_X), t->systemValues[i]); 117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen t->systemValues[i] = ureg_scalar(ureg_src(temp), 0); 117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 11745a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 1175f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com numSys++; 1176c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com sysInputs &= ~(1 << i); 1177f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com } 11785a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 11795a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 11805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1181ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (program->IndirectRegisterFiles & (1 << PROGRAM_TEMPORARY)) { 1182c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* If temps are accessed with indirect addressing, declare temporaries 1183c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * in sequential order. Else, we declare them on demand elsewhere. 11843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org */ 11853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org for (i = 0; i < program->NumTemporaries; i++) { 1186c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* XXX use TGSI_FILE_TEMPORARY_ARRAY when it's supported by ureg */ 1187c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->temps[i] = ureg_DECL_temporary( t->ureg ); 1188c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 11915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org /* Emit constants and immediates. Mesa uses a single index space 1192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * for these, so we put all the translated regs in t->constants. 119321d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org */ 119443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (program->Parameters) { 1195f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com t->constants = calloc( program->Parameters->NumParameters, 119643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen sizeof t->constants[0] ); 119743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (t->constants == NULL) { 119843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ret = PIPE_ERROR_OUT_OF_MEMORY; 11993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org goto out; 12003e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 12013e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 120243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (i = 0; i < program->Parameters->NumParameters; i++) { 120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (program->Parameters->Parameters[i].Type) { 120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PROGRAM_ENV_PARAM: 1205e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case PROGRAM_LOCAL_PARAM: 1206e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case PROGRAM_STATE_VAR: 1207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com case PROGRAM_NAMED_PARAM: 1208e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org case PROGRAM_UNIFORM: 120943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen t->constants[i] = ureg_DECL_constant( ureg, i ); 12103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org break; 1211659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 1212659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org /* Emit immediates only when there's no indirect addressing of 12133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org * the const buffer. 1214659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org * FIXME: Be smarter and recognize param arrays: 121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * indirect addressing is only valid within the referenced 121643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * array. 1217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org */ 121843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PROGRAM_CONSTANT: 1219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (program->IndirectRegisterFiles & PROGRAM_ANY_CONST) 1220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->constants[i] = ureg_DECL_constant( ureg, i ); 122130ce411529579186181838984710b0b0980857aaricow@chromium.org else 1222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->constants[i] = 122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ureg_DECL_immediate( ureg, 1224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com (const float*) program->Parameters->ParameterValues[i], 122543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4 ); 122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* texture samplers */ 123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (program->SamplersUsed & (1 << i)) { 123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen t->samplers[i] = ureg_DECL_sampler( ureg, i ); 123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* Emit each instruction in turn: 1241ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org */ 1242ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org for (i = 0; i < program->NumInstructions; i++) { 124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen set_insn_start( t, ureg_get_instruction_number( ureg )); 12445a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org compile_instruction( t, &program->Instructions[i], clamp_color ); 12455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 1246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com /* Fix up all emitted labels: 1248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com */ 1249e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org for (i = 0; i < t->labels_count; i++) { 1250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ureg_fixup_label( ureg, 1251c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->labels[i].token, 1252c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com t->insn[t->labels[i].branch_target] ); 1253c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenout: 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FREE(t->insn); 12573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org FREE(t->labels); 125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FREE(t->constants); 125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1260ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org if (t->error) { 1261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com debug_printf("%s: translate error flag set\n", __FUNCTION__); 1262a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 1263a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 1264a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return ret; 1265c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1266c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1267c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1268c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com/** 1269c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com * Tokens cannot be free with free otherwise the builtin gallium 1270a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org * malloc debugging will get confused. 1271ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org */ 1272ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.orgvoid 1273ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.orgst_free_tokens(const struct tgsi_token *tokens) 1274ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org{ 1275ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org ureg_free_tokens(tokens); 1276ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org} 1277e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org