163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/************************************************************************** 263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2009 VMware, Inc. 463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * All Rights Reserved. 663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * copy of this software and associated documentation files (the 963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * "Software"), to deal in the Software without restriction, including 1063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 1363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * the following conditions: 1463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 1563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * The above copyright notice and this permission notice (including the 1663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 1763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * of the Software. 1863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 1963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 2763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca **************************************************************************/ 2863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/** 305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file 315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * TGSI to LLVM IR translation -- SoA. 325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * 335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * 355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell, 365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Brian Paul, and others. 375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */ 385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca 3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h" 4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h" 4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h" 4263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h" 4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h" 442410125d072faeb83c8373e676422f6c44c78febBrian Paul#include "tgsi/tgsi_dump.h" 459ee1bcf7a5442ccb517a5cfbaf024755bd4d2738Tom Stellard#include "tgsi/tgsi_exec.h" 467821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h" 4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h" 4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h" 49021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h" 50bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_tgsi_action.h" 5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 546d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca#include "lp_bld_bitarit.h" 554363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul#include "lp_bld_gather.h" 56efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "lp_bld_init.h" 577821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 593d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 60ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca#include "lp_bld_quad.h" 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 626c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca#include "lp_bld_limits.h" 6380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 645b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul#include "lp_bld_printf.h" 653469715a8a171512cf9b528702e70393f01c6041José Fonseca#include "lp_bld_sample.h" 6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 6980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 705db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMTypeRef int_type = LLVMInt32TypeInContext(bld->gallivm->context); 715db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMBuilderRef builder = bld->gallivm->builder; 725db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 7380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 7480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 7580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 7618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 770b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size = 0; 7880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 79efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask->int_vec_type = lp_build_int_vec_type(bld->gallivm, mask->bld->type); 8032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->exec_mask = mask->ret_mask = mask->break_mask = mask->cont_mask = mask->cond_mask = 812d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMConstAllOnes(mask->int_vec_type); 825db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 83914244e59d6ad08ec2dd815129c6e75b32843d80José Fonseca mask->loop_limiter = lp_build_alloca(bld->gallivm, int_type, "looplimiter"); 845db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 855db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMBuildStore( 865db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton builder, 875db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMConstInt(int_type, LP_MAX_TGSI_LOOP_ITERATIONS, false), 885db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton mask->loop_limiter); 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 936299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 946299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul 9518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 9618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /*for loops we need to update the entire mask at runtime */ 9718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 987fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 996299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul tmp = LLVMBuildAnd(builder, 10018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 1036299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->exec_mask = LLVMBuildAnd(builder, 10418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 10918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca if (mask->call_stack_size) { 1116299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->exec_mask = LLVMBuildAnd(builder, 1120b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->exec_mask, 11332a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask, 1140b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin "callmask"); 11532a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca } 11618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 1180b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->loop_stack_size > 0 || 1190b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size > 0); 12080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 12180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 12280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 12380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 12480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 1256299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 1266299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul 1276c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING); 1282d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 0) { 1292d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_mask == LLVMConstAllOnes(mask->int_vec_type)); 1302d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 13180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 1322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(LLVMTypeOf(val) == mask->int_vec_type); 1336299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->cond_mask = LLVMBuildAnd(builder, 1343fa3c33844b8491a204cda6ae8d67cd6ada78b3bBrian Paul mask->cond_mask, 1353fa3c33844b8491a204cda6ae8d67cd6ada78b3bBrian Paul val, 1363fa3c33844b8491a204cda6ae8d67cd6ada78b3bBrian Paul ""); 13780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 13880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 13980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 14080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 14180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 1426299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 1432d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef prev_mask; 1442d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef inv_mask; 1452d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 1462d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 1472d91903882e399e8ea7306fd37d5d214907247e6José Fonseca prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 1482d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 1) { 1492d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(prev_mask == LLVMConstAllOnes(mask->int_vec_type)); 150faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 151faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 1526299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul inv_mask = LLVMBuildNot(builder, mask->cond_mask, ""); 1532d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 1546299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->cond_mask = LLVMBuildAnd(builder, 15580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 15680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 15780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 15880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 1622d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 16818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 1696299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 1706299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul 1712d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->loop_stack_size == 0) { 1722d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_block == NULL); 1732d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cont_mask == LLVMConstAllOnes(mask->int_vec_type)); 1742d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_mask == LLVMConstAllOnes(mask->int_vec_type)); 1752d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_var == NULL); 1762d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 1772d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 1782d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size < LP_MAX_TGSI_NESTING); 17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 1802d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].loop_block = mask->loop_block; 1812d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].cont_mask = mask->cont_mask; 1822d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_mask = mask->break_mask; 1832d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_var = mask->break_var; 1842d91903882e399e8ea7306fd37d5d214907247e6José Fonseca ++mask->loop_stack_size; 1853a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin 186efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask->break_var = lp_build_alloca(mask->bld->gallivm, mask->int_vec_type, ""); 1876299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildStore(builder, mask->break_mask, mask->break_var); 1886c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca 189efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask->loop_block = lp_build_insert_new_block(mask->bld->gallivm, "bgnloop"); 1905db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 1916299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildBr(builder, mask->loop_block); 1926299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMPositionBuilderAtEnd(builder, mask->loop_block); 19318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 1946299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->break_mask = LLVMBuildLoad(builder, mask->break_var, ""); 1952d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 19618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 19718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 19818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 20018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 2016299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 2026299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMValueRef exec_mask = LLVMBuildNot(builder, 20318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 20418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 20518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2066299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->break_mask = LLVMBuildAnd(builder, 207d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask, 208d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, "break_full"); 20918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 21018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 21118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 21218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 21318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask) 21418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 2156299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 2166299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMValueRef exec_mask = LLVMBuildNot(builder, 21718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 21818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin ""); 21918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2206299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->cont_mask = LLVMBuildAnd(builder, 221d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask, 222d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, ""); 22318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 22418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 22518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 22618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 22718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 228efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulstatic void lp_exec_endloop(struct gallivm_state *gallivm, 229efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct lp_exec_mask *mask) 23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 2316299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 2335db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMTypeRef int_type = LLVMInt32TypeInContext(mask->bld->gallivm->context); 234efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMTypeRef reg_type = LLVMIntTypeInContext(gallivm->context, 235efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask->bld->type.width * 236efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul mask->bld->type.length); 2375db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMValueRef i1cond, i2cond, icond, limiter; 2387fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2397fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 2407fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2412d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 2422d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Restore the cont_mask, but don't pop 2432d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 2442d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 2452d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size - 1].cont_mask; 2462d91903882e399e8ea7306fd37d5d214907247e6José Fonseca lp_exec_mask_update(mask); 2472d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2482d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 2492d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Unlike the continue mask, the break_mask must be preserved across loop 2502d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * iterations 2512d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 2526299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildStore(builder, mask->break_mask, mask->break_var); 2532d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2545db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton /* Decrement the loop limiter */ 2555db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton limiter = LLVMBuildLoad(builder, mask->loop_limiter, ""); 2565db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 2575db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton limiter = LLVMBuildSub( 2585db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton builder, 2595db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton limiter, 2605db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMConstInt(int_type, 1, false), 2615db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton ""); 2625db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 2635db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMBuildStore(builder, limiter, mask->loop_limiter); 2645db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 2655db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton /* i1cond = (mask != 0) */ 2667fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul i1cond = LLVMBuildICmp( 2676299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul builder, 268d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 2696299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildBitCast(builder, mask->exec_mask, reg_type, ""), 270d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2725db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton /* i2cond = (looplimiter > 0) */ 2735db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton i2cond = LLVMBuildICmp( 2745db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton builder, 2755db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMIntSGT, 2765db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton limiter, 2775db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton LLVMConstNull(int_type), ""); 2785db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 2795db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton /* if( i1cond && i2cond ) */ 2805db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton icond = LLVMBuildAnd(builder, i1cond, i2cond, ""); 2815db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton 282efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul endloop = lp_build_insert_new_block(mask->bld->gallivm, "endloop"); 28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2846299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildCondBr(builder, 2855db9d76a6a498c029133a8c2544c4c7c25eebf80James Benton icond, mask->loop_block, endloop); 28618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2876299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMPositionBuilderAtEnd(builder, endloop); 28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2892d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 2902d91903882e399e8ea7306fd37d5d214907247e6José Fonseca --mask->loop_stack_size; 2912d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_block = mask->loop_stack[mask->loop_stack_size].loop_block; 2922d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size].cont_mask; 2932d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = mask->loop_stack[mask->loop_stack_size].break_mask; 2942d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_var = mask->loop_stack[mask->loop_stack_size].break_var; 29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 29718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 29818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst. 30018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val 30118a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address 30218a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store). 30318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */ 30480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 305639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie struct lp_build_context *bld_store, 306ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 30780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 30880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 30980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 3106299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 3116299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul 312ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* Mix the predicate and execution mask */ 31380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 314ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 3156299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul pred = LLVMBuildAnd(builder, pred, mask->exec_mask, ""); 316ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 317ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred = mask->exec_mask; 318ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 319ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 320ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 321ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 32280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 32380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 3246299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul dst_val = LLVMBuildLoad(builder, dst, ""); 325639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie real_val = lp_build_select(bld_store, 326ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred, 32780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 32880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 3296299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildStore(builder, real_val, dst); 33080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 3316299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuildStore(builder, val, dst); 33280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 33380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 3340b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_call(struct lp_exec_mask *mask, 3350b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int func, 3360b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int *pc) 3370b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 33832a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca assert(mask->call_stack_size < LP_MAX_TGSI_NESTING); 3390b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack[mask->call_stack_size].pc = *pc; 34032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->call_stack[mask->call_stack_size].ret_mask = mask->ret_mask; 34132a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->call_stack_size++; 3420b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = func; 3430b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3440b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3450b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_ret(struct lp_exec_mask *mask, int *pc) 3460b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 3476299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = mask->bld->gallivm->builder; 3480b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMValueRef exec_mask; 34932a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca 3500b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (mask->call_stack_size == 0) { 3510b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin /* returning from main() */ 3520b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = -1; 3530b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin return; 3540b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 3556299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul exec_mask = LLVMBuildNot(builder, 3560b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->exec_mask, 3570b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin "ret"); 3580b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3596299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask->ret_mask = LLVMBuildAnd(builder, 36032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask, 36132a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca exec_mask, "ret_full"); 3620b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3630b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_update(mask); 3640b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3650b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3660b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_bgnsub(struct lp_exec_mask *mask) 3670b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 3680b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3690b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3700b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_endsub(struct lp_exec_mask *mask, int *pc) 3710b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 37232a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca assert(mask->call_stack_size); 3730b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size--; 3740b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = mask->call_stack[mask->call_stack_size].pc; 37532a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask = mask->call_stack[mask->call_stack_size].ret_mask; 37632a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca lp_exec_mask_update(mask); 3770b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 37886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 379695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul 380695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul/** 381695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul * Return pointer to a temporary register channel (src or dest). 382f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul * Note that indirect addressing cannot be handled here. 383695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul * \param index which temporary register 384695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul * \param chan which channel of the temp register. 385695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul */ 386bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom StellardLLVMValueRef 387bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_get_temp_ptr_soa(struct lp_build_tgsi_soa_context *bld, 388263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca unsigned index, 389f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul unsigned chan) 390263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca{ 391bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 392263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca assert(chan < 4); 3933662afd87d61e3f65843b210a7e8c9c8a6cb27f0Brian Paul if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) { 394bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef lindex = lp_build_const_int32(bld->bld_base.base.gallivm, index * 4 + chan); 3956299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul return LLVMBuildGEP(builder, bld->temps_array, &lindex, 1, ""); 396263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca } 397695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul else { 398695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul return bld->temps[index][chan]; 399695814a15b4d64e1fa829d51f18c4089837929c3Brian Paul } 400263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca} 401263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca 402528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin/** 403528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin * Return pointer to a output register channel (src or dest). 404528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin * Note that indirect addressing cannot be handled here. 405528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin * \param index which output register 406528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin * \param chan which channel of the output register. 407528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin */ 408bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom StellardLLVMValueRef 409bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_get_output_ptr(struct lp_build_tgsi_soa_context *bld, 410528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin unsigned index, 411528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin unsigned chan) 412528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin{ 413bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 414528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin assert(chan < 4); 415528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 416bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef lindex = lp_build_const_int32(bld->bld_base.base.gallivm, 417efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul index * 4 + chan); 4186299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul return LLVMBuildGEP(builder, bld->outputs_array, &lindex, 1, ""); 419528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 420528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin else { 421528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin return bld->outputs[index][chan]; 422528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 423528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin} 424528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 4254363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul/** 4264363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * Gather vector. 4274363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * XXX the lp_build_gather() function should be capable of doing this 4284363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * with a little work. 4294363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul */ 4304363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paulstatic LLVMValueRef 431f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airliebuild_gather(struct lp_build_context *bld, 4324363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef base_ptr, 4334363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef indexes) 4344363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul{ 435f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie LLVMBuilderRef builder = bld->gallivm->builder; 436f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie LLVMValueRef res = bld->undef; 4374363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul unsigned i; 4384363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4394363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* 4404363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * Loop over elements of index_vec, load scalar value, insert it into 'res'. 4414363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul */ 442f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie for (i = 0; i < bld->type.length; i++) { 443f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie LLVMValueRef ii = lp_build_const_int32(bld->gallivm, i); 4446299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMValueRef index = LLVMBuildExtractElement(builder, 4454363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul indexes, ii, ""); 4466299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, base_ptr, 4473ded3e98ffc36820c8ab318d736eab99bb16f26bBrian Paul &index, 1, "gather_ptr"); 4486299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMValueRef scalar = LLVMBuildLoad(builder, scalar_ptr, ""); 4494363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4506299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul res = LLVMBuildInsertElement(builder, res, scalar, ii, ""); 4514363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul } 4524363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4534363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul return res; 4544363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul} 4554363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4564363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 4582fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul * Scatter/store vector. 4592fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul */ 4602fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paulstatic void 461e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paulemit_mask_scatter(struct lp_build_tgsi_soa_context *bld, 462e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef base_ptr, 463e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef indexes, 464e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef values, 465e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul struct lp_exec_mask *mask, 466e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef pred) 4672fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul{ 468bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 46914746b1d4fc7ae30b557dacc819b81756df2f72fBrian Paul LLVMBuilderRef builder = gallivm->builder; 4702fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul unsigned i; 4712fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 472e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul /* Mix the predicate and execution mask */ 473e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul if (mask->has_mask) { 474e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul if (pred) { 4756299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul pred = LLVMBuildAnd(builder, pred, mask->exec_mask, ""); 476e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul } 477e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul else { 478e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul pred = mask->exec_mask; 479e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul } 480e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul } 481e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul 4822fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul /* 4832fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul * Loop over elements of index_vec, store scalar value. 4842fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul */ 485bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < bld->bld_base.base.type.length; i++) { 486efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef ii = lp_build_const_int32(gallivm, i); 4872fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef index = LLVMBuildExtractElement(builder, indexes, ii, ""); 4882fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, base_ptr, &index, 1, "scatter_ptr"); 4892fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef val = LLVMBuildExtractElement(builder, values, ii, "scatter_val"); 490e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef scalar_pred = pred ? 491e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMBuildExtractElement(builder, pred, ii, "scatter_pred") : NULL; 4922fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 493ede232e9898698258391a280a098a7ba951b0099Brian Paul if (0) 494efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, "scatter %d: val %f at %d %p\n", 495ede232e9898698258391a280a098a7ba951b0099Brian Paul ii, val, index, scalar_ptr); 496ede232e9898698258391a280a098a7ba951b0099Brian Paul 497e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul if (scalar_pred) { 498e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMValueRef real_val, dst_val; 499e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul dst_val = LLVMBuildLoad(builder, scalar_ptr, ""); 500e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul real_val = lp_build_select(&bld->elem_bld, scalar_pred, val, dst_val); 501e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMBuildStore(builder, real_val, scalar_ptr); 502e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul } 503e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul else { 504e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul LLVMBuildStore(builder, val, scalar_ptr); 505e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul } 5062fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul } 5072fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul} 5082fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 5092fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 5102fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul/** 5110115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul * Read the current value of the ADDR register, convert the floats to 5122fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul * ints, add the base index and return the vector of offsets. 5130115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul * The offsets will be used to index into the constant buffer or 5140115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul * temporary register file. 5150115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul */ 5160115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paulstatic LLVMValueRef 5176d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonsecaget_indirect_index(struct lp_build_tgsi_soa_context *bld, 5186d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca unsigned reg_file, unsigned reg_index, 5196d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca const struct tgsi_src_register *indirect_reg) 5200115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul{ 521bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 52266461aa249a95053fd5887df75ab791558c3a486Dave Airlie struct lp_build_context *uint_bld = &bld->bld_base.uint_bld; 5230115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul /* always use X component of address register */ 5243d5b9c1f2d3340259dd0d8765090a5a963074f29José Fonseca unsigned swizzle = indirect_reg->SwizzleX; 5256d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef base; 5266d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef rel; 5276d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef max_index; 5286d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef index; 5290115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul 5306d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca assert(bld->indirect_files & (1 << reg_file)); 5316d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca 532bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard base = lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, reg_index); 5336d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca 5346d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca assert(swizzle < 4); 5356299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul rel = LLVMBuildLoad(builder, 5366d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca bld->addr[indirect_reg->Index][swizzle], 5376d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca "load addr reg"); 5380115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul 5396d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca index = lp_build_add(uint_bld, base, rel); 5400115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul 541bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard max_index = lp_build_const_int_vec(bld->bld_base.base.gallivm, 542efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul uint_bld->type, 543bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.info->file_max[reg_file]); 5440115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul 5456d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca assert(!uint_bld->type.sign); 5466d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca index = lp_build_min(uint_bld, index, max_index); 5476d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca 5486d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca return index; 5490115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul} 5500115f07507fc661a0a19564c496a781c3dcbc7a0Brian Paul 551141f2c2fc9325a5d30629373bb962f42517967aeDave Airliestatic struct lp_build_context * 552141f2c2fc9325a5d30629373bb962f42517967aeDave Airliestype_to_fetch(struct lp_build_tgsi_context * bld_base, 553141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype) 554141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie{ 555141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie struct lp_build_context *bld_fetch; 556141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie 557141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie switch (stype) { 558141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_FLOAT: 559141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_UNTYPED: 560141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie bld_fetch = &bld_base->base; 561141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie break; 562141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_UNSIGNED: 563141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie bld_fetch = &bld_base->uint_bld; 564141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie break; 565141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_SIGNED: 566141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie bld_fetch = &bld_base->int_bld; 567141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie break; 568141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_VOID: 569141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie case TGSI_TYPE_DOUBLE: 570141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie default: 571141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie assert(0); 572141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie bld_fetch = NULL; 573141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie break; 574141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie } 575141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie return bld_fetch; 576141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie} 577141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie 57863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 579bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_constant( 580bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 581bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_src_register * reg, 582141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype, 583141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie unsigned swizzle) 58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 585bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 586bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld_base->base.gallivm; 5876299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMBuilderRef builder = gallivm->builder; 58866461aa249a95053fd5887df75ab791558c3a486Dave Airlie struct lp_build_context *uint_bld = &bld_base->uint_bld; 5896d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef indirect_index = NULL; 590141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie struct lp_build_context *bld_fetch = stype_to_fetch(bld_base, stype); 591141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie 592bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XXX: Handle fetching xyzw components as a vector */ 593bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(swizzle != ~0); 59485c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul 59585c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul if (reg->Register.Indirect) { 5966d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca indirect_index = get_indirect_index(bld, 5976d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca reg->Register.File, 5986d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca reg->Register.Index, 5996d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca ®->Indirect); 60085c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul } 601ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (reg->Register.Indirect) { 603bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef swizzle_vec = 604bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, swizzle); 605bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef index_vec; /* index into the const buffer */ 6064363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 607bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* index_vec = indirect_index * 4 + swizzle */ 608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 6104363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* Gather values from the constant buffer */ 612141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie return build_gather(bld_fetch, bld->consts_ptr, index_vec); 613bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 614bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard else { 615bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef index; /* index into the const buffer */ 616bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef scalar, scalar_ptr; 617ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 618bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index = lp_build_const_int32(gallivm, reg->Register.Index*4 + swizzle); 6194363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 620bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard scalar_ptr = LLVMBuildGEP(builder, bld->consts_ptr, 621be22e1e781094decfb408ad6d74e3d833b297c87Brian Paul &index, 1, ""); 6224363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 623141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie if (stype != TGSI_TYPE_FLOAT && stype != TGSI_TYPE_UNTYPED) { 624141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie LLVMTypeRef ivtype = LLVMPointerType(LLVMInt32TypeInContext(gallivm->context), 0); 625141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie LLVMValueRef temp_ptr; 626141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie temp_ptr = LLVMBuildBitCast(builder, scalar_ptr, ivtype, ""); 627141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie scalar = LLVMBuildLoad(builder, temp_ptr, ""); 628141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie } else 629141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie scalar = LLVMBuildLoad(builder, scalar_ptr, ""); 630141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie 631141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie return lp_build_broadcast_scalar(bld_fetch, scalar); 632bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 633bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 63463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 635bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 636bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_immediate( 637bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 638bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_src_register * reg, 639141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype, 640141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie unsigned swizzle) 641bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 642bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 643bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef res = bld->immediates[reg->Register.Index][swizzle]; 644bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(res); 645141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie 646141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie if (stype == TGSI_TYPE_UNSIGNED) { 647141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie res = LLVMConstBitCast(res, bld_base->uint_bld.vec_type); 648141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie } else if (stype == TGSI_TYPE_SIGNED) { 649141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie res = LLVMConstBitCast(res, bld_base->int_bld.vec_type); 650141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie } 651bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard return res; 652bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 65363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 654bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 655bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_input( 656bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 657bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_src_register * reg, 658141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype, 659141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie unsigned swizzle) 660bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 661bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 662bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 663bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = gallivm->builder; 66466461aa249a95053fd5887df75ab791558c3a486Dave Airlie struct lp_build_context *uint_bld = &bld_base->uint_bld; 665bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef indirect_index = NULL; 666bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef res; 667f623d0c1c217d990f207306eb968172af79fa969Zack Rusin 668bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (reg->Register.Indirect) { 669bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard indirect_index = get_indirect_index(bld, 670bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard reg->Register.File, 671bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard reg->Register.Index, 672bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard ®->Indirect); 673bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 674f623d0c1c217d990f207306eb968172af79fa969Zack Rusin 675bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (reg->Register.Indirect) { 676bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef swizzle_vec = 677bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(gallivm, uint_bld->type, swizzle); 678bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef length_vec = 679bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(gallivm, uint_bld->type, bld->bld_base.base.type.length); 680bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef index_vec; /* index into the const buffer */ 681bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef inputs_array; 682bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMTypeRef float4_ptr_type; 683bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 684bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* index_vec = (indirect_index * 4 + swizzle) * length */ 685bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 686bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 687bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 688bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 689bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* cast inputs_array pointer to float* */ 690bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard float4_ptr_type = LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 691bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard inputs_array = LLVMBuildBitCast(builder, bld->inputs_array, 6926299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul float4_ptr_type, ""); 693f623d0c1c217d990f207306eb968172af79fa969Zack Rusin 694bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* Gather values from the temporary register array */ 695f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie res = build_gather(&bld_base->base, inputs_array, index_vec); 696bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } else { 697bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld->indirect_files & (1 << TGSI_FILE_INPUT)) { 698bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef lindex = lp_build_const_int32(gallivm, 699bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard reg->Register.Index * 4 + swizzle); 700bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef input_ptr = LLVMBuildGEP(builder, 701bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->inputs_array, &lindex, 1, ""); 702bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard res = LLVMBuildLoad(builder, input_ptr, ""); 703105ed7dfd4abc94db1ce0cba2967ac0491158389Brian Paul } 704105ed7dfd4abc94db1ce0cba2967ac0491158389Brian Paul else { 705bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard res = bld->inputs[reg->Register.Index][swizzle]; 70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 707bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 70800eb74b275e21d567a0ab8a6731181e005208634José Fonseca 709bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(res); 71000eb74b275e21d567a0ab8a6731181e005208634José Fonseca 71100eb74b275e21d567a0ab8a6731181e005208634José Fonseca if (stype == TGSI_TYPE_UNSIGNED) { 71200eb74b275e21d567a0ab8a6731181e005208634José Fonseca res = LLVMBuildBitCast(builder, res, bld_base->uint_bld.vec_type, ""); 71300eb74b275e21d567a0ab8a6731181e005208634José Fonseca } else if (stype == TGSI_TYPE_SIGNED) { 71400eb74b275e21d567a0ab8a6731181e005208634José Fonseca res = LLVMBuildBitCast(builder, res, bld_base->int_bld.vec_type, ""); 71500eb74b275e21d567a0ab8a6731181e005208634José Fonseca } 71600eb74b275e21d567a0ab8a6731181e005208634José Fonseca 717bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard return res; 718bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 7191d6f3543a063ab9e740fd0c149dcce26c282d773Brian Paul 720bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 721bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_temporary( 722bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 723bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_src_register * reg, 724141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype, 725141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie unsigned swizzle) 726bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 727bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 728bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 729bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = gallivm->builder; 73066461aa249a95053fd5887df75ab791558c3a486Dave Airlie struct lp_build_context *uint_bld = &bld_base->uint_bld; 731bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef indirect_index = NULL; 732bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef res; 7331d6f3543a063ab9e740fd0c149dcce26c282d773Brian Paul 734bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (reg->Register.Indirect) { 735bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard indirect_index = get_indirect_index(bld, 736bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard reg->Register.File, 737bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard reg->Register.Index, 738bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard ®->Indirect); 73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 741bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (reg->Register.Indirect) { 742bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef swizzle_vec = 743bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, swizzle); 744bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef length_vec = 745bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, 746bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.type.length); 747bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef index_vec; /* index into the const buffer */ 748bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef temps_array; 749bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMTypeRef float4_ptr_type; 750bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 751bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* index_vec = (indirect_index * 4 + swizzle) * length */ 752bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 753bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 754bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 755bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 756bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* cast temps_array pointer to float* */ 757bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard float4_ptr_type = LLVMPointerType(LLVMFloatTypeInContext(bld->bld_base.base.gallivm->context), 0); 758bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard temps_array = LLVMBuildBitCast(builder, bld->temps_array, 759bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard float4_ptr_type, ""); 760bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 761bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* Gather values from the temporary register array */ 762f667a6f3cefbfb33478de87c166f7a52ed388fb4Dave Airlie res = build_gather(&bld_base->base, temps_array, index_vec); 763e1e03ce4928edf4ea0ef43d853cb869f70b126aaJosé Fonseca } 764bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard else { 765bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef temp_ptr; 766141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie if (stype != TGSI_TYPE_FLOAT && stype != TGSI_TYPE_UNTYPED) { 7673469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMTypeRef itype = LLVMPointerType(bld->bld_base.int_bld.vec_type, 0); 768141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 769141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie swizzle); 770141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie temp_ptr = LLVMBuildBitCast(builder, tint_ptr, itype, ""); 771141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie } else 772141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); 773bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard res = LLVMBuildLoad(builder, temp_ptr, ""); 774bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (!res) 775bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard return bld->bld_base.base.undef; 77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 78063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 781bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 782bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_system_value( 783bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 784bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_src_register * reg, 785141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie enum tgsi_opcode_type stype, 786141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie unsigned swizzle) 787bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 788bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 789bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 79046931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert const struct tgsi_shader_info *info = bld->bld_base.info; 791bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = gallivm->builder; 79246931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert LLVMValueRef res; 79346931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert enum tgsi_opcode_type atype; // Actual type of the value 794bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 795bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(!reg->Register.Indirect); 796bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 79746931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert switch (info->system_value_semantic_name[reg->Register.Index]) { 79846931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert case TGSI_SEMANTIC_INSTANCEID: 799c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert res = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.instance_id); 800c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert atype = TGSI_TYPE_UNSIGNED; 801c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert break; 802c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert 803c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert case TGSI_SEMANTIC_VERTEXID: 804c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert res = bld->system_values.vertex_id; 80546931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert atype = TGSI_TYPE_UNSIGNED; 80646931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert break; 807bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 80846931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert default: 80946931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert assert(!"unexpected semantic in emit_fetch_system_value"); 81046931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert res = bld_base->base.zero; 81146931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert atype = TGSI_TYPE_FLOAT; 81246931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert break; 81346931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert } 81446931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert 81546931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert if (atype != stype) { 81646931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert if (stype == TGSI_TYPE_FLOAT) { 81746931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert res = LLVMBuildBitCast(builder, res, bld_base->base.vec_type, ""); 81846931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert } else if (stype == TGSI_TYPE_UNSIGNED) { 81946931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert res = LLVMBuildBitCast(builder, res, bld_base->uint_bld.vec_type, ""); 82046931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert } else if (stype == TGSI_TYPE_SIGNED) { 82146931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert res = LLVMBuildBitCast(builder, res, bld_base->int_bld.vec_type, ""); 82246931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert } 82346931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert } 824bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 82546931ecf480e1d231bb6c2236d91b5390f2465acOlivier Galibert return res; 826bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 82986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 83086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 83186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 83286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 83386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 834bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef src, 83586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 83686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 83786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 83886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 83986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 84086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 84186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 84286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 84386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 84486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 845bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard *ddx = lp_build_ddx(&bld->bld_base.base, src); 84686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 84786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 848bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard *ddy = lp_build_ddy(&bld->bld_base.base, src); 84986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 85086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 85186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 85286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 853ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Predicate. 854ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 855ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecastatic void 856ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecaemit_fetch_predicate( 857ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca struct lp_build_tgsi_soa_context *bld, 858ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca const struct tgsi_full_instruction *inst, 859ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef *pred) 860ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca{ 861bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 862ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned index; 863ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned char swizzles[4]; 864ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL}; 865ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef value; 866ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned chan; 867ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 868ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!inst->Instruction.Predicate) { 86982b71db03ddaf0eed504412c9169db37cf9bdadcTom Stellard TGSI_FOR_EACH_CHANNEL( chan ) { 870ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = NULL; 871ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 872ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca return; 873ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 874ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 875ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[0] = inst->Predicate.SwizzleX; 876ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[1] = inst->Predicate.SwizzleY; 877ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[2] = inst->Predicate.SwizzleZ; 878ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[3] = inst->Predicate.SwizzleW; 879ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 880ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca index = inst->Predicate.Index; 881ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(index < LP_MAX_TGSI_PREDS); 882ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 88382b71db03ddaf0eed504412c9169db37cf9bdadcTom Stellard TGSI_FOR_EACH_CHANNEL( chan ) { 884ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned swizzle = swizzles[chan]; 885ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 886ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 887ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Only fetch the predicate register channels that are actually listed 888ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * in the swizzles 889ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 890ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!unswizzled[swizzle]) { 8916299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul value = LLVMBuildLoad(builder, 892263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->preds[index][swizzle], ""); 893ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 894ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 895ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Convert the value to an integer mask. 896ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * 897ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * TODO: Short-circuit this comparison -- a D3D setp_xx instructions 898ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * is needlessly causing two comparisons due to storing the intermediate 899ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * result as float vector instead of an integer mask vector. 900ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 901bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard value = lp_build_compare(bld->bld_base.base.gallivm, 902bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.type, 903ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca PIPE_FUNC_NOTEQUAL, 904ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value, 905bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.zero); 906ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (inst->Predicate.Negate) { 9076299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul value = LLVMBuildNot(builder, value, ""); 908ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 909ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 910ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unswizzled[swizzle] = value; 911ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 912ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = unswizzled[swizzle]; 913ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 914ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 915ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = value; 916ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 917ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca} 918ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 919ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca/** 92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 923bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_store_chan( 924bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context *bld_base, 92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 928ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 931bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 932bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 93314746b1d4fc7ae30b557dacc819b81756df2f72fBrian Paul LLVMBuilderRef builder = gallivm->builder; 9347d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 93566461aa249a95053fd5887df75ab791558c3a486Dave Airlie struct lp_build_context *uint_bld = &bld_base->uint_bld; 9366d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca LLVMValueRef indirect_index = NULL; 937639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie struct lp_build_context *bld_store; 938117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode); 939639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie 940117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie switch (dtype) { 941117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie default: 942117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_FLOAT: 943117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_UNTYPED: 944117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_store = &bld_base->base; 945117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 946117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_UNSIGNED: 947117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_store = &bld_base->uint_bld; 948117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 949117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_SIGNED: 950117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_store = &bld_base->int_bld; 951117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 952117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_DOUBLE: 953117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_VOID: 954117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie assert(0); 955117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_store = NULL; 956117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 957117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie } 9582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 96063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 96163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 96363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 964bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard value = lp_build_max(&bld->bld_base.base, value, bld->bld_base.base.zero); 965bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one); 96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 969bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard value = lp_build_max(&bld->bld_base.base, value, lp_build_const_vec(bld->bld_base.base.gallivm, bld->bld_base.base.type, -1.0)); 970bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one); 97163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 9727926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 9737926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 9747926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 977021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (reg->Register.Indirect) { 9786d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca indirect_index = get_indirect_index(bld, 9796d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca reg->Register.File, 9806d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca reg->Register.Index, 9816d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca ®->Indirect); 9826d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca } else { 983bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(reg->Register.Index <= 984bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.info->file_max[reg->Register.File]); 985021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 986021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 9875b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 989528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin if (reg->Register.Indirect) { 990528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMValueRef chan_vec = 991efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_const_int_vec(gallivm, uint_bld->type, chan_index); 992528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMValueRef length_vec = 993bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int_vec(gallivm, uint_bld->type, bld->bld_base.base.type.length); 994528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMValueRef index_vec; /* indexes into the temp registers */ 995528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMValueRef outputs_array; 996528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMValueRef pixel_offsets; 997528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin LLVMTypeRef float_ptr_type; 998528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin int i; 999528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 1000528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin /* build pixel offset vector: {0, 1, 2, 3, ...} */ 1001528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin pixel_offsets = uint_bld->undef; 1002bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < bld->bld_base.base.type.length; i++) { 1003efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef ii = lp_build_const_int32(gallivm, i); 1004528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets, 1005528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin ii, ii, ""); 1006528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 1007528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 1008528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */ 1009528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 1010528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin index_vec = lp_build_add(uint_bld, index_vec, chan_vec); 1011528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 1012528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets); 1013528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 1014efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul float_ptr_type = 1015efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 1016528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin outputs_array = LLVMBuildBitCast(builder, bld->outputs_array, 1017528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin float_ptr_type, ""); 1018528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 1019528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin /* Scatter store values into temp registers */ 1020528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin emit_mask_scatter(bld, outputs_array, index_vec, value, 1021528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin &bld->exec_mask, pred); 1022528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 1023528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin else { 1024bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef out_ptr = lp_get_output_ptr(bld, reg->Register.Index, 1025528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin chan_index); 1026639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, out_ptr); 1027528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1030f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul case TGSI_FILE_TEMPORARY: 1031f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul if (reg->Register.Indirect) { 10322fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef chan_vec = 1033efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_const_int_vec(gallivm, uint_bld->type, chan_index); 10342fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef length_vec = 1035efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_const_int_vec(gallivm, uint_bld->type, 1036bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.type.length); 10372fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef index_vec; /* indexes into the temp registers */ 10382fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMValueRef temps_array; 1039ede232e9898698258391a280a098a7ba951b0099Brian Paul LLVMValueRef pixel_offsets; 10402fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul LLVMTypeRef float_ptr_type; 1041ede232e9898698258391a280a098a7ba951b0099Brian Paul int i; 1042ede232e9898698258391a280a098a7ba951b0099Brian Paul 1043ede232e9898698258391a280a098a7ba951b0099Brian Paul /* build pixel offset vector: {0, 1, 2, 3, ...} */ 1044ede232e9898698258391a280a098a7ba951b0099Brian Paul pixel_offsets = uint_bld->undef; 1045bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < bld->bld_base.base.type.length; i++) { 1046efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef ii = lp_build_const_int32(gallivm, i); 1047ede232e9898698258391a280a098a7ba951b0099Brian Paul pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets, 1048ede232e9898698258391a280a098a7ba951b0099Brian Paul ii, ii, ""); 1049ede232e9898698258391a280a098a7ba951b0099Brian Paul } 10502fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 1051ede232e9898698258391a280a098a7ba951b0099Brian Paul /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */ 10522fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 10532fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul index_vec = lp_build_add(uint_bld, index_vec, chan_vec); 10542fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 1055ede232e9898698258391a280a098a7ba951b0099Brian Paul index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets); 10562fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 1057efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul float_ptr_type = 1058efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 1059ede232e9898698258391a280a098a7ba951b0099Brian Paul temps_array = LLVMBuildBitCast(builder, bld->temps_array, 10602fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul float_ptr_type, ""); 10612fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul 10622fefbc79ac8bb55197ff817feeca2626585d7a8cBrian Paul /* Scatter store values into temp registers */ 1063e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul emit_mask_scatter(bld, temps_array, index_vec, value, 1064e7f5d19a1106351f2db8f62f59f51be86eaa93dfBrian Paul &bld->exec_mask, pred); 1065f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul } 1066f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul else { 1067117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMValueRef temp_ptr; 1068117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie 1069117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie switch (dtype) { 1070117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_UNSIGNED: 1071117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_SIGNED: { 10723469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMTypeRef itype = bld_base->int_bld.vec_type; 1073117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMTypeRef ivtype = LLVMPointerType(itype, 0); 1074117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 1075117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie chan_index); 1076117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMValueRef temp_value_ptr; 1077117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie 1078117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie temp_ptr = LLVMBuildBitCast(builder, tint_ptr, ivtype, ""); 1079117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie temp_value_ptr = LLVMBuildBitCast(builder, value, itype, ""); 1080117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie value = temp_value_ptr; 1081117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 1082117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie } 1083117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie default: 1084117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_FLOAT: 1085117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie case TGSI_TYPE_UNTYPED: 1086117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 1087117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie chan_index); 1088117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie break; 1089117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie } 1090117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie 1091639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, temp_ptr); 1092f674ed6b0662a15ab8298da0848a4c82694e0c95Brian Paul } 109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 1096a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca assert(dtype == TGSI_TYPE_SIGNED); 1097a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca assert(LLVMTypeOf(value) == bld_base->base.int_vec_type); 1098639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, 1099557280542399629ac64a48f5b618365e2b18fce1Zack Rusin bld->addr[reg->Register.Index][chan_index]); 110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1102ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 1103639fbe2e75bb23a72262a7bc60d69d026b649609Dave Airlie lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, 11048690c6a6b4fb0b48e2ae75cd0f64de86b039081cmichal bld->preds[reg->Register.Index][chan_index]); 1105ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 1106ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 111063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1112bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1113bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_store( 1114bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1115bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_instruction * inst, 1116bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_opcode_info * info, 1117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef dst[4]) 1118bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1119bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned chan_index; 1121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if(info->num_dst) { 1124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef pred[TGSI_NUM_CHANNELS]; 1125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1126bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_fetch_predicate( bld, inst, pred ); 1127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1128bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1129bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_store_chan(bld_base, inst, 0, chan_index, pred[chan_index], dst[chan_index]); 1130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 1131bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 1132bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 113963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 114158daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca enum lp_build_tex_modifier modifier, 1142faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 1144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 11453469715a8a171512cf9b528702e70393f01c6041José Fonseca struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1146962558daaed43b0111cd062e32821aad106869d7José Fonseca unsigned unit; 1147ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, explicit_lod; 114831d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 1149c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 11503469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_derivatives derivs; 1151c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 11523469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned dims; 115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11559db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca if (!bld->sampler) { 11569db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca _debug_printf("warning: found texture instruction but no sampler generator supplied\n"); 11579db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca for (i = 0; i < 4; i++) { 1158bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard texel[i] = bld->bld_base.base.undef; 11599db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 11609db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca return; 11619db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 11629db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca 11633469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[0] = bld->bld_base.base.undef; 11643469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[1] = bld->bld_base.base.undef; 11653469715a8a171512cf9b528702e70393f01c6041José Fonseca 11667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 1168c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 11693469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 1; 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 1171d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák case TGSI_TEXTURE_1D_ARRAY: 11723469715a8a171512cf9b528702e70393f01c6041José Fonseca num_coords = 2; 11733469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 1; 11743469715a8a171512cf9b528702e70393f01c6041José Fonseca break; 117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 1177c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 11783469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 2; 117963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 1180f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 1181d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák case TGSI_TEXTURE_SHADOW1D_ARRAY: 11823469715a8a171512cf9b528702e70393f01c6041José Fonseca num_coords = 3; 11833469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 1; 11843469715a8a171512cf9b528702e70393f01c6041José Fonseca break; 1185f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 1186f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 1187d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák case TGSI_TEXTURE_2D_ARRAY: 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 1189c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 11903469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 2; 11913469715a8a171512cf9b528702e70393f01c6041José Fonseca break; 11923469715a8a171512cf9b528702e70393f01c6041José Fonseca case TGSI_TEXTURE_3D: 11933469715a8a171512cf9b528702e70393f01c6041José Fonseca num_coords = 3; 11943469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 3; 119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 1196d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák case TGSI_TEXTURE_SHADOW2D_ARRAY: 1197d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák num_coords = 4; 11983469715a8a171512cf9b528702e70393f01c6041José Fonseca dims = 2; 1199d8452a0be810d7176b0cbfe6632fc0f8016b5733Marek Olšák break; 120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120558daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca if (modifier == LP_BLD_TEX_MODIFIER_LOD_BIAS) { 1206bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lod_bias = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1207ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 1208ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 120958daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca else if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) { 1210ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 1211bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1212ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 1213ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca else { 1214ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 1215ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 1216ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121858daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca if (modifier == LP_BLD_TEX_MODIFIER_PROJECTED) { 1219bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard oow = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1220bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard oow = lp_build_rcp(&bld->bld_base.base, oow); 122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1223c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 1224bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard coords[i] = lp_build_emit_fetch( &bld->bld_base, inst, 0, i ); 122558daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca if (modifier == LP_BLD_TEX_MODIFIER_PROJECTED) 1226bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard coords[i] = lp_build_mul(&bld->bld_base.base, coords[i], oow); 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 1228ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 1229bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard coords[i] = bld->bld_base.base.undef; 1230ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123258daea741fa21fe3f89fd7bf106df1545c5b21afJosé Fonseca if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV) { 12333469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef i32undef = LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context)); 12343469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef shuffles[LP_MAX_VECTOR_LENGTH]; 12353469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef ddxdyonec[3]; 12363469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned length = bld->bld_base.base.type.length; 12373469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned num_quads = length / 4; 12383469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned dim; 12393469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned quad; 12403469715a8a171512cf9b528702e70393f01c6041José Fonseca 12413469715a8a171512cf9b528702e70393f01c6041José Fonseca for (dim = 0; dim < dims; ++dim) { 12423469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef srcx = lp_build_emit_fetch( &bld->bld_base, inst, 1, dim ); 12433469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef srcy = lp_build_emit_fetch( &bld->bld_base, inst, 2, dim ); 12443469715a8a171512cf9b528702e70393f01c6041José Fonseca for (quad = 0; quad < num_quads; ++quad) { 12453469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned s1 = 4*quad; 12463469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned s2 = 4*quad + length; 12473469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 0] = lp_build_const_int32(gallivm, s1); 12483469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 1] = lp_build_const_int32(gallivm, s2); 12493469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 2] = i32undef; 12503469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 3] = i32undef; 12513469715a8a171512cf9b528702e70393f01c6041José Fonseca } 12523469715a8a171512cf9b528702e70393f01c6041José Fonseca ddxdyonec[dim] = LLVMBuildShuffleVector(builder, srcx, srcy, 12533469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMConstVector(shuffles, length), ""); 12543469715a8a171512cf9b528702e70393f01c6041José Fonseca } 12553469715a8a171512cf9b528702e70393f01c6041José Fonseca if (dims == 1) { 12563469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[0] = ddxdyonec[0]; 12573469715a8a171512cf9b528702e70393f01c6041José Fonseca } 12583469715a8a171512cf9b528702e70393f01c6041José Fonseca else if (dims >= 2) { 12593469715a8a171512cf9b528702e70393f01c6041José Fonseca for (quad = 0; quad < num_quads; ++quad) { 12603469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned s1 = 4*quad; 12613469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned s2 = 4*quad + length; 12623469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 0] = lp_build_const_int32(gallivm, s1); 12633469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 1] = lp_build_const_int32(gallivm, s1 + 1); 12643469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 2] = lp_build_const_int32(gallivm, s2); 12653469715a8a171512cf9b528702e70393f01c6041José Fonseca shuffles[4*quad + 3] = lp_build_const_int32(gallivm, s2 + 1); 12663469715a8a171512cf9b528702e70393f01c6041José Fonseca } 12673469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[0] = LLVMBuildShuffleVector(builder, ddxdyonec[0], ddxdyonec[1], 12683469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMConstVector(shuffles, length), ""); 12693469715a8a171512cf9b528702e70393f01c6041José Fonseca if (dims == 3) { 12703469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[1] = ddxdyonec[2]; 12713469715a8a171512cf9b528702e70393f01c6041José Fonseca } 1272962558daaed43b0111cd062e32821aad106869d7José Fonseca } 1273962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[3].Register.Index; 1274962558daaed43b0111cd062e32821aad106869d7José Fonseca } else { 12753469715a8a171512cf9b528702e70393f01c6041José Fonseca if (dims == 1) { 12763469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[0] = lp_build_packed_ddx_ddy_onecoord(&bld->bld_base.base, coords[0]); 12773469715a8a171512cf9b528702e70393f01c6041José Fonseca } 12783469715a8a171512cf9b528702e70393f01c6041José Fonseca else if (dims >= 2) { 12793469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[0] = lp_build_packed_ddx_ddy_twocoord(&bld->bld_base.base, 12803469715a8a171512cf9b528702e70393f01c6041José Fonseca coords[0], coords[1]); 12813469715a8a171512cf9b528702e70393f01c6041José Fonseca if (dims == 3) { 12823469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs.ddx_ddy[1] = lp_build_packed_ddx_ddy_onecoord(&bld->bld_base.base, coords[2]); 12833469715a8a171512cf9b528702e70393f01c6041José Fonseca } 1284962558daaed43b0111cd062e32821aad106869d7José Fonseca } 1285962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[1].Register.Index; 1286962558daaed43b0111cd062e32821aad106869d7José Fonseca } 1287962558daaed43b0111cd062e32821aad106869d7José Fonseca 12888be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 1289bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.gallivm, 1290bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->bld_base.base.type, 1291962558daaed43b0111cd062e32821aad106869d7José Fonseca unit, num_coords, coords, 12923469715a8a171512cf9b528702e70393f01c6041José Fonseca &derivs, 1293ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias, explicit_lod, 12948be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12975d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void 12985d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertemit_txq( struct lp_build_tgsi_soa_context *bld, 12995d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert const struct tgsi_full_instruction *inst, 13005d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef *sizes_out) 13015d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{ 13025d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef explicit_lod; 13035d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unsigned num_coords, has_lod; 13045d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unsigned i; 13055d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13065d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert switch (inst->Texture.Texture) { 13075d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_1D: 13085d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOW1D: 13095d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOW2D: 13105d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOWCUBE: 13115d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert num_coords = 1; 13125d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert has_lod = 1; 13135d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert break; 13145d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_2D: 13155d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_CUBE: 13165d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_1D_ARRAY: 13175d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOW1D_ARRAY: 13185d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert num_coords = 2; 13195d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert has_lod = 1; 13205d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert break; 13215d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_3D: 13225d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// case TGSI_TEXTURE_CUBE_ARRAY: 13235d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// case TGSI_TEXTURE_SHADOWCUBE_ARRAY: 13245d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_2D_ARRAY: 13255d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOW2D_ARRAY: 13265d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert num_coords = 3; 13275d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert has_lod = 1; 13285d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert break; 13295d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13305d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_BUFFER: 13315d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert num_coords = 1; 13325d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert has_lod = 0; 13335d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert break; 13345d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13355d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_RECT: 13365d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert case TGSI_TEXTURE_SHADOWRECT: 13375d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// case TGSI_TEXTURE_2D_MS: 13385d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert num_coords = 2; 13395d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert has_lod = 0; 13405d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert break; 13415d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13425d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// case TGSI_TEXTURE_2D_MS_ARRAY: 13435d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// num_coords = 3; 13445d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// has_lod = 0; 13455d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert// break; 13465d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13475d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert default: 13485d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert assert(0); 13495d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert return; 13505d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert } 13515d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13525d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert if (!bld->sampler) { 13535d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert _debug_printf("warning: found texture query instruction but no sampler generator supplied\n"); 13545d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert for (i = 0; i < num_coords; i++) 13555d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sizes_out[i] = bld->bld_base.base.undef; 13565d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert return; 13575d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert } 13585d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13595d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert if (has_lod) 13605d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 2 ); 13615d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert else 13625d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert explicit_lod = NULL; 13635d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 13645d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert bld->sampler->emit_size_query(bld->sampler, 13655d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert bld->bld_base.base.gallivm, 13663469715a8a171512cf9b528702e70393f01c6041José Fonseca bld->bld_base.int_bld.type, 13675d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert inst->Src[1].Register.Index, 13685d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert explicit_lod, 13695d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sizes_out); 13705d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert} 13715d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 137222ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwellstatic boolean 137322ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwellnear_end_of_shader(struct lp_build_tgsi_soa_context *bld, 137422ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell int pc) 137522ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell{ 137622ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell int i; 137722ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 137822ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell for (i = 0; i < 5; i++) { 137922ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell unsigned opcode; 138022ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 1381bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (pc + i >= bld->bld_base.info->num_instructions) 138222ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell return TRUE; 138322ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 1384bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard opcode = bld->bld_base.instructions[pc + i].Instruction.Opcode; 138522ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 138622ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell if (opcode == TGSI_OPCODE_END) 138722ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell return TRUE; 138822ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 138922ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell if (opcode == TGSI_OPCODE_TEX || 139022ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXP || 139122ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXD || 139222ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXB || 139322ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXL || 139422ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXF || 139522ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_TXQ || 139622ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_CAL || 139722ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_CALLNZ || 139822ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_IF || 139922ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_IFC || 140022ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_BGNLOOP || 140122ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell opcode == TGSI_OPCODE_SWITCH) 140222ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell return FALSE; 140322ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell } 140422ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 140522ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell return TRUE; 140622ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell} 140722ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 140822ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell 140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1410feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 1411feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 1412feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 141622ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell const struct tgsi_full_instruction *inst, 141722ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell int pc) 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 1419bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 14207d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 1421bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef terms[TGSI_NUM_CHANNELS]; 14223d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14257821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142782b71db03ddaf0eed504412c9169db37cf9bdadcTom Stellard TGSI_FOR_EACH_CHANNEL( chan_index ) { 142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14307821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 1431b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14337821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 1434bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(swizzle < TGSI_NUM_CHANNELS); 14357821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 14367821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 1437bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard terms[swizzle] = lp_build_emit_fetch(&bld->bld_base, inst, 0, chan_index ); 143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14403d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 144182b71db03ddaf0eed504412c9169db37cf9bdadcTom Stellard TGSI_FOR_EACH_CHANNEL( chan_index ) { 1442aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 14433d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 1444aede39efd86d200ffbace8fc012104e31f673973José Fonseca 1445feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 1446feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 1447feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 1448bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard chan_mask = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->bld_base.base.zero); 1449aede39efd86d200ffbace8fc012104e31f673973José Fonseca 14503d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 14516299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask = LLVMBuildAnd(builder, mask, chan_mask, ""); 14523d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 14533d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 1454aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14563d7a88674f9eb3320eeff511968f041426e25023José Fonseca 1457aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell if(mask) { 14583d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 1459aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell 146022ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell if (!near_end_of_shader(bld, pc)) 146122ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell lp_build_mask_check(bld->mask); 1462aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell } 146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 1467feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 1468feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 1469feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 1470feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 1471feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 1472feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 1473feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 1474bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard int pc) 1475feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 1476bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 1477feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 1478feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 1479feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 1480feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 1481feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 1482feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 14836299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul mask = LLVMBuildNot(builder, bld->exec_mask.exec_mask, "kilp"); 1484feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 1485feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 1486bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef zero = LLVMConstNull(bld->bld_base.base.int_vec_type); 1487ec2824cd867d3b782588be1f3b1d5d802eb381abBrian Paul mask = zero; 1488feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 1489feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 1490feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 1491aa4cb5e2d8d48c7dcc9653c61a9e25494e3e7b2aKeith Whitwell 149222ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell if (!near_end_of_shader(bld, pc)) 149322ec25e2bf5c9309610b68e8e40472a8ea695ba9Keith Whitwell lp_build_mask_check(bld->mask); 1494feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 1495feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 14965b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 14975b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul/** 14985b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul * Emit code which will dump the value of all the temporary registers 14995b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul * to stdout. 15005b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul */ 15015b294a5d17c818ecbb1295fdd20825da9b106792Brian Paulstatic void 15025b294a5d17c818ecbb1295fdd20825da9b106792Brian Paulemit_dump_temps(struct lp_build_tgsi_soa_context *bld) 15035b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul{ 1504bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1505efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 15065b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul LLVMValueRef temp_ptr; 1507efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef i0 = lp_build_const_int32(gallivm, 0); 1508efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef i1 = lp_build_const_int32(gallivm, 1); 1509efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef i2 = lp_build_const_int32(gallivm, 2); 1510efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef i3 = lp_build_const_int32(gallivm, 3); 15115b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul int index; 1512bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard int n = bld->bld_base.info->file_max[TGSI_FILE_TEMPORARY]; 15135b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 15145b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul for (index = 0; index < n; index++) { 1515efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMValueRef idx = lp_build_const_int32(gallivm, index); 15165b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul LLVMValueRef v[4][4], res; 15175b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul int chan; 15185b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 1519efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, "TEMP[%d]:\n", idx); 15205b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 15215b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul for (chan = 0; chan < 4; chan++) { 1522bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard temp_ptr = lp_get_temp_ptr_soa(bld, index, chan); 15236299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul res = LLVMBuildLoad(builder, temp_ptr, ""); 15245b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[chan][0] = LLVMBuildExtractElement(builder, res, i0, ""); 15255b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[chan][1] = LLVMBuildExtractElement(builder, res, i1, ""); 15265b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[chan][2] = LLVMBuildExtractElement(builder, res, i2, ""); 15275b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[chan][3] = LLVMBuildExtractElement(builder, res, i3, ""); 15285b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul } 15295b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 1530efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, " X: %f %f %f %f\n", 15315b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[0][0], v[0][1], v[0][2], v[0][3]); 1532efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, " Y: %f %f %f %f\n", 15335b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[1][0], v[1][1], v[1][2], v[1][3]); 1534efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, " Z: %f %f %f %f\n", 15355b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[2][0], v[2][1], v[2][2], v[2][3]); 1536efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_printf(gallivm, " W: %f %f %f %f\n", 15375b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul v[3][0], v[3][1], v[3][2], v[3][3]); 15385b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul } 15395b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul} 15405b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 15415b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 15425b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul 1543bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid 1544bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_emit_declaration_soa( 1545bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context *bld_base, 154685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 154785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 1548bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); 1549bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1550bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMTypeRef vec_type = bld->bld_base.base.vec_type; 155155c5408ad049423597cd274e7abcd2d91a16ead3Brian Paul const unsigned first = decl->Range.First; 155255c5408ad049423597cd274e7abcd2d91a16ead3Brian Paul const unsigned last = decl->Range.Last; 155385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 155485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 155585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 1556bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(last <= bld->bld_base.info->file_max[decl->Declaration.File]); 155785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 155885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 15596c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_TEMPS); 156010740acf46e08960dde790005d65a98440f313bcJosé Fonseca if (!(bld->indirect_files & (1 << TGSI_FILE_TEMPORARY))) { 1561bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1562efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul bld->temps[idx][i] = lp_build_alloca(gallivm, vec_type, "temp"); 1563021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 156485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 156585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 156685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 156710740acf46e08960dde790005d65a98440f313bcJosé Fonseca if (!(bld->indirect_files & (1 << TGSI_FILE_OUTPUT))) { 1568bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1569efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul bld->outputs[idx][i] = lp_build_alloca(gallivm, 1570528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin vec_type, "output"); 1571528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin } 157285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 157385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 1574ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin case TGSI_FILE_ADDRESS: 1575a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca /* ADDR registers are the only allocated with an integer LLVM IR type, 1576a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca * as they are guaranteed to always have integers. 1577a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca * XXX: Not sure if this exception is worthwhile (or the whole idea of 1578a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca * an ADDR register for that matter). 1579a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca */ 15806c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_ADDRS); 1581bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1582117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld->addr[idx][i] = lp_build_alloca(gallivm, bld_base->base.int_vec_type, "addr"); 1583ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin break; 1584ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 1585e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca case TGSI_FILE_PREDICATE: 1586ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(idx < LP_MAX_TGSI_PREDS); 1587bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1588efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul bld->preds[idx][i] = lp_build_alloca(gallivm, vec_type, 1589efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul "predicate"); 1590e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca break; 1591e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca 159285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 159385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 1594dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 1595012fabca722494162c244a367913562b8cfa4677Zack Rusin } 159685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 159785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1599fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 1600bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid lp_emit_immediate_soa( 1601bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context *bld_base, 1602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct tgsi_full_immediate *imm) 160363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 1604bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); 1605bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state * gallivm = bld_base->base.gallivm; 160663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1607bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* simply copy the immediate values into the next immediates[] slot */ 1608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned i; 1609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const uint size = imm->Immediate.NrTokens - 1; 1610bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(size <= 4); 1611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(bld->num_immediates < LP_MAX_TGSI_IMMEDIATES); 16127199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie switch (imm->Immediate.DataType) { 16137199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie case TGSI_IMM_FLOAT32: 16147199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie for( i = 0; i < size; ++i ) 16157199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie bld->immediates[bld->num_immediates][i] = 16167199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie lp_build_const_vec(gallivm, bld_base->base.type, imm->u[i].Float); 161789258652b6a1d282bed14549907892bdfda752f0José Fonseca 16187199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie break; 16197199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie case TGSI_IMM_UINT32: 16207199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie for( i = 0; i < size; ++i ) { 16217199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->uint_bld.type, imm->u[i].Uint); 16227199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie bld->immediates[bld->num_immediates][i] = 16237199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie LLVMConstBitCast(tmp, bld_base->base.vec_type); 16247199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie } 16250b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 16267199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie break; 16277199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie case TGSI_IMM_INT32: 16287199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie for( i = 0; i < size; ++i ) { 16297199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->int_bld.type, imm->u[i].Int); 16307199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie bld->immediates[bld->num_immediates][i] = 16317199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie LLVMConstBitCast(tmp, bld_base->base.vec_type); 16327199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie } 16337199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie 16347199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie break; 16357199b0b6811b3340cb5c531c8625220e964fa16cDave Airlie } 1636bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for( i = size; i < 4; ++i ) 1637bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->immediates[bld->num_immediates][i] = bld_base->base.undef; 1638faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1639bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->num_immediates++; 1640bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 164163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1642bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1643bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardddx_emit( 1644bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1645bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1646bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1647bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1648bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 164963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1650bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_fetch_deriv(bld, emit_data->args[0], NULL, 1651bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[emit_data->chan], NULL); 1652bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1654bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1655bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardddy_emit( 1656bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1657bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1658bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1659bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1660bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 166163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1662bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_fetch_deriv(bld, emit_data->args[0], NULL, NULL, 1663bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[emit_data->chan]); 1664bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 166563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1666bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1667bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkilp_emit( 1668bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1669bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1670bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1671bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1672bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1674bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_kilp(bld, bld_base->pc - 1); 1675bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1677bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1678bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkil_emit( 1679bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1680bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1681bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1682bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1683bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 168463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1685bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_kil(bld, emit_data->inst, bld_base->pc - 1); 1686bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1688bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1689bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtex_emit( 1690bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1691bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1692bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1693bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1694bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1696bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE, emit_data->output); 1697bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 169863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1699bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1700bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtxb_emit( 1701bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1702bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1703bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1704bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1705bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 170663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1707bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_BIAS, 1708bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output); 1709bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 171063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1711bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1712bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtxd_emit( 1713bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1714bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1715bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1716bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1717bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 171863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1719bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV, 1720bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output); 1721bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1723bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1724bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtxl_emit( 1725bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1726bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1727bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1728bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1729bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 173063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1731bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD, 1732bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output); 1733bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 173463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1735bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1736bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtxp_emit( 1737bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1738bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1739bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1740bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1741bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1743bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_PROJECTED, 1744bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output); 1745bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 174663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1747bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 17485d10d757276a599a60a68b88b21087b5824a8df7Olivier Galiberttxq_emit( 17495d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert const struct lp_build_tgsi_action * action, 17505d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct lp_build_tgsi_context * bld_base, 17515d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct lp_build_emit_data * emit_data) 17525d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{ 17535d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 17545d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 17555d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert emit_txq(bld, emit_data->inst, emit_data->output); 17565d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert} 17575d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 17585d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void 1759bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcal_emit( 1760bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1761bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1762bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1763bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1764bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1766bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_call(&bld->exec_mask, emit_data->inst->Label.Label, 1767bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &bld_base->pc); 1768bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1770bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1771bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardret_emit( 1772bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1773bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1774bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1775bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1776bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 177763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1778bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_ret(&bld->exec_mask, &bld_base->pc); 1779bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1781bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1782bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardbrk_emit( 1783bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1784bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1785bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1786bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1787bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1789bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_break(&bld->exec_mask); 1790bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 179163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1792bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1793bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardif_emit( 1794bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1795bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1796bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1797bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1798bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 1799bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 180063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1801bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_NOTEQUAL, 1802bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], bld->bld_base.base.zero); 1803bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_cond_push(&bld->exec_mask, tmp); 1804bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1806bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1807bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardbgnloop_emit( 1808bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1809bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1810bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1811bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1812bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 181363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1814bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_bgnloop(&bld->exec_mask); 1815bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 181663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1817bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1818bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardbgnsub_emit( 1819bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1820bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1821bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1822bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1823bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1825bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_bgnsub(&bld->exec_mask); 1826bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1828bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1829bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardelse_emit( 1830bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1831bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1832bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1833bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1834bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 183563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1836bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_cond_invert(&bld->exec_mask); 1837bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 183863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1839bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1840bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardendif_emit( 1841bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1842bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1843bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1844bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1845bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 184663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1847bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_cond_pop(&bld->exec_mask); 1848bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 184963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1850bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1851bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardendloop_emit( 1852bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1853bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1854bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1855bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1856bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 185763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1858bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_endloop(bld_base->base.gallivm, &bld->exec_mask); 1859bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 186063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1861bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1862bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardendsub_emit( 1863bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1864bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1865bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1866bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1867bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 186863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1869bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_endsub(&bld->exec_mask, &bld_base->pc); 1870bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 187163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1872bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1873bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcont_emit( 1874bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1875bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1876bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1877bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1878bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 187963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1880bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_continue(&bld->exec_mask); 1881bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 188263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1883bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* XXX: Refactor and move it to lp_bld_tgsi_action.c 1884bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 1885bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * XXX: What do the comments about xmm registers mean? Maybe they are left over 1886bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * from old code, but there is no garauntee that LLVM will use those registers 1887bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * for this code. 1888bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 1889bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * XXX: There should be no calls to lp_build_emit_fetch in this function. This 1890bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * should be handled by the emit_data->fetch_args function. */ 1891bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1892bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardnrm_emit( 1893bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1894bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1895bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1896bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1897bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 1898bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp4 = NULL; 1899bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp5 = NULL; 1900bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp6 = NULL; 1901bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp7 = NULL; 1902bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 190363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1904bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard uint dims = (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 190563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1906bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X) || 1907bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y) || 1908bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z) || 1909bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W) && dims == 4)) { 191063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1911bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 191263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1913bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm4 = src.x */ 1914bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm0 = src.x * src.x */ 1915bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_X); 1916bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X)) { 1917bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp4 = tmp0; 19181aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 1919bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_mul( &bld->bld_base.base, tmp0, tmp0); 192063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1921bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm5 = src.y */ 1922bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm0 = xmm0 + src.y * src.y */ 1923bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_Y); 1924bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y)) { 1925bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp5 = tmp1; 1926873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 1927bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1928bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 192963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1930bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm6 = src.z */ 1931bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm0 = xmm0 + src.z * src.z */ 1932bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_Z); 1933bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z)) { 1934bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp6 = tmp1; 193563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 1936bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1937bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 19380b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 1939bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (dims == 4) { 1940bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm7 = src.w */ 1941bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm0 = xmm0 + src.w * src.w */ 1942bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_W); 1943bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W)) { 1944bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp7 = tmp1; 1945bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 1946bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1947bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 19485b294a5d17c818ecbb1295fdd20825da9b106792Brian Paul } 1949bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* xmm1 = 1 / sqrt(xmm0) */ 1950bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_rsqrt( &bld->bld_base.base, tmp0); 1951bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x = xmm1 * src.x */ 1952bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X)) { 1953bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = lp_build_mul( &bld->bld_base.base, tmp4, tmp1); 195463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 1955bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y = xmm1 * src.y */ 1956bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y)) { 1957bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_mul( &bld->bld_base.base, tmp5, tmp1); 19581aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 195963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1960bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z = xmm1 * src.z */ 1961bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z)) { 1962bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = lp_build_mul( &bld->bld_base.base, tmp6, tmp1); 196363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 1964bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w = xmm1 * src.w */ 1965bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X) && dims == 4) { 1966bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = lp_build_mul( &bld->bld_base.base, tmp7, tmp1); 196763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 1968bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 196918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 1970bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w = 1.0 */ 1971bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W) && dims == 3) { 1972bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld->bld_base.base.one; 1973bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 1974bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 19750b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 1976bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void emit_prologue(struct lp_build_tgsi_context * bld_base) 1977bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1978bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1979bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct gallivm_state * gallivm = bld_base->base.gallivm; 198063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1981bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) { 1982bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef array_size = 1983bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int32(gallivm, 1984bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->info->file_max[TGSI_FILE_TEMPORARY] * 4 + 4); 1985bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->temps_array = lp_build_array_alloca(gallivm, 1986bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.vec_type, array_size, 1987bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard "temp_array"); 1988bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 198963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1990bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 1991bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef array_size = 1992bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int32(gallivm, 1993bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->info->file_max[TGSI_FILE_OUTPUT] * 4 + 4); 1994bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->outputs_array = lp_build_array_alloca(gallivm, 1995bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.vec_type, array_size, 1996bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard "output_array"); 1997bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 199863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1999bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* If we have indirect addressing in inputs we need to copy them into 2000bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * our alloca array to be able to iterate over them */ 2001bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld->indirect_files & (1 << TGSI_FILE_INPUT)) { 2002bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned index, chan; 2003bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMTypeRef vec_type = bld_base->base.vec_type; 2004bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef array_size = lp_build_const_int32(gallivm, 2005bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->info->file_max[TGSI_FILE_INPUT]*4 + 4); 2006bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->inputs_array = lp_build_array_alloca(gallivm, 2007bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard vec_type, array_size, 2008bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard "input_array"); 200963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2010bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(bld_base->info->num_inputs 2011bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard <= bld_base->info->file_max[TGSI_FILE_INPUT] + 1); 201263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2013bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (index = 0; index < bld_base->info->num_inputs; ++index) { 2014bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) { 2015bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef lindex = 2016bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_const_int32(gallivm, index * 4 + chan); 2017bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef input_ptr = 2018bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuildGEP(gallivm->builder, bld->inputs_array, 2019bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &lindex, 1, ""); 2020bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef value = bld->inputs[index][chan]; 2021bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (value) 2022bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMBuildStore(gallivm->builder, value, input_ptr); 2023bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 202463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 2025bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 2026bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 202763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2028bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void emit_epilogue(struct lp_build_tgsi_context * bld_base) 2029bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 2030bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 2031873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 2032bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (0) { 2033bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* for debugging */ 2034bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_dump_temps(bld); 203563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 2036ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 2037bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* If we have indirect addressing in outputs we need to copy our alloca array 2038bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * to the outputs slots specified by the called */ 2039bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 2040bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned index, chan; 2041bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard assert(bld_base->info->num_outputs <= 2042bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->info->file_max[TGSI_FILE_OUTPUT] + 1); 2043bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (index = 0; index < bld_base->info->num_outputs; ++index) { 2044bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) { 2045bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld->outputs[index][chan] = lp_get_output_ptr(bld, index, chan); 2046bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 2047faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 2048faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 204963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 205063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2051c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 2052efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_tgsi_soa(struct gallivm_state *gallivm, 205363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 2054b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 20553d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 205663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 2057c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert const struct lp_bld_tgsi_system_values *system_values, 2058f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 2059bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS], 2060bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS], 2061021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct lp_build_sampler_soa *sampler, 20623f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul const struct tgsi_shader_info *info) 206363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 206463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 206563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 20666d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca struct lp_type res_type; 20676d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca 20686d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca assert(type.length <= LP_MAX_VECTOR_LENGTH); 20696d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca memset(&res_type, 0, sizeof res_type); 20706d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca res_type.width = type.width; 20716d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca res_type.length = type.length; 20726d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca res_type.sign = 1; 20736d173da5c84142ee64f56f4c2e9e495dc1435e91José Fonseca 207463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 207563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 2076bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_context_init(&bld.bld_base.base, gallivm, type); 207766461aa249a95053fd5887df75ab791558c3a486Dave Airlie lp_build_context_init(&bld.bld_base.uint_bld, gallivm, lp_uint_type(type)); 207866461aa249a95053fd5887df75ab791558c3a486Dave Airlie lp_build_context_init(&bld.bld_base.int_bld, gallivm, lp_int_type(type)); 2079efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_context_init(&bld.elem_bld, gallivm, lp_elem_type(type)); 2080c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 2081f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 2082f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 208363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 208463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 20858be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 2086bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.info = info; 20873662afd87d61e3f65843b210a7e8c9c8a6cb27f0Brian Paul bld.indirect_files = info->indirect_files; 20880b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 2089bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.soa = TRUE; 2090bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_fetch_funcs[TGSI_FILE_CONSTANT] = emit_fetch_constant; 2091bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_fetch_funcs[TGSI_FILE_IMMEDIATE] = emit_fetch_immediate; 2092bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_fetch_funcs[TGSI_FILE_INPUT] = emit_fetch_input; 2093bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_fetch_funcs[TGSI_FILE_TEMPORARY] = emit_fetch_temporary; 2094bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_fetch_funcs[TGSI_FILE_SYSTEM_VALUE] = emit_fetch_system_value; 2095bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_store = emit_store; 2096bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2097bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_declaration = lp_emit_declaration_soa; 2098bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_immediate = lp_emit_immediate_soa; 2099bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2100bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_prologue = emit_prologue; 2101bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.emit_epilogue = emit_epilogue; 2102bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2103bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* Set opcode actions */ 2104bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_set_default_actions_cpu(&bld.bld_base); 2105bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2106bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_BGNLOOP].emit = bgnloop_emit; 2107bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_BGNSUB].emit = bgnsub_emit; 2108bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_BRK].emit = brk_emit; 2109bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_CAL].emit = cal_emit; 2110bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_CONT].emit = cont_emit; 2111bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_DDX].emit = ddx_emit; 2112bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_DDY].emit = ddy_emit; 2113bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_ELSE].emit = else_emit; 2114bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_ENDIF].emit = endif_emit; 2115bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_ENDLOOP].emit = endloop_emit; 2116bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_ENDSUB].emit = endsub_emit; 2117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_IF].emit = if_emit; 2118bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_KIL].emit = kil_emit; 2119bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_KILP].emit = kilp_emit; 2120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_NRM].emit = nrm_emit; 2121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_NRM4].emit = nrm_emit; 2122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_RET].emit = ret_emit; 2123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_TEX].emit = tex_emit; 2124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_TXB].emit = txb_emit; 2125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_TXD].emit = txd_emit; 2126bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_TXL].emit = txl_emit; 2127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld.bld_base.op_actions[TGSI_OPCODE_TXP].emit = txp_emit; 21285d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert bld.bld_base.op_actions[TGSI_OPCODE_TXQ].emit = txq_emit; 2129bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_exec_mask_init(&bld.exec_mask, &bld.bld_base.base); 213163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2132c790c2c7598dea2d5a5b0bfbe47732956e1e89a6Olivier Galibert bld.system_values = *system_values; 21331d6f3543a063ab9e740fd0c149dcce26c282d773Brian Paul 2134bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_tgsi_llvm(&bld.bld_base, tokens); 2135528c3cd24169c6b6c0da60cb2b8f765eb7f05cdcZack Rusin 213618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 2137efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBasicBlockRef block = LLVMGetInsertBlock(gallivm->builder); 213818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 2139263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca debug_printf("11111111111111111111111111111 \n"); 214018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 21418ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca lp_debug_dump_value(function); 2142263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca debug_printf("2222222222222222222222222222 \n"); 214318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 21440b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 21450b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (0) { 21460b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMModuleRef module = LLVMGetGlobalParent( 21476299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul LLVMGetBasicBlockParent(LLVMGetInsertBlock(gallivm->builder))); 21480b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMDumpModule(module); 21490b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 21500b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 215163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 2152