1e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/************************************************************************** 2e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 3e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Copyright 2009 VMware, Inc. 4e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * All rights reserved. 5e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 6e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * copy of this software and associated documentation files (the 8e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * "Software"), to deal in the Software without restriction, including 9e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * the following conditions: 13e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 14e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * The above copyright notice and this permission notice (including the 15e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * next paragraph) shall be included in all copies or substantial portions 16e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * of the Software. 17e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 18e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 26e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca **************************************************************************/ 27e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 28e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/** 29e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Texture sampling code generation 30e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 31e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * This file is nothing more than ugly glue between three largely independent 32e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * entities: 33e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - TGSI -> LLVM translation (i.e., lp_build_tgsi_soa) 34e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - texture sampling code generation (i.e., lp_build_sample_soa) 35e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - LLVM pipe driver 36e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 37e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * All interesting code is in the functions mentioned above. There is really 38e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * nothing to see here. 39e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 40e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 41e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */ 42e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 43e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "pipe/p_defines.h" 44e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "pipe/p_shader_tokens.h" 45c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_debug.h" 46efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "gallivm/lp_bld_const.h" 47c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_type.h" 48c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_sample.h" 49c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_tgsi.h" 5072120292b981fd96e1127f927d7257255c65befdKeith Whitwell#include "lp_jit.h" 51e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "lp_tex_sample.h" 525f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell#include "lp_debug.h" 53e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 54e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 55e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/** 56e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * This provides the bridge between the sampler state store in 57e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * lp_jit_context and lp_jit_texture and the sampler code 58e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * generator. It provides the texture layout information required by 59e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * the texture sampler code generator in terms of the state stored in 60e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * lp_jit_context and lp_jit_texture in runtime. 61e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */ 62e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct llvmpipe_sampler_dynamic_state 63e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 64e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca struct lp_sampler_dynamic_state base; 65e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 66e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca const struct lp_sampler_static_state *static_state; 67e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 68e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef context_ptr; 69e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}; 70e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 71e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 72e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/** 73e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * This is the bridge between our sampler and the TGSI translator. 74e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */ 75e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct lp_llvm_sampler_soa 76e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 77e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca struct lp_build_sampler_soa base; 78e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 79e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca struct llvmpipe_sampler_dynamic_state dynamic_state; 80e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}; 81e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 82e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 83e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/** 84e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Fetch the specified member of the lp_jit_texture structure. 85f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul * \param emit_load if TRUE, emit the LLVM load instruction to actually 86f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul * fetch the field's value. Otherwise, just emit the 87f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul * GEP code to address the field. 88e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 89e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * @sa http://llvm.org/docs/GetElementPtr.html 90e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */ 91e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic LLVMValueRef 923f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paullp_llvm_texture_member(const struct lp_sampler_dynamic_state *base, 93efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 94e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unsigned unit, 95e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unsigned member_index, 96f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul const char *member_name, 97f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul boolean emit_load) 98e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 99e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul struct llvmpipe_sampler_dynamic_state *state = 100e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul (struct llvmpipe_sampler_dynamic_state *)base; 101efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 102e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef indices[4]; 103e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef ptr; 104e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef res; 105e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 106e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca assert(unit < PIPE_MAX_SAMPLERS); 107e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 108e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca /* context[0] */ 109efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[0] = lp_build_const_int32(gallivm, 0); 110e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca /* context[0].textures */ 111efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[1] = lp_build_const_int32(gallivm, LP_JIT_CTX_TEXTURES); 112e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca /* context[0].textures[unit] */ 113efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[2] = lp_build_const_int32(gallivm, unit); 114e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca /* context[0].textures[unit].member */ 115efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[3] = lp_build_const_int32(gallivm, member_index); 116e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 117e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), ""); 118e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 119f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul if (emit_load) 120f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul res = LLVMBuildLoad(builder, ptr, ""); 121f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul else 122f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul res = ptr; 123e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 124e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca lp_build_name(res, "context.texture%u.%s", unit, member_name); 125e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 126e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca return res; 127e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca} 128e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 129e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 130e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/** 131e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * Helper macro to instantiate the functions that generate the code to 132e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * fetch the members of lp_jit_texture to fulfill the sampler code 133e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * generator requests. 134e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * 135e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * This complexity is the price we have to pay to keep the texture 136e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * sampler code generator a reusable module without dependencies to 137e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * llvmpipe internals. 138e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */ 139f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul#define LP_LLVM_TEXTURE_MEMBER(_name, _index, _emit_load) \ 140e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca static LLVMValueRef \ 1413f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul lp_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \ 142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, \ 143e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unsigned unit) \ 144e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca { \ 145efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul return lp_llvm_texture_member(base, gallivm, unit, _index, #_name, _emit_load ); \ 146e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca } 147e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 148e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 149f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(width, LP_JIT_TEXTURE_WIDTH, TRUE) 150f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(height, LP_JIT_TEXTURE_HEIGHT, TRUE) 151f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(depth, LP_JIT_TEXTURE_DEPTH, TRUE) 15208070cead0bb79d4441d8c5b900d1571bb63c670Fabian BielerLP_LLVM_TEXTURE_MEMBER(first_level, LP_JIT_TEXTURE_FIRST_LEVEL, TRUE) 153f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(last_level, LP_JIT_TEXTURE_LAST_LEVEL, TRUE) 15453efb634a0c134feebb5a3e47fc33660694be9c3Brian PaulLP_LLVM_TEXTURE_MEMBER(row_stride, LP_JIT_TEXTURE_ROW_STRIDE, FALSE) 155f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian PaulLP_LLVM_TEXTURE_MEMBER(img_stride, LP_JIT_TEXTURE_IMG_STRIDE, FALSE) 156f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(data_ptr, LP_JIT_TEXTURE_DATA, FALSE) 15761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(min_lod, LP_JIT_TEXTURE_MIN_LOD, TRUE) 15861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(max_lod, LP_JIT_TEXTURE_MAX_LOD, TRUE) 15961b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(lod_bias, LP_JIT_TEXTURE_LOD_BIAS, TRUE) 160d1a4dd4217a4b8b018d4d9a161afece640d75694Brian PaulLP_LLVM_TEXTURE_MEMBER(border_color, LP_JIT_TEXTURE_BORDER_COLOR, FALSE) 161e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 162e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 163e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic void 164e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecalp_llvm_sampler_soa_destroy(struct lp_build_sampler_soa *sampler) 165e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 166e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca FREE(sampler); 167e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca} 168e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 169e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 170ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul/** 171ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul * Fetch filtered values from texture. 172ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul * The 'texel' parameter returns four vectors corresponding to R, G, B, A. 173ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul */ 174e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic void 1753f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paullp_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base, 176efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 177b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 178e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unsigned unit, 179e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unsigned num_coords, 180e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca const LLVMValueRef *coords, 1813469715a8a171512cf9b528702e70393f01c6041José Fonseca const struct lp_derivatives *derivs, 182ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, /* optional */ 183ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef explicit_lod, /* optional */ 184e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef *texel) 185e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 186e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base; 187e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 188e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca assert(unit < PIPE_MAX_SAMPLERS); 1895f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell 1905f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell if (LP_PERF & PERF_NO_TEX) { 1913469715a8a171512cf9b528702e70393f01c6041José Fonseca lp_build_sample_nop(gallivm, type, num_coords, coords, texel); 1925f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell return; 1935f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell } 194e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 195efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_sample_soa(gallivm, 196e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca &sampler->dynamic_state.static_state[unit], 197e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca &sampler->dynamic_state.base, 198e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca type, 199e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca unit, 200962558daaed43b0111cd062e32821aad106869d7José Fonseca num_coords, coords, 2013469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs, 202ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias, explicit_lod, 203e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca texel); 204e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca} 205e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 2065d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert/** 2075d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert * Fetch the texture size. 2085d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert */ 2095d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void 2105d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertlp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base, 2115d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct gallivm_state *gallivm, 2123469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type type, 2135d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unsigned unit, 2145d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef explicit_lod, /* optional */ 2155d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef *sizes_out) 2165d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{ 2175d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base; 2185d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 2195d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert assert(unit < PIPE_MAX_SAMPLERS); 2205d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 2215d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert lp_build_size_query_soa(gallivm, 2225d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert &sampler->dynamic_state.static_state[unit], 2235d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert &sampler->dynamic_state.base, 2243469715a8a171512cf9b528702e70393f01c6041José Fonseca type, 2255d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unit, 2265d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert explicit_lod, 2275d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sizes_out); 2285d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert} 2295d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 230e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 231e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct lp_build_sampler_soa * 232e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecalp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state, 233e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca LLVMValueRef context_ptr) 234e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{ 235e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca struct lp_llvm_sampler_soa *sampler; 236e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 237e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler = CALLOC_STRUCT(lp_llvm_sampler_soa); 238e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca if(!sampler) 239e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca return NULL; 240e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 241e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->base.destroy = lp_llvm_sampler_soa_destroy; 242e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->base.emit_fetch_texel = lp_llvm_sampler_soa_emit_fetch_texel; 2435d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sampler->base.emit_size_query = lp_llvm_sampler_soa_emit_size_query; 244e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->dynamic_state.base.width = lp_llvm_texture_width; 245e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->dynamic_state.base.height = lp_llvm_texture_height; 246b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul sampler->dynamic_state.base.depth = lp_llvm_texture_depth; 24708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler sampler->dynamic_state.base.first_level = lp_llvm_texture_first_level; 248b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul sampler->dynamic_state.base.last_level = lp_llvm_texture_last_level; 24953efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul sampler->dynamic_state.base.row_stride = lp_llvm_texture_row_stride; 250f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul sampler->dynamic_state.base.img_stride = lp_llvm_texture_img_stride; 251e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->dynamic_state.base.data_ptr = lp_llvm_texture_data_ptr; 25261b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul sampler->dynamic_state.base.min_lod = lp_llvm_texture_min_lod; 25361b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul sampler->dynamic_state.base.max_lod = lp_llvm_texture_max_lod; 25461b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul sampler->dynamic_state.base.lod_bias = lp_llvm_texture_lod_bias; 255d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul sampler->dynamic_state.base.border_color = lp_llvm_texture_border_color; 25661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul 257e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->dynamic_state.static_state = static_state; 258e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca sampler->dynamic_state.context_ptr = context_ptr; 259e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 260e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca return &sampler->base; 261e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca} 262e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca 263