1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture sampling -- SoA. 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jfonseca@vmware.com> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Brian Paul <brianp@vmware.com> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_shader_tokens.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_dump.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_cpu_detect.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_debug.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_type.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_const.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_conv.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_arit.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_bitarit.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_logic.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_printf.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_swizzle.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_flow.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_gather.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_format.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_sample.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_sample_aos.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_struct.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_quad.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_bld_pack.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate code to fetch a texel from a texture at int coords (x, y, z). 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The computation depends on whether the texture is 1D, 2D or 3D. 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The result, texel, will be float vectors: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[0] = red values 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[1] = green values 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[2] = blue values 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel[3] = alpha values 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_texel_soa(struct lp_build_sample_context *bld, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef width, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef height, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef depth, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef x, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef y, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef z, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef y_stride, 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef z_stride, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef data_ptr, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texel_out[4]) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_sampler_static_state *static_state = bld->static_state; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned dims = bld->dims; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_coord_bld = &bld->int_coord_bld; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef offset; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef i, j; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef use_border = NULL; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use_border = x < 0 || x >= width || y < 0 || y >= height */ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lp_sampler_wrap_mode_uses_border_color(static_state->wrap_s, 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->min_img_filter, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->mag_img_filter)) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef b1, b2; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b1 = lp_build_cmp(int_coord_bld, PIPE_FUNC_LESS, x, int_coord_bld->zero); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b2 = lp_build_cmp(int_coord_bld, PIPE_FUNC_GEQUAL, x, width); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, b1, b2, "b1_or_b2"); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2 && 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_sampler_wrap_mode_uses_border_color(static_state->wrap_t, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->min_img_filter, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->mag_img_filter)) { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef b1, b2; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b1 = lp_build_cmp(int_coord_bld, PIPE_FUNC_LESS, y, int_coord_bld->zero); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b2 = lp_build_cmp(int_coord_bld, PIPE_FUNC_GEQUAL, y, height); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_border) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, use_border, b1, "ub_or_b1"); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, use_border, b2, "ub_or_b2"); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, b1, b2, "b1_or_b2"); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3 && 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_sampler_wrap_mode_uses_border_color(static_state->wrap_r, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->min_img_filter, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->mag_img_filter)) { 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef b1, b2; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b1 = lp_build_cmp(int_coord_bld, PIPE_FUNC_LESS, z, int_coord_bld->zero); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b2 = lp_build_cmp(int_coord_bld, PIPE_FUNC_GEQUAL, z, depth); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_border) { 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, use_border, b1, "ub_or_b1"); 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, use_border, b2, "ub_or_b2"); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org use_border = LLVMBuildOr(builder, b1, b2, "b1_or_b2"); 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert x,y,z coords to linear offset from start of texture, in bytes */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_offset(&bld->int_coord_bld, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->format_desc, 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, z, y_stride, z_stride, 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &offset, &i, &j); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_border) { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we can sample the border color, it means that texcoords may 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lie outside the bounds of the texture image. We need to do 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * something to prevent reading out of bounds and causing a segfault. 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Simply AND the texture coords with !use_border. This will cause 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * coords which are out of bounds to become zero. Zero's guaranteed 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to be inside the texture image. 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset = lp_build_andnot(&bld->int_coord_bld, offset, use_border); 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_fetch_rgba_soa(bld->gallivm, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->format_desc, 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->texel_type, 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, offset, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i, j, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: if we find an app which frequently samples the texture border 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we might want to implement a true conditional here to avoid sampling 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the texture whenever possible (since that's quite a bit of code). 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Ex: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if (use_border) { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel = border_color; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * else { 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texel = sample_texture(coord); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As it is now, we always sample the texture, then selectively replace 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the texel color results with the border color. 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_border) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* select texel color or border color depending on use_border */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef border_color_ptr = 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->dynamic_state->border_color(bld->dynamic_state, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->gallivm, unit); 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int chan; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef border_chan = 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_array_get(bld->gallivm, border_color_ptr, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(bld->gallivm, chan)); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef border_chan_vec = 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_broadcast_scalar(&bld->float_vec_bld, border_chan); 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out[chan] = lp_build_select(&bld->texel_bld, use_border, 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border_chan_vec, texel_out[chan]); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper to compute the mirror function for the PIPE_WRAP_MIRROR modes. 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_coord_mirror(struct lp_build_sample_context *bld, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord) 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *coord_bld = &bld->coord_bld; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_coord_bld = &bld->int_coord_bld; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef fract, flr, isOdd; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &flr, &fract); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* isOdd = flr & 1 */ 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org isOdd = LLVMBuildAnd(bld->gallivm->builder, flr, int_coord_bld->one, ""); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make coord positive or negative depending on isOdd */ 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_set_sign(coord_bld, fract, isOdd); 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert isOdd to float */ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org isOdd = lp_build_int_to_float(coord_bld, isOdd); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* add isOdd to coord */ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_add(coord_bld, coord, isOdd); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return coord; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper to compute the first coord and the weight for 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * linear wrap repeat npot textures 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_coord_repeat_npot_linear(struct lp_build_sample_context *bld, 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord_f, 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_i, 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_f, 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *coord0_i, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *weight_f) 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *coord_bld = &bld->coord_bld; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_coord_bld = &bld->int_coord_bld; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef half = lp_build_const_vec(bld->gallivm, coord_bld->type, 0.5); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_minus_one = lp_build_sub(int_coord_bld, length_i, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int_coord_bld->one); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef mask; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wrap with normalized floats is just fract */ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord_f = lp_build_fract(coord_bld, coord_f); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mul by size and subtract 0.5 */ 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord_f = lp_build_mul(coord_bld, coord_f, length_f); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord_f = lp_build_sub(coord_bld, coord_f, half); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we avoided the 0.5/length division before the repeat wrap, 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * now need to fix up edge cases with selects 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord_f, coord0_i, weight_f); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = lp_build_compare(int_coord_bld->gallivm, int_coord_bld->type, 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_FUNC_LESS, *coord0_i, int_coord_bld->zero); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *coord0_i = lp_build_select(int_coord_bld, mask, length_minus_one, *coord0_i); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build LLVM code for texture wrap mode for linear filtering. 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x0_out returns first integer texcoord 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x1_out returns second integer texcoord 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param weight_out returns linear interpolation weight 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_wrap_linear(struct lp_build_sample_context *bld, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord, 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length, 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_f, 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_pot, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned wrap_mode, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *x0_out, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *x1_out, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *weight_out) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *coord_bld = &bld->coord_bld; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_coord_bld = &bld->int_coord_bld; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef half = lp_build_const_vec(bld->gallivm, coord_bld->type, 0.5); 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_minus_one = lp_build_sub(int_coord_bld, length, int_coord_bld->one); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord0, coord1, weight; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(wrap_mode) { 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_REPEAT: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_pot) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mul by size and subtract 0.5 */ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* repeat wrap */ 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord0 = LLVMBuildAnd(builder, coord0, length_minus_one, ""); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = LLVMBuildAnd(builder, coord1, length_minus_one, ""); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef mask; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_coord_repeat_npot_linear(bld, coord, 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length, length_f, 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &coord0, &weight); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = lp_build_compare(int_coord_bld->gallivm, int_coord_bld->type, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_FUNC_NOTEQUAL, coord0, length_minus_one); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = LLVMBuildAnd(builder, 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_add(int_coord_bld, coord0, int_coord_bld->one), 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask, ""); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP: 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length] */ 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_clamp(coord_bld, coord, coord_bld->zero, length_f); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context abs_coord_bld = bld->coord_bld; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abs_coord_bld.type.sign = FALSE; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mul by tex size */ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to length max */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_min(coord_bld, coord, length_f); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* subtract 0.5 */ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length - 0.5] */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_max(coord_bld, coord, coord_bld->zero); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(&abs_coord_bld, coord, &coord0, &weight); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* coord1 = min(coord1, length-1) */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_min(int_coord_bld, coord1, length_minus_one); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef min; 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* was: clamp to [-0.5, length + 0.5], then sub 0.5 */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min = lp_build_const_vec(bld->gallivm, coord_bld->type, -1.0F); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_clamp(coord_bld, coord, min, length_f); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_REPEAT: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute mirror function */ 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_coord_mirror(bld, coord); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* coord0 = max(coord0, 0) */ 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord0 = lp_build_max(int_coord_bld, coord0, int_coord_bld->zero); 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* coord1 = min(coord1, length-1) */ 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_min(int_coord_bld, coord1, length_minus_one); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_abs(coord_bld, coord); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length] */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_min(coord_bld, coord, length_f); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef min, max; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context abs_coord_bld = bld->coord_bld; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abs_coord_bld.type.sign = FALSE; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_abs(coord_bld, coord); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0.5, length - 0.5] */ 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min = half; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = lp_build_sub(coord_bld, length_f, min); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_clamp(coord_bld, coord, min, max); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(&abs_coord_bld, coord, &coord0, &weight); 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_abs(coord_bld, coord); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* was: clamp to [-0.5, length + 0.5] then sub 0.5 */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* skip -0.5 clamp (always positive), do sub first */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_sub(coord_bld, coord, half); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_min(coord_bld, coord, length_f); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* convert to int, compute lerp weight */ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_ifloor_fract(coord_bld, coord, &coord0, &weight); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = lp_build_add(int_coord_bld, coord0, int_coord_bld->one); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord0 = NULL; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord1 = NULL; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org weight = NULL; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *x0_out = coord0; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *x1_out = coord1; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *weight_out = weight; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build LLVM code for texture wrap mode for nearest filtering. 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param coord the incoming texcoord (nominally in [0,1]) 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param length the texture size along one dimension, as int vector 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param is_pot if TRUE, length is a power of two 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param wrap_mode one of PIPE_TEX_WRAP_x 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_wrap_nearest(struct lp_build_sample_context *bld, 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord, 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_f, 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean is_pot, 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned wrap_mode) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *coord_bld = &bld->coord_bld; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_coord_bld = &bld->int_coord_bld; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef length_minus_one = lp_build_sub(int_coord_bld, length, int_coord_bld->one); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef icoord; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(wrap_mode) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_REPEAT: 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_pot) { 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_ifloor(coord_bld, coord); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = LLVMBuildAnd(builder, icoord, length_minus_one, ""); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* take fraction, unnormalize */ 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_fract_safe(coord_bld, coord); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_itrunc(coord_bld, coord); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP: 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* floor */ 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use itrunc instead since we clamp to 0 anyway */ 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_itrunc(coord_bld, coord); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length - 1]. */ 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_clamp(int_coord_bld, icoord, int_coord_bld->zero, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org length_minus_one); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_CLAMP_TO_BORDER: 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: this is the same as CLAMP_TO_EDGE, except min = -1 */ 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef min, max; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_ifloor(coord_bld, coord); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [-1, length] */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min = lp_build_negate(int_coord_bld, int_coord_bld->one); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = length; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_clamp(int_coord_bld, icoord, min, max); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_REPEAT: 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute mirror function */ 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_coord_mirror(bld, coord); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bld->static_state->normalized_coords); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* itrunc == ifloor here */ 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_itrunc(coord_bld, coord); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length - 1] */ 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_min(int_coord_bld, icoord, length_minus_one); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP: 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE: 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_abs(coord_bld, coord); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* itrunc == ifloor here */ 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_itrunc(coord_bld, coord); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length - 1] */ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_min(int_coord_bld, icoord, length_minus_one); 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER: 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_abs(coord_bld, coord); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->normalized_coords) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* scale coord to length */ 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord = lp_build_mul(coord_bld, coord, length_f); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* itrunc == ifloor here */ 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_itrunc(coord_bld, coord); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clamp to [0, length] */ 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = lp_build_min(int_coord_bld, icoord, length); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org icoord = NULL; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return icoord; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate code to sample a mipmap level with nearest filtering. 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If sampling a cube texture, r = cube face in [0,5]. 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_image_nearest(struct lp_build_sample_context *bld, 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef size, 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef row_stride_vec, 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef img_stride_vec, 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef data_ptr, 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s, 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef t, 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef r, 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef colors_out[4]) 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned dims = bld->dims; 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef width_vec; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef height_vec; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef depth_vec; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_size; 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_width_vec; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_height_vec; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_depth_vec; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef x, y, z; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_extract_image_sizes(bld, 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->int_size_type, 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->int_coord_type, 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &width_vec, &height_vec, &depth_vec); 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flt_size = lp_build_int_to_float(&bld->float_size_bld, size); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_extract_image_sizes(bld, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->float_size_type, 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->coord_type, 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flt_size, 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &flt_width_vec, &flt_height_vec, &flt_depth_vec); 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute integer texcoords. 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x = lp_build_sample_wrap_nearest(bld, s, width_vec, flt_width_vec, 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_width, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_s); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(x, "tex.x.wrapped"); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2) { 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = lp_build_sample_wrap_nearest(bld, t, height_vec, flt_height_vec, 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_height, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_t); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(y, "tex.y.wrapped"); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3) { 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z = lp_build_sample_wrap_nearest(bld, r, depth_vec, flt_depth_vec, 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_depth, 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_r); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(z, "tex.z.wrapped"); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (bld->static_state->target == PIPE_TEXTURE_CUBE) { 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z = r; 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z = NULL; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y = z = NULL; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get texture colors. 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, z, 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, colors_out); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generate code to sample a mipmap level with linear filtering. 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If sampling a cube texture, r = cube face in [0,5]. 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_image_linear(struct lp_build_sample_context *bld, 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef size, 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef row_stride_vec, 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef img_stride_vec, 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef data_ptr, 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s, 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef t, 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef r, 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef colors_out[4]) 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned dims = bld->dims; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef width_vec; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef height_vec; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef depth_vec; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_size; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_width_vec; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_height_vec; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef flt_depth_vec; 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef x0, y0, z0, x1, y1, z1; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s_fpart, t_fpart, r_fpart; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef neighbors[2][2][4]; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int chan; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_extract_image_sizes(bld, 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->int_size_type, 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->int_coord_type, 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &width_vec, &height_vec, &depth_vec); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flt_size = lp_build_int_to_float(&bld->float_size_bld, size); 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_extract_image_sizes(bld, 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->float_size_type, 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->coord_type, 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flt_size, 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &flt_width_vec, &flt_height_vec, &flt_depth_vec); 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute integer texcoords. 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_wrap_linear(bld, s, width_vec, flt_width_vec, 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_width, 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_s, 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &x0, &x1, &s_fpart); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(x0, "tex.x0.wrapped"); 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(x1, "tex.x1.wrapped"); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2) { 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_wrap_linear(bld, t, height_vec, flt_height_vec, 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_height, 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_t, 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &y0, &y1, &t_fpart); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(y0, "tex.y0.wrapped"); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(y1, "tex.y1.wrapped"); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3) { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_wrap_linear(bld, r, depth_vec, flt_depth_vec, 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->pot_depth, 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->static_state->wrap_r, 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &z0, &z1, &r_fpart); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(z0, "tex.z0.wrapped"); 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(z1, "tex.z1.wrapped"); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (bld->static_state->target == PIPE_TEXTURE_CUBE) { 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z0 = z1 = r; /* cube face */ 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r_fpart = NULL; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z0 = z1 = NULL; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r_fpart = NULL; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y0 = y1 = t_fpart = NULL; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org z0 = z1 = r_fpart = NULL; 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get texture colors. 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get x0/x1 texels */ 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0, y0, z0, 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors[0][0]); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1, y0, z0, 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors[0][1]); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 1) { 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Interpolate two samples from 1D image to produce one color */ 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors_out[chan] = lp_build_lerp(&bld->texel_bld, s_fpart, 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[0][0][chan], 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[0][1][chan]); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 2D/3D texture */ 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef colors0[4]; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get x0/x1 texels at y1 */ 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0, y1, z0, 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors[1][0]); 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1, y1, z0, 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors[1][1]); 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Bilinear interpolate the four samples from the 2D image / 3D slice */ 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0[chan] = lp_build_lerp_2d(&bld->texel_bld, 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_fpart, t_fpart, 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[0][0][chan], 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[0][1][chan], 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[1][0][chan], 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors[1][1][chan]); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 3) { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef neighbors1[2][2][4]; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef colors1[4]; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get x0/x1/y0/y1 texels at z1 */ 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0, y0, z1, 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors1[0][0]); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1, y0, z1, 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors1[0][1]); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x0, y1, z1, 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors1[1][0]); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_texel_soa(bld, unit, 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width_vec, height_vec, depth_vec, 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x1, y1, z1, 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride_vec, img_stride_vec, 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr, neighbors1[1][1]); 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Bilinear interpolate the four samples from the second Z slice */ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors1[chan] = lp_build_lerp_2d(&bld->texel_bld, 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s_fpart, t_fpart, 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors1[0][0][chan], 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors1[0][1][chan], 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors1[1][0][chan], 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org neighbors1[1][1][chan]); 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Linearly interpolate the two samples from the two 3D slices */ 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors_out[chan] = lp_build_lerp(&bld->texel_bld, 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r_fpart, 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0[chan], colors1[chan]); 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 2D tex */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors_out[chan] = colors0[chan]; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Sample the texture/mipmap using given image filter and mip filter. 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * data0_ptr and data1_ptr point to the two mipmap levels to sample 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from. width0/1_vec, height0/1_vec, depth0/1_vec indicate their sizes. 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If we're using nearest miplevel sampling the '1' values will be null/unused. 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_mipmap(struct lp_build_sample_context *bld, 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned img_filter, 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mip_filter, 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s, 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef t, 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef r, 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel0, 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel1, 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_fpart, 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *colors_out) 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef size0 = NULL; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef size1 = NULL; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef row_stride0_vec = NULL; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef row_stride1_vec = NULL; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef img_stride0_vec = NULL; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef img_stride1_vec = NULL; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef data_ptr0 = NULL; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef data_ptr1 = NULL; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef colors0[4], colors1[4]; 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sample the first mipmap level */ 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mipmap_level_sizes(bld, ilevel0, 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &size0, 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &row_stride0_vec, &img_stride0_vec); 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr0 = lp_build_get_mipmap_level(bld, ilevel0); 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img_filter == PIPE_TEX_FILTER_NEAREST) { 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_image_nearest(bld, unit, 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size0, 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride0_vec, img_stride0_vec, 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr0, s, t, r, 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0); 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(img_filter == PIPE_TEX_FILTER_LINEAR); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_image_linear(bld, unit, 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size0, 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride0_vec, img_stride0_vec, 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr0, s, t, r, 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Store the first level's colors in the output variables */ 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, colors0[chan], colors_out[chan]); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mip_filter == PIPE_TEX_MIPFILTER_LINEAR) { 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_if_state if_ctx; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef need_lerp; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_quads = bld->coord_bld.type.length / 4; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* need_lerp = lod_fpart > 0 */ 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_quads == 1) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_lerp = LLVMBuildFCmp(builder, LLVMRealUGT, 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fpart, bld->perquadf_bld.zero, 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "need_lerp"); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We'll do mip filtering if any of the quads need it. 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It might be better to split the vectors here and only fetch/filter 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * quads which need it. 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We unfortunately need to clamp lod_fpart here since we can get 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * negative values which would screw up filtering if not all 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * lod_fpart values have same sign. 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fpart = lp_build_max(&bld->perquadf_bld, lod_fpart, 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->perquadf_bld.zero); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_lerp = lp_build_compare(bld->gallivm, bld->perquadf_bld.type, 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_FUNC_GREATER, 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fpart, bld->perquadf_bld.zero); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org need_lerp = lp_build_any_true_range(&bld->perquadi_bld, num_quads, need_lerp); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_if(&if_ctx, bld->gallivm, need_lerp); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* sample the second mipmap level */ 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_mipmap_level_sizes(bld, ilevel1, 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &size1, 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &row_stride1_vec, &img_stride1_vec); 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr1 = lp_build_get_mipmap_level(bld, ilevel1); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (img_filter == PIPE_TEX_FILTER_NEAREST) { 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_image_nearest(bld, unit, 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1, 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride1_vec, img_stride1_vec, 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr1, s, t, r, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors1); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_image_linear(bld, unit, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size1, 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org row_stride1_vec, img_stride1_vec, 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data_ptr1, s, t, r, 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors1); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* interpolate samples from the two mipmap levels */ 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fpart = lp_build_unpack_broadcast_aos_scalars(bld->gallivm, 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->perquadf_bld.type, 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->texel_bld.type, 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fpart); 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0[chan] = lp_build_lerp(&bld->texel_bld, lod_fpart, 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors0[chan], colors1[chan]); 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, colors0[chan], colors_out[chan]); 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_endif(&if_ctx); 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate cube face, lod, mip levels. 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_common(struct lp_build_sample_context *bld, 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *s, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *t, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *r, 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_derivatives *derivs, 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_bias, /* optional */ 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef explicit_lod, /* optional */ 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *lod_ipart, 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *lod_fpart, 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *ilevel0, 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *ilevel1) 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned mip_filter = bld->static_state->min_mip_filter; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned min_filter = bld->static_state->min_img_filter; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned mag_filter = bld->static_state->mag_img_filter; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef first_level; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_derivatives face_derivs; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("%s mip %d min %d mag %d\n", __FUNCTION__, 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mip_filter, min_filter, mag_filter); 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose cube face, recompute texcoords and derivatives for the chosen face. 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->target == PIPE_TEXTURE_CUBE) { 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef face, face_s, face_t; 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_cube_lookup(bld, *s, *t, *r, &face, &face_s, &face_t); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *s = face_s; /* vec */ 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *t = face_t; /* vec */ 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use 'r' to indicate cube face */ 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *r = face; /* vec */ 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* recompute ddx, ddy using the new (s,t) face texcoords */ 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face_derivs.ddx_ddy[0] = lp_build_packed_ddx_ddy_twocoord(&bld->coord_bld, *s, *t); 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org face_derivs.ddx_ddy[1] = NULL; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs = &face_derivs; 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute the level of detail (float). 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (min_filter != mag_filter || 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mip_filter != PIPE_TEX_MIPFILTER_NONE) { 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Need to compute lod either to choose mipmap levels or to 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distinguish between minification/magnification with one mipmap level. 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_lod_selector(bld, unit, derivs, 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_bias, explicit_lod, 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mip_filter, 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_ipart, lod_fpart); 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lod_ipart = bld->perquadi_bld.zero; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute integer mipmap level(s) to fetch texels from: ilevel0, ilevel1 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mip_filter) { 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 && "bad mip_filter value in lp_build_sample_soa()"); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_NONE: 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* always use mip level 0 */ 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->target == PIPE_TEXTURE_CUBE) { 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX this is a work-around for an apparent bug in LLVM 2.7. 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * We should be able to set ilevel0 = const(0) but that causes 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bad x86 code to be emitted. 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX should probably disable that on other llvm versions. 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(*lod_ipart); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_nearest_mip_level(bld, unit, *lod_ipart, ilevel0); 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_level = bld->dynamic_state->first_level(bld->dynamic_state, 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->gallivm, unit); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_level = lp_build_broadcast_scalar(&bld->perquadi_bld, first_level); 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ilevel0 = first_level; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_NEAREST: 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(*lod_ipart); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_nearest_mip_level(bld, unit, *lod_ipart, ilevel0); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEX_MIPFILTER_LINEAR: 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(*lod_ipart); 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(*lod_fpart); 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_linear_mip_levels(bld, unit, 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *lod_ipart, lod_fpart, 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, ilevel1); 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * General texture sampling codegen. 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function handles texture sampling for all texture targets (1D, 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2D, 3D, cube) and all filtering modes. 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_general(struct lp_build_sample_context *bld, 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s, 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef t, 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef r, 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_ipart, 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_fpart, 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel0, 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel1, 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *colors_out) 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *int_bld = &bld->int_bld; 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned mip_filter = bld->static_state->min_mip_filter; 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned min_filter = bld->static_state->min_img_filter; 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned mag_filter = bld->static_state->mag_img_filter; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texels[4]; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get/interpolate texture colors. 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; ++chan) { 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels[chan] = lp_build_alloca(bld->gallivm, bld->texel_bld.vec_type, ""); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(texels[chan], "sampler%u_texel_%c_var", unit, "xyzw"[chan]); 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (min_filter == mag_filter) { 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no need to distinguish between minification and magnification */ 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_mipmap(bld, unit, 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min_filter, mip_filter, 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, ilevel1, lod_fpart, 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels); 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Emit conditional to choose min image filter or mag image filter 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * depending on the lod being > 0 or <= 0, respectively. 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_if_state if_ctx; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef minify; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* minify = lod >= 0.0 */ 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minify = LLVMBuildICmp(builder, LLVMIntSGE, 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_ipart, int_bld->zero, ""); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_if(&if_ctx, bld->gallivm, minify); 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the minification filter */ 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_mipmap(bld, unit, 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org min_filter, mip_filter, 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, ilevel1, lod_fpart, 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels); 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_else(&if_ctx); 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Use the magnification filter */ 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_mipmap(bld, unit, 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mag_filter, PIPE_TEX_MIPFILTER_NONE, 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, NULL, NULL, 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels); 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_endif(&if_ctx); 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; ++chan) { 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colors_out[chan] = LLVMBuildLoad(builder, texels[chan], ""); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_name(colors_out[chan], "sampler%u_texel_%c", unit, "xyzw"[chan]); 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do shadow test/comparison. 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param p the texcoord Z (aka R, aka P) component 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texel the texel to compare against (use the X channel) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_compare(struct lp_build_sample_context *bld, 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef p, 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texel[4]) 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context *texel_bld = &bld->texel_bld; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = bld->gallivm->builder; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef res; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned chan = 0; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bld->static_state->compare_mode == PIPE_TEX_COMPARE_NONE) 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* debug code */ 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indx = lp_build_const_int32(bld->gallivm, 0); 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef coord = LLVMBuildExtractElement(builder, p, indx, ""); 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tex = LLVMBuildExtractElement(builder, texel[chan], indx, ""); 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_printf(bld->gallivm, "shadow compare coord %f to texture %f\n", 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coord, tex); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clamp p coords to [0,1] */ 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p = lp_build_clamp(&bld->coord_bld, p, 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->coord_bld.zero, 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld->coord_bld.one); 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* result = (p FUNC texel) ? 1 : 0 */ 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = lp_build_cmp(texel_bld, bld->static_state->compare_func, 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org p, texel[chan]); 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = lp_build_select(texel_bld, res, texel_bld->one, texel_bld->zero); 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX returning result for default GL_DEPTH_TEXTURE_MODE = GL_LUMINANCE */ 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel[0] = 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel[1] = 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel[2] = res; 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel[3] = texel_bld->one; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Just set texels to white instead of actually sampling the texture. 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For debugging. 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_nop(struct gallivm_state *gallivm, 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type type, 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_coords, 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const LLVMValueRef *coords, 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texel_out[4]) 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef one = lp_build_one(gallivm, type); 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; chan++) { 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out[chan] = one; 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build texture sampling code. 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 'texel' will return a vector of four LLVMValueRefs corresponding to 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * R, G, B, A. 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type vector float type to use for coords, etc. 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param derivs partial derivatives of (s,t,r,q) with respect to x and y 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_sample_soa(struct gallivm_state *gallivm, 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_sampler_static_state *static_state, 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_sampler_dynamic_state *dynamic_state, 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type type, 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_coords, 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const LLVMValueRef *coords, 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_derivatives *derivs, 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_bias, /* optional */ 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef explicit_lod, /* optional */ 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texel_out[4]) 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dims = texture_dims(static_state->target); 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_sample_context bld; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef i32t = LLVMInt32TypeInContext(gallivm->context); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef tex_width, tex_height, tex_depth; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef t; 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef r; 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format fmt = static_state->format; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Sample from %s\n", util_format_name(fmt)); 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(type.floating); 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup our build context */ 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&bld, 0, sizeof bld); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.gallivm = gallivm; 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.static_state = static_state; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.dynamic_state = dynamic_state; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.format_desc = util_format_description(static_state->format); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.dims = dims; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.vector_width = lp_type_width(type); 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.float_type = lp_type_float(32); 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_type = lp_type_int(32); 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.coord_type = type; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_coord_type = lp_int_type(type); 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.float_size_type = lp_type_float(32); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.float_size_type.length = dims > 1 ? 4 : 1; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_size_type = lp_int_type(bld.float_size_type); 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.texel_type = type; 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadf_type = type; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we want native vector size to be able to use our intrinsics */ 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadf_type.length = type.length > 4 ? ((type.length + 15) / 16) * 4 : 1; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadi_type = lp_int_type(bld.perquadf_type); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.float_bld, gallivm, bld.float_type); 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.float_vec_bld, gallivm, type); 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.int_bld, gallivm, bld.int_type); 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.coord_bld, gallivm, bld.coord_type); 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.int_coord_bld, gallivm, bld.int_coord_type); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.int_size_bld, gallivm, bld.int_size_type); 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.float_size_bld, gallivm, bld.float_size_type); 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.texel_bld, gallivm, bld.texel_type); 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.perquadf_bld, gallivm, bld.perquadf_type); 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld.perquadi_bld, gallivm, bld.perquadi_type); 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Get the dynamic state */ 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_width = dynamic_state->width(dynamic_state, gallivm, unit); 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_height = dynamic_state->height(dynamic_state, gallivm, unit); 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_depth = dynamic_state->depth(dynamic_state, gallivm, unit); 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.row_stride_array = dynamic_state->row_stride(dynamic_state, gallivm, unit); 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.img_stride_array = dynamic_state->img_stride(dynamic_state, gallivm, unit); 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.data_array = dynamic_state->data_ptr(dynamic_state, gallivm, unit); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note that data_array is an array[level] of pointers to texture images */ 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = coords[0]; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t = coords[1]; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = coords[2]; 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* width, height, depth as single int vector */ 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims <= 1) { 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_size = tex_width; 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_size = LLVMBuildInsertElement(builder, bld.int_size_bld.undef, 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_width, LLVMConstInt(i32t, 0, 0), ""); 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2) { 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_size = LLVMBuildInsertElement(builder, bld.int_size, 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_height, LLVMConstInt(i32t, 1, 0), ""); 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 3) { 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.int_size = LLVMBuildInsertElement(builder, bld.int_size, 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex_depth, LLVMConstInt(i32t, 2, 0), ""); 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) { 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For debug: no-op texture sampling */ 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_nop(gallivm, 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.texel_type, 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_coords, 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coords, 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out); 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_ipart = NULL, lod_fpart = NULL; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel0 = NULL, ilevel1 = NULL; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_quads = type.length / 4; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned mip_filter = bld.static_state->min_mip_filter; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean use_aos = util_format_fits_8unorm(bld.format_desc) && 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_is_simple_wrap_mode(static_state->wrap_s) && 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_is_simple_wrap_mode(static_state->wrap_t); 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((gallivm_debug & GALLIVM_DEBUG_PERF) && 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !use_aos && util_format_fits_8unorm(bld.format_desc)) { 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("%s: using floating point linear filtering for %s\n", 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__, bld.format_desc->short_name); 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf(" min_img %d mag_img %d mip %d wraps %d wrapt %d\n", 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->min_img_filter, 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->mag_img_filter, 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->min_mip_filter, 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->wrap_s, 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static_state->wrap_t); 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_common(&bld, unit, 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &s, &t, &r, 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org derivs, lod_bias, explicit_lod, 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &lod_ipart, &lod_fpart, 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ilevel0, &ilevel1); 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we only try 8-wide sampling with soa as it appears to 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be a loss with aos with AVX. 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_quads == 1 || (mip_filter == PIPE_TEX_MIPFILTER_NONE && 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !use_aos)) { 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (num_quads > 1) { 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index0 = lp_build_const_int32(gallivm, 0); 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These parameters are the same for all quads */ 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_ipart = LLVMBuildExtractElement(builder, lod_ipart, index0, ""); 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0 = LLVMBuildExtractElement(builder, ilevel0, index0, ""); 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_aos) { 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do sampling/filtering with fixed pt arithmetic */ 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_aos(&bld, unit, 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_ipart, lod_fpart, 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, ilevel1, 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_general(&bld, unit, 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_ipart, lod_fpart, 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, ilevel1, 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out); 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_if_state if_ctx; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef notsame_levels, notsame; 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index0 = lp_build_const_int32(gallivm, 0); 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texels[4]; 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texelout[4]; 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned j; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels[0] = lp_build_alloca(gallivm, bld.texel_bld.vec_type, "texr"); 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels[1] = lp_build_alloca(gallivm, bld.texel_bld.vec_type, "texg"); 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels[2] = lp_build_alloca(gallivm, bld.texel_bld.vec_type, "texb"); 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texels[3] = lp_build_alloca(gallivm, bld.texel_bld.vec_type, "texa"); 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* only build the if if we MAY split, otherwise always split */ 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!use_aos) { 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame = lp_build_extract_broadcast(gallivm, 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadi_bld.type, 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadi_bld.type, 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0, index0); 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame = lp_build_sub(&bld.perquadi_bld, ilevel0, notsame); 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame_levels = lp_build_any_true_range(&bld.perquadi_bld, num_quads, 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame); 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mip_filter == PIPE_TEX_MIPFILTER_LINEAR) { 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame = lp_build_extract_broadcast(gallivm, 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadi_bld.type, 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld.perquadi_bld.type, 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel1, index0); 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame = lp_build_sub(&bld.perquadi_bld, ilevel1, notsame); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame = lp_build_any_true_range(&bld.perquadi_bld, num_quads, notsame); 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org notsame_levels = LLVMBuildOr(builder, notsame_levels, notsame, ""); 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_if(&if_ctx, gallivm, notsame_levels); 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_sample_context bld4; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type type4 = type; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texelout4[4]; 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef texelouttmp[4][LP_MAX_VECTOR_LENGTH/16]; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type4.length = 4; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Setup our build context */ 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&bld4, 0, sizeof bld4); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.gallivm = bld.gallivm; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.static_state = bld.static_state; 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.dynamic_state = bld.dynamic_state; 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.format_desc = bld.format_desc; 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.dims = bld.dims; 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.row_stride_array = bld.row_stride_array; 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.img_stride_array = bld.img_stride_array; 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.data_array = bld.data_array; 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.int_size = bld.int_size; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.vector_width = lp_type_width(type4); 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.float_type = lp_type_float(32); 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.int_type = lp_type_int(32); 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.coord_type = type4; 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.int_coord_type = lp_int_type(type4); 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.float_size_type = lp_type_float(32); 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.float_size_type.length = dims > 1 ? 4 : 1; 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.int_size_type = lp_int_type(bld4.float_size_type); 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.texel_type = type4; 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.perquadf_type = type4; 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we want native vector size to be able to use our intrinsics */ 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.perquadf_type.length = 1; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bld4.perquadi_type = lp_int_type(bld4.perquadf_type); 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.float_bld, gallivm, bld4.float_type); 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.float_vec_bld, gallivm, type4); 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.int_bld, gallivm, bld4.int_type); 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.coord_bld, gallivm, bld4.coord_type); 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.int_coord_bld, gallivm, bld4.int_coord_type); 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.int_size_bld, gallivm, bld4.int_size_type); 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.float_size_bld, gallivm, bld4.float_size_type); 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.texel_bld, gallivm, bld4.texel_type); 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.perquadf_bld, gallivm, bld4.perquadf_type); 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld4.perquadi_bld, gallivm, bld4.perquadi_type); 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num_quads; i++) { 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef s4, t4, r4; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod_iparts, lod_fparts = NULL; 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel0s, ilevel1s = NULL; 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef indexi = lp_build_const_int32(gallivm, i); 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s4 = lp_build_extract_range(gallivm, s, 4*i, 4); 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org t4 = lp_build_extract_range(gallivm, t, 4*i, 4); 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r4 = lp_build_extract_range(gallivm, r, 4*i, 4); 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts = LLVMBuildExtractElement(builder, lod_ipart, indexi, ""); 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s = LLVMBuildExtractElement(builder, ilevel0, indexi, ""); 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mip_filter == PIPE_TEX_MIPFILTER_LINEAR) { 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel1s = LLVMBuildExtractElement(builder, ilevel1, indexi, ""); 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_fparts = LLVMBuildExtractElement(builder, lod_fpart, indexi, ""); 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_aos) { 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do sampling/filtering with fixed pt arithmetic */ 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_aos(&bld4, unit, 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s4, t4, r4, 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts, lod_fparts, 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s, ilevel1s, 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelout4); 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_general(&bld4, unit, 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s4, t4, r4, 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts, lod_fparts, 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s, ilevel1s, 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelout4); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelouttmp[j][i] = texelout4[j]; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelout[j] = lp_build_concat(gallivm, texelouttmp[j], type4, num_quads); 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, texelout[j], texels[j]); 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!use_aos) { 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ilevel0s, lod_iparts, ilevel1s = NULL; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_else(&if_ctx); 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* These parameters are the same for all quads */ 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts = LLVMBuildExtractElement(builder, lod_ipart, index0, ""); 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s = LLVMBuildExtractElement(builder, ilevel0, index0, ""); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mip_filter == PIPE_TEX_MIPFILTER_LINEAR) { 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel1s = LLVMBuildExtractElement(builder, ilevel1, index0, ""); 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (use_aos) { 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do sampling/filtering with fixed pt arithmetic */ 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_aos(&bld, unit, 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts, lod_fpart, 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s, ilevel1s, 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelout); 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_general(&bld, unit, 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s, t, r, 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod_iparts, lod_fpart, 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ilevel0s, ilevel1s, 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texelout); 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, texelout[j], texels[j]); 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_endif(&if_ctx); 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4; j++) { 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texel_out[j] = LLVMBuildLoad(builder, texels[j], ""); 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_sample_compare(&bld, r, texel_out); 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org apply_sampler_swizzle(&bld, texel_out); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_build_size_query_soa(struct gallivm_state *gallivm, 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_sampler_static_state *static_state, 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_sampler_dynamic_state *dynamic_state, 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type int_type, 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned unit, 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef explicit_lod, 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef *sizes_out) 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef lod; 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef size; 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dims, i; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_build_context bld_int_vec; 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (static_state->target) { 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BUFFER: 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 1; 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 2; 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 3; 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!int_type.floating); 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_context_init(&bld_int_vec, gallivm, lp_type_int_vec(32, 128)); 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (explicit_lod) { 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef first_level; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod = LLVMBuildExtractElement(gallivm->builder, explicit_lod, lp_build_const_int32(gallivm, 0), ""); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org first_level = dynamic_state->first_level(dynamic_state, gallivm, unit); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod = lp_build_broadcast_scalar(&bld_int_vec, 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildAdd(gallivm->builder, lod, first_level, "lod")); 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod = bld_int_vec.zero; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = bld_int_vec.undef; 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = LLVMBuildInsertElement(gallivm->builder, size, 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dynamic_state->width(dynamic_state, gallivm, unit), 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, 0), ""); 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2) { 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = LLVMBuildInsertElement(gallivm->builder, size, 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dynamic_state->height(dynamic_state, gallivm, unit), 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, 1), ""); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 3) { 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = LLVMBuildInsertElement(gallivm->builder, size, 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dynamic_state->depth(dynamic_state, gallivm, unit), 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, 2), ""); 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = lp_build_minify(&bld_int_vec, size, lod); 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0; i < dims; i++) { 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizes_out[i] = lp_build_extract_broadcast(gallivm, bld_int_vec.type, int_type, 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_const_int32(gallivm, i)); 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1632