101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/************************************************************************** 201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Copyright 2010 VMware, Inc. 401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * All rights reserved. 501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Permission is hereby granted, free of charge, to any person obtaining a 701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * copy of this software and associated documentation files (the 801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * "Software"), to deal in the Software without restriction, including 901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * without limitation the rights to use, copy, modify, merge, publish, 1001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * distribute, sub license, and/or sell copies of the Software, and to 1101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * permit persons to whom the Software is furnished to do so, subject to 1201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * the following conditions: 1301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 1401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * The above copyright notice and this permission notice (including the 1501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * next paragraph) shall be included in all copies or substantial portions 1601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * of the Software. 1701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 1801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 2601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin **************************************************************************/ 2701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 2801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 2901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Texture sampling code generation 3001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * @author Jose Fonseca <jfonseca@vmware.com> 3101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 3201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 3301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "pipe/p_defines.h" 3401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "pipe/p_shader_tokens.h" 35efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "gallivm/lp_bld_const.h" 3601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_debug.h" 3701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_type.h" 3801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_sample.h" 3901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_tgsi.h" 4001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 4101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 4201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_debug.h" 4301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_memory.h" 4401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_pointer.h" 4501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_string.h" 4601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 4701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "draw_llvm.h" 4801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 4901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 5001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 5101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This provides the bridge between the sampler state store in 5201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * lp_jit_context and lp_jit_texture and the sampler code 5301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * generator. It provides the texture layout information required by 5401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * the texture sampler code generator in terms of the state stored in 5501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * lp_jit_context and lp_jit_texture in runtime. 5601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 5701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct draw_llvm_sampler_dynamic_state 5801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 5901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct lp_sampler_dynamic_state base; 6001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 6101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin const struct lp_sampler_static_state *static_state; 6201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 6301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef context_ptr; 6401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}; 6501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 6601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 6701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 6801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This is the bridge between our sampler and the TGSI translator. 6901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 7001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct draw_llvm_sampler_soa 7101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 7201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct lp_build_sampler_soa base; 7301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 7401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct draw_llvm_sampler_dynamic_state dynamic_state; 7501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}; 7601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 7701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 7801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 7901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Fetch the specified member of the lp_jit_texture structure. 8001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * \param emit_load if TRUE, emit the LLVM load instruction to actually 8101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * fetch the field's value. Otherwise, just emit the 8201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * GEP code to address the field. 8301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 8401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * @sa http://llvm.org/docs/GetElementPtr.html 8501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 8601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic LLVMValueRef 8701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_texture_member(const struct lp_sampler_dynamic_state *base, 88efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 8901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned unit, 9001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned member_index, 9101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin const char *member_name, 9201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin boolean emit_load) 9301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 94efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul LLVMBuilderRef builder = gallivm->builder; 9501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct draw_llvm_sampler_dynamic_state *state = 9601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin (struct draw_llvm_sampler_dynamic_state *)base; 9701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef indices[4]; 9801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef ptr; 9901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef res; 10001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 101cab2fed135bc1edf7b65ddca3236020638427061Brian Paul debug_assert(unit < PIPE_MAX_SAMPLERS); 10201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 10301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin /* context[0] */ 104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[0] = lp_build_const_int32(gallivm, 0); 10501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin /* context[0].textures */ 106efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[1] = lp_build_const_int32(gallivm, DRAW_JIT_CTX_TEXTURES); 10701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin /* context[0].textures[unit] */ 108efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[2] = lp_build_const_int32(gallivm, unit); 10901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin /* context[0].textures[unit].member */ 110efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul indices[3] = lp_build_const_int32(gallivm, member_index); 11101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 11201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), ""); 11301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 11401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin if (emit_load) 11501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin res = LLVMBuildLoad(builder, ptr, ""); 11601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin else 11701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin res = ptr; 11801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 11901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin lp_build_name(res, "context.texture%u.%s", unit, member_name); 12001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 12101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin return res; 12201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 12301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 12401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 12501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 12601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Helper macro to instantiate the functions that generate the code to 12701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * fetch the members of lp_jit_texture to fulfill the sampler code 12801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * generator requests. 12901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * 13001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This complexity is the price we have to pay to keep the texture 13101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * sampler code generator a reusable module without dependencies to 13201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * llvmpipe internals. 13301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 13401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#define DRAW_LLVM_TEXTURE_MEMBER(_name, _index, _emit_load) \ 13501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin static LLVMValueRef \ 13601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin draw_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \ 137efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, \ 13801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned unit) \ 13901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin { \ 140efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul return draw_llvm_texture_member(base, gallivm, unit, _index, #_name, _emit_load ); \ 14101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin } 14201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 14301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 14401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(width, DRAW_JIT_TEXTURE_WIDTH, TRUE) 14501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(height, DRAW_JIT_TEXTURE_HEIGHT, TRUE) 14601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(depth, DRAW_JIT_TEXTURE_DEPTH, TRUE) 14708070cead0bb79d4441d8c5b900d1571bb63c670Fabian BielerDRAW_LLVM_TEXTURE_MEMBER(first_level,DRAW_JIT_TEXTURE_FIRST_LEVEL, TRUE) 14801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(last_level, DRAW_JIT_TEXTURE_LAST_LEVEL, TRUE) 14901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(row_stride, DRAW_JIT_TEXTURE_ROW_STRIDE, FALSE) 15001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(img_stride, DRAW_JIT_TEXTURE_IMG_STRIDE, FALSE) 15101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(data_ptr, DRAW_JIT_TEXTURE_DATA, FALSE) 152998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(min_lod, DRAW_JIT_TEXTURE_MIN_LOD, TRUE) 153998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(max_lod, DRAW_JIT_TEXTURE_MAX_LOD, TRUE) 154998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(lod_bias, DRAW_JIT_TEXTURE_LOD_BIAS, TRUE) 155998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(border_color, DRAW_JIT_TEXTURE_BORDER_COLOR, FALSE) 15601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 15701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 15801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic void 15901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_destroy(struct lp_build_sampler_soa *sampler) 16001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 16101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin FREE(sampler); 16201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 16301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 16401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 16501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/** 16601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Fetch filtered values from texture. 16701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * The 'texel' parameter returns four vectors corresponding to R, G, B, A. 16801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */ 16901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic void 17001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base, 171efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 17201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct lp_type type, 17301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned unit, 17401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unsigned num_coords, 17501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin const LLVMValueRef *coords, 1763469715a8a171512cf9b528702e70393f01c6041José Fonseca const struct lp_derivatives *derivs, 17701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef lod_bias, /* optional */ 17801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef explicit_lod, /* optional */ 17901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef *texel) 18001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 18101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct draw_llvm_sampler_soa *sampler = (struct draw_llvm_sampler_soa *)base; 18201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 183cab2fed135bc1edf7b65ddca3236020638427061Brian Paul assert(unit < PIPE_MAX_SAMPLERS); 18401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 185efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul lp_build_sample_soa(gallivm, 18601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin &sampler->dynamic_state.static_state[unit], 18701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin &sampler->dynamic_state.base, 18801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin type, 18901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin unit, 19001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin num_coords, coords, 1913469715a8a171512cf9b528702e70393f01c6041José Fonseca derivs, 19201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin lod_bias, explicit_lod, 19301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin texel); 19401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 19501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 19601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 1975d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert/** 1985d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert * Fetch the texture size. 1995d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert */ 2005d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void 2015d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertdraw_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base, 2025d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct gallivm_state *gallivm, 2033469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type type, 2045d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unsigned unit, 2055d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef explicit_lod, /* optional */ 2065d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef *sizes_out) 2075d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{ 2085d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct draw_llvm_sampler_soa *sampler = (struct draw_llvm_sampler_soa *)base; 2095d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 210cab2fed135bc1edf7b65ddca3236020638427061Brian Paul assert(unit < PIPE_MAX_SAMPLERS); 2115d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 2125d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert lp_build_size_query_soa(gallivm, 2135d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert &sampler->dynamic_state.static_state[unit], 2145d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert &sampler->dynamic_state.base, 2153469715a8a171512cf9b528702e70393f01c6041José Fonseca type, 2165d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unit, 2175d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert explicit_lod, 2185d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sizes_out); 2195d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert} 2205d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 22101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct lp_build_sampler_soa * 22201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state, 22301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin LLVMValueRef context_ptr) 22401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{ 22501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin struct draw_llvm_sampler_soa *sampler; 22601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 22701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler = CALLOC_STRUCT(draw_llvm_sampler_soa); 22801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin if(!sampler) 22901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin return NULL; 23001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 23101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->base.destroy = draw_llvm_sampler_soa_destroy; 23201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->base.emit_fetch_texel = draw_llvm_sampler_soa_emit_fetch_texel; 2335d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert sampler->base.emit_size_query = draw_llvm_sampler_soa_emit_size_query; 23401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.width = draw_llvm_texture_width; 23501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.height = draw_llvm_texture_height; 23601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.depth = draw_llvm_texture_depth; 23708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler sampler->dynamic_state.base.first_level = draw_llvm_texture_first_level; 23801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.last_level = draw_llvm_texture_last_level; 23901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.row_stride = draw_llvm_texture_row_stride; 24001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.img_stride = draw_llvm_texture_img_stride; 24101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.base.data_ptr = draw_llvm_texture_data_ptr; 242998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca sampler->dynamic_state.base.min_lod = draw_llvm_texture_min_lod; 243998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca sampler->dynamic_state.base.max_lod = draw_llvm_texture_max_lod; 244998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca sampler->dynamic_state.base.lod_bias = draw_llvm_texture_lod_bias; 245998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca sampler->dynamic_state.base.border_color = draw_llvm_texture_border_color; 24601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.static_state = static_state; 24701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin sampler->dynamic_state.context_ptr = context_ptr; 24801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 24901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin return &sampler->base; 25001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin} 25101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin 252