1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TGSI to LLVM IR translation -- SoA. 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jfonseca@vmware.com> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell, 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Brian Paul, and others. 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_config.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_exec.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_info.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_parse.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_util.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_scan.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_tgsi_action.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_type.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_const.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_arit.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_bitarit.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_gather.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_init.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_logic.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_swizzle.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_flow.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_quad.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_tgsi.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_limits.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_debug.h" 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_printf.h" 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_sample.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef int_type = LLVMInt32TypeInContext(bld->gallivm->context); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->bld = bld; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->has_mask = FALSE; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_stack_size = 0; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack_size = 0; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack_size = 0; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->int_vec_type = lp_build_int_vec_type(bld->gallivm, mask->bld->type); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask = mask->ret_mask = mask->break_mask = mask->cont_mask = mask->cond_mask = 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstAllOnes(mask->int_vec_type); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_limiter = lp_build_alloca(bld->gallivm, int_type, "looplimiter"); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore( 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstInt(int_type, LP_MAX_TGSI_LOOP_ITERATIONS, false), 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_limiter); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->loop_stack_size) { 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*for loops we need to update the entire mask at runtime */ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->break_mask); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = LLVMBuildAnd(builder, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cont_mask, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_mask, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "maskcb"); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask = LLVMBuildAnd(builder, 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_mask, 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp, 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "maskfull"); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask = mask->cond_mask; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->call_stack_size) { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask = LLVMBuildAnd(builder, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->ret_mask, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "callmask"); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->has_mask = (mask->cond_stack_size > 0 || 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack_size > 0 || 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack_size > 0); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef val) 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->cond_stack_size == 0) { 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->cond_mask == LLVMConstAllOnes(mask->int_vec_type)); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(LLVMTypeOf(val) == mask->int_vec_type); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_mask = LLVMBuildAnd(builder, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_mask, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ""); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef prev_mask; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef inv_mask; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->cond_stack_size); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->cond_stack_size == 1) { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(prev_mask == LLVMConstAllOnes(mask->int_vec_type)); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inv_mask = LLVMBuildNot(builder, mask->cond_mask, ""); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_mask = LLVMBuildAnd(builder, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inv_mask, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prev_mask, ""); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->cond_stack_size); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->loop_stack_size == 0) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->loop_block == NULL); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->cont_mask == LLVMConstAllOnes(mask->int_vec_type)); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->break_mask == LLVMConstAllOnes(mask->int_vec_type)); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->break_var == NULL); 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->loop_stack_size < LP_MAX_TGSI_NESTING); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack[mask->loop_stack_size].loop_block = mask->loop_block; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack[mask->loop_stack_size].cont_mask = mask->cont_mask; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack[mask->loop_stack_size].break_mask = mask->break_mask; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_stack[mask->loop_stack_size].break_var = mask->break_var; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++mask->loop_stack_size; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_var = lp_build_alloca(mask->bld->gallivm, mask->int_vec_type, ""); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, mask->break_mask, mask->break_var); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_block = lp_build_insert_new_block(mask->bld->gallivm, "bgnloop"); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildBr(builder, mask->loop_block); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMPositionBuilderAtEnd(builder, mask->loop_block); 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_mask = LLVMBuildLoad(builder, mask->break_var, ""); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_break(struct lp_exec_mask *mask) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef exec_mask = LLVMBuildNot(builder, 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask, 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "break"); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_mask = LLVMBuildAnd(builder, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_mask, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_mask, "break_full"); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_continue(struct lp_exec_mask *mask) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef exec_mask = LLVMBuildNot(builder, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ""); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cont_mask = LLVMBuildAnd(builder, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cont_mask, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_mask, ""); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_endloop(struct gallivm_state *gallivm, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_exec_mask *mask) 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBasicBlockRef endloop; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef int_type = LLVMInt32TypeInContext(mask->bld->gallivm->context); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef reg_type = LLVMIntTypeInContext(gallivm->context, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->bld->type.width * 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->bld->type.length); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i1cond, i2cond, icond, limiter; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->break_mask); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Restore the cont_mask, but don't pop 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->loop_stack_size); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cont_mask = mask->loop_stack[mask->loop_stack_size - 1].cont_mask; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unlike the continue mask, the break_mask must be preserved across loop 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * iterations 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, mask->break_mask, mask->break_var); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Decrement the loop limiter */ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limiter = LLVMBuildLoad(builder, mask->loop_limiter, ""); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limiter = LLVMBuildSub( 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder, 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limiter, 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstInt(int_type, 1, false), 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ""); 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, limiter, mask->loop_limiter); 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* i1cond = (mask != 0) */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i1cond = LLVMBuildICmp( 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMIntNE, 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildBitCast(builder, mask->exec_mask, reg_type, ""), 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstNull(reg_type), ""); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* i2cond = (looplimiter > 0) */ 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i2cond = LLVMBuildICmp( 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org builder, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMIntSGT, 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org limiter, 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstNull(int_type), ""); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if( i1cond && i2cond ) */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icond = LLVMBuildAnd(builder, i1cond, i2cond, ""); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org endloop = lp_build_insert_new_block(mask->bld->gallivm, "endloop"); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildCondBr(builder, 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icond, mask->loop_block, endloop); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMPositionBuilderAtEnd(builder, endloop); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->loop_stack_size); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org --mask->loop_stack_size; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->loop_block = mask->loop_stack[mask->loop_stack_size].loop_block; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->cont_mask = mask->loop_stack[mask->loop_stack_size].cont_mask; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_mask = mask->loop_stack[mask->loop_stack_size].break_mask; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->break_var = mask->loop_stack[mask->loop_stack_size].break_var; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* stores val into an address pointed to by dst. 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mask->exec_mask is used to figure out which bits of val 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should be stored into the address 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (0 means don't store this bit, 1 means do store). 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *bld_store, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pred, 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef val, 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef dst) 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mix the predicate and execution mask */ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->has_mask) { 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pred) { 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred = LLVMBuildAnd(builder, pred, mask->exec_mask, ""); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred = mask->exec_mask; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pred) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef real_val, dst_val; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_val = LLVMBuildLoad(builder, dst, ""); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org real_val = lp_build_select(bld_store, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val, dst_val); 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, real_val, dst); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, val, dst); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_call(struct lp_exec_mask *mask, 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int func, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *pc) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->call_stack_size < LP_MAX_TGSI_NESTING); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack[mask->call_stack_size].pc = *pc; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack[mask->call_stack_size].ret_mask = mask->ret_mask; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack_size++; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pc = func; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_ret(struct lp_exec_mask *mask, int *pc) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = mask->bld->gallivm->builder; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef exec_mask; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->call_stack_size == 0) { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* returning from main() */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pc = -1; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_mask = LLVMBuildNot(builder, 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->exec_mask, 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "ret"); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->ret_mask = LLVMBuildAnd(builder, 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->ret_mask, 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exec_mask, "ret_full"); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_bgnsub(struct lp_exec_mask *mask) 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void lp_exec_mask_endsub(struct lp_exec_mask *mask, int *pc) 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mask->call_stack_size); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->call_stack_size--; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pc = mask->call_stack[mask->call_stack_size].pc; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask->ret_mask = mask->call_stack[mask->call_stack_size].ret_mask; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_update(mask); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to a temporary register channel (src or dest). 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that indirect addressing cannot be handled here. 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param index which temporary register 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param chan which channel of the temp register. 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLLVMValueRef 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_get_temp_ptr_soa(struct lp_build_tgsi_soa_context *bld, 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index, 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(chan < 4); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) { 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lindex = lp_build_const_int32(bld->bld_base.base.gallivm, index * 4 + chan); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return LLVMBuildGEP(builder, bld->temps_array, &lindex, 1, ""); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bld->temps[index][chan]; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to a output register channel (src or dest). 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that indirect addressing cannot be handled here. 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param index which output register 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param chan which channel of the output register. 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLLVMValueRef 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_get_output_ptr(struct lp_build_tgsi_soa_context *bld, 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index, 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(chan < 4); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lindex = lp_build_const_int32(bld->bld_base.base.gallivm, 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index * 4 + chan); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return LLVMBuildGEP(builder, bld->outputs_array, &lindex, 1, ""); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bld->outputs[index][chan]; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gather vector. 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX the lp_build_gather() function should be capable of doing this 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * with a little work. 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbuild_gather(struct lp_build_context *bld, 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef base_ptr, 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indexes) 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res = bld->undef; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Loop over elements of index_vec, load scalar value, insert it into 'res'. 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < bld->type.length; i++) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ii = lp_build_const_int32(bld->gallivm, i); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index = LLVMBuildExtractElement(builder, 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indexes, ii, ""); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, base_ptr, 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &index, 1, "gather_ptr"); 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef scalar = LLVMBuildLoad(builder, scalar_ptr, ""); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildInsertElement(builder, res, scalar, ii, ""); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Scatter/store vector. 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_mask_scatter(struct lp_build_tgsi_soa_context *bld, 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef base_ptr, 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indexes, 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef values, 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_exec_mask *mask, 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pred) 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mix the predicate and execution mask */ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask->has_mask) { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pred) { 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred = LLVMBuildAnd(builder, pred, mask->exec_mask, ""); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred = mask->exec_mask; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Loop over elements of index_vec, store scalar value. 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < bld->bld_base.base.type.length; i++) { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ii = lp_build_const_int32(gallivm, i); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index = LLVMBuildExtractElement(builder, indexes, ii, ""); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef scalar_ptr = LLVMBuildGEP(builder, base_ptr, &index, 1, "scatter_ptr"); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef val = LLVMBuildExtractElement(builder, values, ii, "scatter_val"); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef scalar_pred = pred ? 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildExtractElement(builder, pred, ii, "scatter_pred") : NULL; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, "scatter %d: val %f at %d %p\n", 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii, val, index, scalar_ptr); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (scalar_pred) { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef real_val, dst_val; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_val = LLVMBuildLoad(builder, scalar_ptr, ""); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org real_val = lp_build_select(&bld->elem_bld, scalar_pred, val, dst_val); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, real_val, scalar_ptr); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, val, scalar_ptr); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Read the current value of the ADDR register, convert the floats to 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ints, add the base index and return the vector of offsets. 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The offsets will be used to index into the constant buffer or 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * temporary register file. 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_indirect_index(struct lp_build_tgsi_soa_context *bld, 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned reg_file, unsigned reg_index, 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_src_register *indirect_reg) 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *uint_bld = &bld->bld_base.uint_bld; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* always use X component of address register */ 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle = indirect_reg->SwizzleX; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef base; 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef rel; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef max_index; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bld->indirect_files & (1 << reg_file)); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base = lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, reg_index); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(swizzle < 4); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rel = LLVMBuildLoad(builder, 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->addr[indirect_reg->Index][swizzle], 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "load addr reg"); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = lp_build_add(uint_bld, base, rel); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max_index = lp_build_const_int_vec(bld->bld_base.base.gallivm, 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint_bld->type, 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.info->file_max[reg_file]); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!uint_bld->type.sign); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = lp_build_min(uint_bld, index, max_index); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return index; 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct lp_build_context * 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstype_to_fetch(struct lp_build_tgsi_context * bld_base, 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *bld_fetch; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (stype) { 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_FLOAT: 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNTYPED: 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_fetch = &bld_base->base; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNSIGNED: 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_fetch = &bld_base->uint_bld; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_SIGNED: 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_fetch = &bld_base->int_bld; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_VOID: 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_DOUBLE: 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_fetch = NULL; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bld_fetch; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_constant( 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register * reg, 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype, 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle) 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld_base->base.gallivm; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *uint_bld = &bld_base->uint_bld; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indirect_index = NULL; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *bld_fetch = stype_to_fetch(bld_base, stype); 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: Handle fetching xyzw components as a vector */ 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(swizzle != ~0); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indirect_index = get_indirect_index(bld, 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.File, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.Index, 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ®->Indirect); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef swizzle_vec = 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, swizzle); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index_vec; /* index into the const buffer */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* index_vec = indirect_index * 4 + swizzle */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Gather values from the constant buffer */ 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return build_gather(bld_fetch, bld->consts_ptr, index_vec); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index; /* index into the const buffer */ 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef scalar, scalar_ptr; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = lp_build_const_int32(gallivm, reg->Register.Index*4 + swizzle); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scalar_ptr = LLVMBuildGEP(builder, bld->consts_ptr, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &index, 1, ""); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stype != TGSI_TYPE_FLOAT && stype != TGSI_TYPE_UNTYPED) { 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef ivtype = LLVMPointerType(LLVMInt32TypeInContext(gallivm->context), 0); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temp_ptr; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = LLVMBuildBitCast(builder, scalar_ptr, ivtype, ""); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scalar = LLVMBuildLoad(builder, temp_ptr, ""); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scalar = LLVMBuildLoad(builder, scalar_ptr, ""); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return lp_build_broadcast_scalar(bld_fetch, scalar); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_immediate( 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register * reg, 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype, 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle) 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res = bld->immediates[reg->Register.Index][swizzle]; 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stype == TGSI_TYPE_UNSIGNED) { 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMConstBitCast(res, bld_base->uint_bld.vec_type); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (stype == TGSI_TYPE_SIGNED) { 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMConstBitCast(res, bld_base->int_bld.vec_type); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_input( 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register * reg, 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype, 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle) 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *uint_bld = &bld_base->uint_bld; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indirect_index = NULL; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res; 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indirect_index = get_indirect_index(bld, 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.File, 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.Index, 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ®->Indirect); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef swizzle_vec = 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, swizzle); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_vec = 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, bld->bld_base.base.type.length); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index_vec; /* index into the const buffer */ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef inputs_array; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef float4_ptr_type; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* index_vec = (indirect_index * 4 + swizzle) * length */ 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cast inputs_array pointer to float* */ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float4_ptr_type = LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inputs_array = LLVMBuildBitCast(builder, bld->inputs_array, 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float4_ptr_type, ""); 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Gather values from the temporary register array */ 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = build_gather(&bld_base->base, inputs_array, index_vec); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_INPUT)) { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lindex = lp_build_const_int32(gallivm, 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.Index * 4 + swizzle); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef input_ptr = LLVMBuildGEP(builder, 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->inputs_array, &lindex, 1, ""); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildLoad(builder, input_ptr, ""); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = bld->inputs[reg->Register.Index][swizzle]; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(res); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stype == TGSI_TYPE_UNSIGNED) { 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildBitCast(builder, res, bld_base->uint_bld.vec_type, ""); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (stype == TGSI_TYPE_SIGNED) { 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildBitCast(builder, res, bld_base->int_bld.vec_type, ""); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_temporary( 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register * reg, 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype, 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle) 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *uint_bld = &bld_base->uint_bld; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indirect_index = NULL; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indirect_index = get_indirect_index(bld, 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.File, 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.Index, 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ®->Indirect); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef swizzle_vec = 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, swizzle); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_vec = 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(bld->bld_base.base.gallivm, uint_bld->type, 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.type.length); 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index_vec; /* index into the const buffer */ 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temps_array; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef float4_ptr_type; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* index_vec = (indirect_index * 4 + swizzle) * length */ 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, swizzle_vec); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* cast temps_array pointer to float* */ 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float4_ptr_type = LLVMPointerType(LLVMFloatTypeInContext(bld->bld_base.base.gallivm->context), 0); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temps_array = LLVMBuildBitCast(builder, bld->temps_array, 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float4_ptr_type, ""); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Gather values from the temporary register array */ 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = build_gather(&bld_base->base, temps_array, index_vec); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temp_ptr; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stype != TGSI_TYPE_FLOAT && stype != TGSI_TYPE_UNTYPED) { 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef itype = LLVMPointerType(bld->bld_base.int_bld.vec_type, 0); 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = LLVMBuildBitCast(builder, tint_ptr, itype, ""); 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, swizzle); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildLoad(builder, temp_ptr, ""); 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!res) 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bld->bld_base.base.undef; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_system_value( 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register * reg, 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type stype, 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle) 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_shader_info *info = bld->bld_base.info; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type atype; // Actual type of the value 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!reg->Register.Indirect); 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (info->system_value_semantic_name[reg->Register.Index]) { 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_INSTANCEID: 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = lp_build_broadcast_scalar(&bld_base->uint_bld, bld->system_values.instance_id); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org atype = TGSI_TYPE_UNSIGNED; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_VERTEXID: 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = bld->system_values.vertex_id; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org atype = TGSI_TYPE_UNSIGNED; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"unexpected semantic in emit_fetch_system_value"); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = bld_base->base.zero; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org atype = TGSI_TYPE_FLOAT; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (atype != stype) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stype == TGSI_TYPE_FLOAT) { 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildBitCast(builder, res, bld_base->base.vec_type, ""); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (stype == TGSI_TYPE_UNSIGNED) { 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildBitCast(builder, res, bld_base->uint_bld.vec_type, ""); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (stype == TGSI_TYPE_SIGNED) { 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildBitCast(builder, res, bld_base->int_bld.vec_type, ""); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return res; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Register fetch with derivatives. 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_deriv( 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context *bld, 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef src, 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *res, 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *ddx, 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *ddy) 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(res) 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *res = src; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: use interpolation coeffs for inputs */ 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ddx) 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ddx = lp_build_ddx(&bld->bld_base.base, src); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ddy) 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ddy = lp_build_ddy(&bld->bld_base.base, src); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Predicate. 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_fetch_predicate( 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context *bld, 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *inst, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *pred) 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char swizzles[4]; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL}; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef value; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!inst->Instruction.Predicate) { 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_FOR_EACH_CHANNEL( chan ) { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred[chan] = NULL; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzles[0] = inst->Predicate.SwizzleX; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzles[1] = inst->Predicate.SwizzleY; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzles[2] = inst->Predicate.SwizzleZ; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzles[3] = inst->Predicate.SwizzleW; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index = inst->Predicate.Index; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(index < LP_MAX_TGSI_PREDS); 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_FOR_EACH_CHANNEL( chan ) { 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle = swizzles[chan]; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only fetch the predicate register channels that are actually listed 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the swizzles 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!unswizzled[swizzle]) { 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = LLVMBuildLoad(builder, 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->preds[index][swizzle], ""); 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert the value to an integer mask. 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TODO: Short-circuit this comparison -- a D3D setp_xx instructions 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is needlessly causing two comparisons due to storing the intermediate 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * result as float vector instead of an integer mask vector. 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = lp_build_compare(bld->bld_base.base.gallivm, 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.type, 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_FUNC_NOTEQUAL, 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value, 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.zero); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->Predicate.Negate) { 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = LLVMBuildNot(builder, value, ""); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unswizzled[swizzle] = value; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = unswizzled[swizzle]; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pred[chan] = value; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Register store. 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_store_chan( 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context *bld_base, 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *inst, 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index, 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan_index, 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pred, 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef value) 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *uint_bld = &bld_base->uint_bld; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indirect_index = NULL; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *bld_store; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum tgsi_opcode_type dtype = tgsi_opcode_infer_dst_type(inst->Instruction.Opcode); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dtype) { 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_FLOAT: 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNTYPED: 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_store = &bld_base->base; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNSIGNED: 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_store = &bld_base->uint_bld; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_SIGNED: 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_store = &bld_base->int_bld; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_DOUBLE: 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_VOID: 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_store = NULL; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch( inst->Instruction.Saturate ) { 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_NONE: 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_ZERO_ONE: 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = lp_build_max(&bld->bld_base.base, value, bld->bld_base.base.zero); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one); 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_MINUS_PLUS_ONE: 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 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)); 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org indirect_index = get_indirect_index(bld, 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.File, 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->Register.Index, 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ®->Indirect); 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg->Register.Index <= 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.info->file_max[reg->Register.File]); 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch( reg->Register.File ) { 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef chan_vec = 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, chan_index); 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_vec = 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, bld->bld_base.base.type.length); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index_vec; /* indexes into the temp registers */ 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef outputs_array; 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pixel_offsets; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef float_ptr_type; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* build pixel offset vector: {0, 1, 2, 3, ...} */ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel_offsets = uint_bld->undef; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < bld->bld_base.base.type.length; i++) { 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ii = lp_build_const_int32(gallivm, i); 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets, 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii, ii, ""); 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */ 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, chan_vec); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ptr_type = 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org outputs_array = LLVMBuildBitCast(builder, bld->outputs_array, 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ptr_type, ""); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scatter store values into temp registers */ 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_mask_scatter(bld, outputs_array, index_vec, value, 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &bld->exec_mask, pred); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef out_ptr = lp_get_output_ptr(bld, reg->Register.Index, 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan_index); 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, out_ptr); 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->Register.Indirect) { 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef chan_vec = 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, chan_index); 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_vec = 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int_vec(gallivm, uint_bld->type, 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.type.length); 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index_vec; /* indexes into the temp registers */ 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temps_array; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pixel_offsets; 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef float_ptr_type; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* build pixel offset vector: {0, 1, 2, 3, ...} */ 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel_offsets = uint_bld->undef; 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < bld->bld_base.base.type.length; i++) { 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ii = lp_build_const_int32(gallivm, i); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pixel_offsets = LLVMBuildInsertElement(builder, pixel_offsets, 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ii, ii, ""); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* index_vec = (indirect_index * 4 + chan_index) * length + offsets */ 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_shl_imm(uint_bld, indirect_index, 2); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, chan_vec); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_mul(uint_bld, index_vec, length_vec); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index_vec = lp_build_add(uint_bld, index_vec, pixel_offsets); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ptr_type = 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMPointerType(LLVMFloatTypeInContext(gallivm->context), 0); 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temps_array = LLVMBuildBitCast(builder, bld->temps_array, 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float_ptr_type, ""); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Scatter store values into temp registers */ 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_mask_scatter(bld, temps_array, index_vec, value, 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &bld->exec_mask, pred); 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temp_ptr; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dtype) { 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNSIGNED: 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_SIGNED: { 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef itype = bld_base->int_bld.vec_type; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef ivtype = LLVMPointerType(itype, 0); 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tint_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan_index); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temp_value_ptr; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = LLVMBuildBitCast(builder, tint_ptr, ivtype, ""); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_value_ptr = LLVMBuildBitCast(builder, value, itype, ""); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org value = temp_value_ptr; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_FLOAT: 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TYPE_UNTYPED: 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = lp_get_temp_ptr_soa(bld, reg->Register.Index, 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan_index); 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, temp_ptr); 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dtype == TGSI_TYPE_SIGNED); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(LLVMTypeOf(value) == bld_base->base.int_vec_type); 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->addr[reg->Register.Index][chan_index]); 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_PREDICATE: 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_store(&bld->exec_mask, bld_store, pred, value, 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->preds[reg->Register.Index][chan_index]); 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert( 0 ); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_store( 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction * inst, 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_opcode_info * info, 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef dst[4]) 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan_index; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(info->num_dst) { 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef pred[TGSI_NUM_CHANNELS]; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_fetch_predicate( bld, inst, pred ); 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_store_chan(bld_base, inst, 0, chan_index, pred[chan_index], dst[chan_index]); 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * High-level instruction translators. 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_tex( struct lp_build_tgsi_soa_context *bld, 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *inst, 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum lp_build_tex_modifier modifier, 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *texel) 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_bias, explicit_lod; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef oow = NULL; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coords[3]; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_derivatives derivs; 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_coords; 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dims; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bld->sampler) { 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("warning: found texture instruction but no sampler generator supplied\n"); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) { 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel[i] = bld->bld_base.base.undef; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[0] = bld->bld_base.base.undef; 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[1] = bld->bld_base.base.undef; 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst->Texture.Texture) { 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D: 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 1; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 1; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D_ARRAY: 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 2; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 1; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D: 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_RECT: 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 2; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 2; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D: 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D_ARRAY: 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 3; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 1; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D: 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOWRECT: 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D_ARRAY: 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_CUBE: 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 3; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 2; 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_3D: 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 3; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 3; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D_ARRAY: 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 4; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 2; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == LP_BLD_TEX_MODIFIER_LOD_BIAS) { 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_bias = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod = NULL; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_LOD) { 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_bias = NULL; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_bias = NULL; 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod = NULL; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == LP_BLD_TEX_MODIFIER_PROJECTED) { 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oow = lp_build_emit_fetch( &bld->bld_base, inst, 0, 3 ); 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oow = lp_build_rcp(&bld->bld_base.base, oow); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_coords; i++) { 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[i] = lp_build_emit_fetch( &bld->bld_base, inst, 0, i ); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == LP_BLD_TEX_MODIFIER_PROJECTED) 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[i] = lp_build_mul(&bld->bld_base.base, coords[i], oow); 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = num_coords; i < 3; i++) { 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[i] = bld->bld_base.base.undef; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV) { 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i32undef = LLVMGetUndef(LLVMInt32TypeInContext(gallivm->context)); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef shuffles[LP_MAX_VECTOR_LENGTH]; 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ddxdyonec[3]; 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned length = bld->bld_base.base.type.length; 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_quads = length / 4; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dim; 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned quad; 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (dim = 0; dim < dims; ++dim) { 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef srcx = lp_build_emit_fetch( &bld->bld_base, inst, 1, dim ); 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef srcy = lp_build_emit_fetch( &bld->bld_base, inst, 2, dim ); 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (quad = 0; quad < num_quads; ++quad) { 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s1 = 4*quad; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s2 = 4*quad + length; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 0] = lp_build_const_int32(gallivm, s1); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 1] = lp_build_const_int32(gallivm, s2); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 2] = i32undef; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 3] = i32undef; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ddxdyonec[dim] = LLVMBuildShuffleVector(builder, srcx, srcy, 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstVector(shuffles, length), ""); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 1) { 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[0] = ddxdyonec[0]; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dims >= 2) { 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (quad = 0; quad < num_quads; ++quad) { 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s1 = 4*quad; 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned s2 = 4*quad + length; 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 0] = lp_build_const_int32(gallivm, s1); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 1] = lp_build_const_int32(gallivm, s1 + 1); 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 2] = lp_build_const_int32(gallivm, s2); 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shuffles[4*quad + 3] = lp_build_const_int32(gallivm, s2 + 1); 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[0] = LLVMBuildShuffleVector(builder, ddxdyonec[0], ddxdyonec[1], 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstVector(shuffles, length), ""); 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3) { 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[1] = ddxdyonec[2]; 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unit = inst->Src[3].Register.Index; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 1) { 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[0] = lp_build_packed_ddx_ddy_onecoord(&bld->bld_base.base, coords[0]); 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dims >= 2) { 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[0] = lp_build_packed_ddx_ddy_twocoord(&bld->bld_base.base, 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords[0], coords[1]); 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3) { 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs.ddx_ddy[1] = lp_build_packed_ddx_ddy_onecoord(&bld->bld_base.base, coords[2]); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unit = inst->Src[1].Register.Index; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->sampler->emit_fetch_texel(bld->sampler, 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.gallivm, 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.type, 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unit, num_coords, coords, 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &derivs, 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_bias, explicit_lod, 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel); 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_txq( struct lp_build_tgsi_soa_context *bld, 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *inst, 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *sizes_out) 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef explicit_lod; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_coords, has_lod; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (inst->Texture.Texture) { 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D: 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D: 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D: 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOWCUBE: 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 1; 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_lod = 1; 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D: 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_CUBE: 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D_ARRAY: 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D_ARRAY: 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 2; 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_lod = 1; 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_3D: 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case TGSI_TEXTURE_CUBE_ARRAY: 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case TGSI_TEXTURE_SHADOWCUBE_ARRAY: 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D_ARRAY: 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW2D_ARRAY: 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 3; 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_lod = 1; 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_BUFFER: 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 1; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_lod = 0; 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_RECT: 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOWRECT: 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case TGSI_TEXTURE_2D_MS: 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords = 2; 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org has_lod = 0; 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case TGSI_TEXTURE_2D_MS_ARRAY: 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// num_coords = 3; 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// has_lod = 0; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// break; 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bld->sampler) { 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("warning: found texture query instruction but no sampler generator supplied\n"); 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_coords; i++) 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizes_out[i] = bld->bld_base.base.undef; 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (has_lod) 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod = lp_build_emit_fetch( &bld->bld_base, inst, 0, 2 ); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod = NULL; 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->sampler->emit_size_query(bld->sampler, 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.base.gallivm, 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->bld_base.int_bld.type, 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Src[1].Register.Index, 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org explicit_lod, 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizes_out); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnear_end_of_shader(struct lp_build_tgsi_soa_context *bld, 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pc) 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 5; i++) { 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned opcode; 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pc + i >= bld->bld_base.info->num_instructions) 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode = bld->bld_base.instructions[pc + i].Instruction.Opcode; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opcode == TGSI_OPCODE_END) 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opcode == TGSI_OPCODE_TEX || 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXP || 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXD || 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXB || 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXL || 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXF || 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_TXQ || 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_CAL || 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_CALLNZ || 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_IF || 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_IFC || 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_BGNLOOP || 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opcode == TGSI_OPCODE_SWITCH) 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Kill fragment if any of the src register values are negative. 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_kil( 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context *bld, 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *inst, 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pc) 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register *reg = &inst->Src[0]; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef terms[TGSI_NUM_CHANNELS]; 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef mask; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan_index; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&terms, 0, sizeof terms); 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_FOR_EACH_CHANNEL( chan_index ) { 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned swizzle; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Unswizzle channel */ 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check if the component has not been already tested. */ 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(swizzle < TGSI_NUM_CHANNELS); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if( !terms[swizzle] ) 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: change the comparison operator instead of setting the sign */ 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org terms[swizzle] = lp_build_emit_fetch(&bld->bld_base, inst, 0, chan_index ); 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = NULL; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_FOR_EACH_CHANNEL( chan_index ) { 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(terms[chan_index]) { 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef chan_mask; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If term < 0 then mask = 0 else mask = ~0. 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org chan_mask = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->bld_base.base.zero); 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(mask) 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = LLVMBuildAnd(builder, mask, chan_mask, ""); 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = chan_mask; 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(mask) { 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mask_update(bld->mask, mask); 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!near_end_of_shader(bld, pc)) 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mask_check(bld->mask); 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Predicated fragment kill. 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The only predication is the execution mask which will apply if 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we're inside a loop or conditional. 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_kilp(struct lp_build_tgsi_soa_context *bld, 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int pc) 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef mask; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For those channels which are "alive", disable fragment shader 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * execution. 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->exec_mask.has_mask) { 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = LLVMBuildNot(builder, bld->exec_mask.exec_mask, "kilp"); 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef zero = LLVMConstNull(bld->bld_base.base.int_vec_type); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = zero; 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mask_update(bld->mask, mask); 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!near_end_of_shader(bld, pc)) 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mask_check(bld->mask); 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Emit code which will dump the value of all the temporary registers 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to stdout. 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgemit_dump_temps(struct lp_build_tgsi_soa_context *bld) 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef temp_ptr; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i0 = lp_build_const_int32(gallivm, 0); 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i1 = lp_build_const_int32(gallivm, 1); 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i2 = lp_build_const_int32(gallivm, 2); 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i3 = lp_build_const_int32(gallivm, 3); 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int index; 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n = bld->bld_base.info->file_max[TGSI_FILE_TEMPORARY]; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (index = 0; index < n; index++) { 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef idx = lp_build_const_int32(gallivm, index); 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef v[4][4], res; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int chan; 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, "TEMP[%d]:\n", idx); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org temp_ptr = lp_get_temp_ptr_soa(bld, index, chan); 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = LLVMBuildLoad(builder, temp_ptr, ""); 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[chan][0] = LLVMBuildExtractElement(builder, res, i0, ""); 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[chan][1] = LLVMBuildExtractElement(builder, res, i1, ""); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[chan][2] = LLVMBuildExtractElement(builder, res, i2, ""); 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[chan][3] = LLVMBuildExtractElement(builder, res, i3, ""); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, " X: %f %f %f %f\n", 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0][0], v[0][1], v[0][2], v[0][3]); 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, " Y: %f %f %f %f\n", 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[1][0], v[1][1], v[1][2], v[1][3]); 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, " Z: %f %f %f %f\n", 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[2][0], v[2][1], v[2][2], v[2][3]); 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(gallivm, " W: %f %f %f %f\n", 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[3][0], v[3][1], v[3][2], v[3][3]); 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_emit_declaration_soa( 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context *bld_base, 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_declaration *decl) 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm = bld->bld_base.base.gallivm; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef vec_type = bld->bld_base.base.vec_type; 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned first = decl->Range.First; 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned last = decl->Range.Last; 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned idx, i; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (idx = first; idx <= last; ++idx) { 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(last <= bld->bld_base.info->file_max[decl->Declaration.File]); 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (decl->Declaration.File) { 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(idx < LP_MAX_TGSI_TEMPS); 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(bld->indirect_files & (1 << TGSI_FILE_TEMPORARY))) { 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->temps[idx][i] = lp_build_alloca(gallivm, vec_type, "temp"); 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(bld->indirect_files & (1 << TGSI_FILE_OUTPUT))) { 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->outputs[idx][i] = lp_build_alloca(gallivm, 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec_type, "output"); 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ADDR registers are the only allocated with an integer LLVM IR type, 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as they are guaranteed to always have integers. 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: Not sure if this exception is worthwhile (or the whole idea of 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an ADDR register for that matter). 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(idx < LP_MAX_TGSI_ADDRS); 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->addr[idx][i] = lp_build_alloca(gallivm, bld_base->base.int_vec_type, "addr"); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_PREDICATE: 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(idx < LP_MAX_TGSI_PREDS); 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TGSI_NUM_CHANNELS; i++) 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->preds[idx][i] = lp_build_alloca(gallivm, vec_type, 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "predicate"); 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* don't need to declare other vars */ 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_emit_immediate_soa( 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context *bld_base, 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_immediate *imm) 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context *bld = lp_soa_context(bld_base); 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state * gallivm = bld_base->base.gallivm; 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simply copy the immediate values into the next immediates[] slot */ 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint size = imm->Immediate.NrTokens - 1; 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(size <= 4); 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bld->num_immediates < LP_MAX_TGSI_IMMEDIATES); 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (imm->Immediate.DataType) { 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_FLOAT32: 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for( i = 0; i < size; ++i ) 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->immediates[bld->num_immediates][i] = 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_vec(gallivm, bld_base->base.type, imm->u[i].Float); 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_UINT32: 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for( i = 0; i < size; ++i ) { 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->uint_bld.type, imm->u[i].Uint); 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->immediates[bld->num_immediates][i] = 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstBitCast(tmp, bld_base->base.vec_type); 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_IMM_INT32: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for( i = 0; i < size; ++i ) { 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp = lp_build_const_vec(gallivm, bld_base->int_bld.type, imm->u[i].Int); 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->immediates[bld->num_immediates][i] = 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMConstBitCast(tmp, bld_base->base.vec_type); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for( i = size; i < 4; ++i ) 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->immediates[bld->num_immediates][i] = bld_base->base.undef; 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->num_immediates++; 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgddx_emit( 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_fetch_deriv(bld, emit_data->args[0], NULL, 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &emit_data->output[emit_data->chan], NULL); 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgddy_emit( 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_fetch_deriv(bld, emit_data->args[0], NULL, NULL, 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &emit_data->output[emit_data->chan]); 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgkilp_emit( 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_kilp(bld, bld_base->pc - 1); 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgkil_emit( 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_kil(bld, emit_data->inst, bld_base->pc - 1); 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtex_emit( 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_NONE, emit_data->output); 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtxb_emit( 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_LOD_BIAS, 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output); 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtxd_emit( 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV, 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output); 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtxl_emit( 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD, 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output); 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtxp_emit( 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_tex(bld, emit_data->inst, LP_BLD_TEX_MODIFIER_PROJECTED, 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output); 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtxq_emit( 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_txq(bld, emit_data->inst, emit_data->output); 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcal_emit( 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_call(&bld->exec_mask, emit_data->inst->Label.Label, 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &bld_base->pc); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgret_emit( 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_ret(&bld->exec_mask, &bld_base->pc); 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbrk_emit( 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_break(&bld->exec_mask); 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgif_emit( 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp; 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_NOTEQUAL, 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->args[0], bld->bld_base.base.zero); 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_cond_push(&bld->exec_mask, tmp); 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbgnloop_emit( 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_bgnloop(&bld->exec_mask); 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbgnsub_emit( 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_bgnsub(&bld->exec_mask); 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgelse_emit( 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_cond_invert(&bld->exec_mask); 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgendif_emit( 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_cond_pop(&bld->exec_mask); 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgendloop_emit( 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_endloop(bld_base->base.gallivm, &bld->exec_mask); 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgendsub_emit( 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_endsub(&bld->exec_mask, &bld_base->pc); 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcont_emit( 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_continue(&bld->exec_mask); 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* XXX: Refactor and move it to lp_bld_tgsi_action.c 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: What do the comments about xmm registers mean? Maybe they are left over 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from old code, but there is no garauntee that LLVM will use those registers 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for this code. 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: There should be no calls to lp_build_emit_fetch in this function. This 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * should be handled by the emit_data->fetch_args function. */ 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnrm_emit( 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_build_tgsi_action * action, 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_context * bld_base, 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_emit_data * emit_data) 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp0, tmp1; 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp4 = NULL; 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp5 = NULL; 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp6 = NULL; 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tmp7 = NULL; 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint dims = (emit_data->inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X) || 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y) || 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z) || 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W) && dims == 4)) { 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm4 = src.x */ 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm0 = src.x * src.x */ 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp0 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_X); 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X)) { 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp4 = tmp0; 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp0 = lp_build_mul( &bld->bld_base.base, tmp0, tmp0); 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm5 = src.y */ 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm0 = xmm0 + src.y * src.y */ 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_Y); 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y)) { 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp5 = tmp1; 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm6 = src.z */ 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm0 = xmm0 + src.z * src.z */ 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_Z); 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z)) { 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp6 = tmp1; 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 4) { 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm7 = src.w */ 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm0 = xmm0 + src.w * src.w */ 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_emit_fetch(&bld->bld_base, emit_data->inst, 0, TGSI_CHAN_W); 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W)) { 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp7 = tmp1; 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_mul( &bld->bld_base.base, tmp1, tmp1); 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp0 = lp_build_add( &bld->bld_base.base, tmp0, tmp1); 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* xmm1 = 1 / sqrt(xmm0) */ 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp1 = lp_build_rsqrt( &bld->bld_base.base, tmp0); 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.x = xmm1 * src.x */ 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X)) { 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output[TGSI_CHAN_X] = lp_build_mul( &bld->bld_base.base, tmp4, tmp1); 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.y = xmm1 * src.y */ 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Y)) { 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output[TGSI_CHAN_Y] = lp_build_mul( &bld->bld_base.base, tmp5, tmp1); 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.z = xmm1 * src.z */ 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_Z)) { 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output[TGSI_CHAN_Z] = lp_build_mul( &bld->bld_base.base, tmp6, tmp1); 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.w = xmm1 * src.w */ 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_X) && dims == 4) { 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output[TGSI_CHAN_W] = lp_build_mul( &bld->bld_base.base, tmp7, tmp1); 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dst.w = 1.0 */ 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (TGSI_IS_DST0_CHANNEL_ENABLED(emit_data->inst, TGSI_CHAN_W) && dims == 3) { 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_data->output[TGSI_CHAN_W] = bld->bld_base.base.one; 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_prologue(struct lp_build_tgsi_context * bld_base) 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state * gallivm = bld_base->base.gallivm; 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) { 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef array_size = 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->info->file_max[TGSI_FILE_TEMPORARY] * 4 + 4); 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->temps_array = lp_build_array_alloca(gallivm, 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->base.vec_type, array_size, 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "temp_array"); 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef array_size = 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->info->file_max[TGSI_FILE_OUTPUT] * 4 + 4); 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->outputs_array = lp_build_array_alloca(gallivm, 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->base.vec_type, array_size, 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "output_array"); 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we have indirect addressing in inputs we need to copy them into 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * our alloca array to be able to iterate over them */ 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_INPUT)) { 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index, chan; 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef vec_type = bld_base->base.vec_type; 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef array_size = lp_build_const_int32(gallivm, 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->info->file_max[TGSI_FILE_INPUT]*4 + 4); 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->inputs_array = lp_build_array_alloca(gallivm, 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vec_type, array_size, 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "input_array"); 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bld_base->info->num_inputs 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org <= bld_base->info->file_max[TGSI_FILE_INPUT] + 1); 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (index = 0; index < bld_base->info->num_inputs; ++index) { 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) { 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lindex = 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, index * 4 + chan); 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef input_ptr = 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildGEP(gallivm->builder, bld->inputs_array, 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &lindex, 1, ""); 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef value = bld->inputs[index][chan]; 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (value) 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(gallivm->builder, value, input_ptr); 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void emit_epilogue(struct lp_build_tgsi_context * bld_base) 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context * bld = lp_soa_context(bld_base); 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for debugging */ 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit_dump_temps(bld); 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we have indirect addressing in outputs we need to copy our alloca array 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the outputs slots specified by the called */ 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->indirect_files & (1 << TGSI_FILE_OUTPUT)) { 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned index, chan; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bld_base->info->num_outputs <= 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld_base->info->file_max[TGSI_FILE_OUTPUT] + 1); 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (index = 0; index < bld_base->info->num_outputs; ++index) { 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) { 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->outputs[index][chan] = lp_get_output_ptr(bld, index, chan); 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_tgsi_soa(struct gallivm_state *gallivm, 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_token *tokens, 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type type, 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_mask_context *mask, 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef consts_ptr, 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_bld_tgsi_system_values *system_values, 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const LLVMValueRef *pos, 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS], 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS], 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_sampler_soa *sampler, 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_shader_info *info) 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_tgsi_soa_context bld; 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type res_type; 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(type.length <= LP_MAX_VECTOR_LENGTH); 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&res_type, 0, sizeof res_type); 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_type.width = type.width; 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_type.length = type.length; 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res_type.sign = 1; 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup build context */ 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&bld, 0, sizeof bld); 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.bld_base.base, gallivm, type); 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.bld_base.uint_bld, gallivm, lp_uint_type(type)); 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.bld_base.int_bld, gallivm, lp_int_type(type)); 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.elem_bld, gallivm, lp_elem_type(type)); 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.mask = mask; 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.pos = pos; 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.inputs = inputs; 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.outputs = outputs; 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.consts_ptr = consts_ptr; 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.sampler = sampler; 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.info = info; 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.indirect_files = info->indirect_files; 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.soa = TRUE; 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_fetch_funcs[TGSI_FILE_CONSTANT] = emit_fetch_constant; 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_fetch_funcs[TGSI_FILE_IMMEDIATE] = emit_fetch_immediate; 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_fetch_funcs[TGSI_FILE_INPUT] = emit_fetch_input; 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_fetch_funcs[TGSI_FILE_TEMPORARY] = emit_fetch_temporary; 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_fetch_funcs[TGSI_FILE_SYSTEM_VALUE] = emit_fetch_system_value; 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_store = emit_store; 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_declaration = lp_emit_declaration_soa; 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_immediate = lp_emit_immediate_soa; 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_prologue = emit_prologue; 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.emit_epilogue = emit_epilogue; 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set opcode actions */ 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_set_default_actions_cpu(&bld.bld_base); 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_BGNLOOP].emit = bgnloop_emit; 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_BGNSUB].emit = bgnsub_emit; 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_BRK].emit = brk_emit; 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_CAL].emit = cal_emit; 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_CONT].emit = cont_emit; 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_DDX].emit = ddx_emit; 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_DDY].emit = ddy_emit; 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_ELSE].emit = else_emit; 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_ENDIF].emit = endif_emit; 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_ENDLOOP].emit = endloop_emit; 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_ENDSUB].emit = endsub_emit; 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_IF].emit = if_emit; 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_KIL].emit = kil_emit; 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_KILP].emit = kilp_emit; 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_NRM].emit = nrm_emit; 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_NRM4].emit = nrm_emit; 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_RET].emit = ret_emit; 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TEX].emit = tex_emit; 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TXB].emit = txb_emit; 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TXD].emit = txd_emit; 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TXL].emit = txl_emit; 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TXP].emit = txp_emit; 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.bld_base.op_actions[TGSI_OPCODE_TXQ].emit = txq_emit; 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_exec_mask_init(&bld.exec_mask, &bld.bld_base.base); 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.system_values = *system_values; 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_tgsi_llvm(&bld.bld_base, tokens); 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBasicBlockRef block = LLVMGetInsertBlock(gallivm->builder); 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef function = LLVMGetBasicBlockParent(block); 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("11111111111111111111111111111 \n"); 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(tokens, 0); 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_debug_dump_value(function); 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("2222222222222222222222222222 \n"); 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMModuleRef module = LLVMGetGlobalParent( 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMGetBasicBlockParent(LLVMGetInsertBlock(gallivm->builder))); 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMDumpModule(module); 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2152