1de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/************************************************************************** 2de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 3de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Copyright 2009 VMware, Inc. 4de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * All Rights Reserved. 5de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 6de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * copy of this software and associated documentation files (the 8de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * "Software"), to deal in the Software without restriction, including 9de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * the following conditions: 13de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 14de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * The above copyright notice and this permission notice (including the 15de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * next paragraph) shall be included in all copies or substantial portions 16de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * of the Software. 17de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 18de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 26de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca **************************************************************************/ 27de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 28de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 29de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * @file 30de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Texture sampling. 31de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 32de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 33de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 34de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 35de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#ifndef LP_BLD_SAMPLE_H 36de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#define LP_BLD_SAMPLE_H 37de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 38de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 39deffeba17204c249cac698a516a210e364d2cf55Vinson Lee#include "pipe/p_format.h" 400a7824862eb753878fa79b153b2a111884ff1197Brian Paul#include "util/u_debug.h" 410d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h" 420a7824862eb753878fa79b153b2a111884ff1197Brian Paul#include "gallivm/lp_bld_type.h" 430a7824862eb753878fa79b153b2a111884ff1197Brian Paul#include "gallivm/lp_bld_swizzle.h" 440a7824862eb753878fa79b153b2a111884ff1197Brian Paul 45de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 46287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource; 47d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonsecastruct pipe_sampler_view; 48de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct pipe_sampler_state; 49bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct util_format_description; 50b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecastruct lp_type; 51bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct lp_build_context; 52de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 53de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 54de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 553469715a8a171512cf9b528702e70393f01c6041José Fonseca * Helper struct holding all derivatives needed for sampling 563469715a8a171512cf9b528702e70393f01c6041José Fonseca */ 573469715a8a171512cf9b528702e70393f01c6041José Fonsecastruct lp_derivatives 583469715a8a171512cf9b528702e70393f01c6041José Fonseca{ 593469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef ddx_ddy[2]; 603469715a8a171512cf9b528702e70393f01c6041José Fonseca}; 613469715a8a171512cf9b528702e70393f01c6041José Fonseca 623469715a8a171512cf9b528702e70393f01c6041José Fonseca 633469715a8a171512cf9b528702e70393f01c6041José Fonseca/** 64de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler static state. 65de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 66287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that 67de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are embedded in the generated code. 68de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 69de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_static_state 70de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{ 7181ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca /* pipe_sampler_view's state */ 72de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca enum pipe_format format; 730a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned swizzle_r:3; /**< PIPE_SWIZZLE_* */ 7481ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_g:3; 7581ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_b:3; 7681ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_a:3; 7781ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca 7881ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca /* pipe_texture's state */ 790a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned target:3; /**< PIPE_TEXTURE_* */ 800a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned pot_width:1; /**< is the width a power of two? */ 81de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned pot_height:1; 82de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned pot_depth:1; 83de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 84de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca /* pipe_sampler_state's state */ 85de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_s:3; 86de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_t:3; 87de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_r:3; 88de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned min_img_filter:2; 89de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned min_mip_filter:2; 90de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned mag_img_filter:2; 91de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned compare_mode:1; 92de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned compare_func:3; 93de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned normalized_coords:1; 9461b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul unsigned min_max_lod_equal:1; /**< min_lod == max_lod ? */ 955849a6ab6412eddd4552329178e6edb0bea92977Keith Whitwell unsigned lod_bias_non_zero:1; 961c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca unsigned apply_min_lod:1; /**< min_lod > 0 ? */ 971c32583581ef5aee59901d9dd8e56cc1a125f0d4José Fonseca unsigned apply_max_lod:1; /**< max_lod < last_level ? */ 98ba9c1773d77afc71adc7bad3d8c326b104c5e094José Fonseca 99ba9c1773d77afc71adc7bad3d8c326b104c5e094José Fonseca /* Hacks */ 100ba9c1773d77afc71adc7bad3d8c326b104c5e094José Fonseca unsigned force_nearest_s:1; 101ba9c1773d77afc71adc7bad3d8c326b104c5e094José Fonseca unsigned force_nearest_t:1; 102de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca}; 103de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 104de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 105de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 106de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler dynamic state. 107de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 108287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that 109de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are computed in runtime. 110de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 111de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * There are obtained through callbacks, as we don't want to tie the texture 112de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * sampling code generation logic to any particular texture layout or pipe 113de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * driver. 114de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 115de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_dynamic_state 116de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{ 117de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 118542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain the base texture width (returns int32) */ 119de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1203f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*width)( const struct lp_sampler_dynamic_state *state, 121efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 122de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 123de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 124542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain the base texture height (returns int32) */ 125de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1263f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*height)( const struct lp_sampler_dynamic_state *state, 127efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 128de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 129de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 130542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain the base texture depth (returns int32) */ 1317f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMValueRef 1323f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*depth)( const struct lp_sampler_dynamic_state *state, 133efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 1347f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul unsigned unit); 1357f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul 13608070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler /** Obtain the first mipmap level (base level) (returns int32) */ 13708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler LLVMValueRef 13808070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler (*first_level)( const struct lp_sampler_dynamic_state *state, 13908070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler struct gallivm_state *gallivm, 14008070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler unsigned unit); 14108070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler 142542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain the number of mipmap levels minus one (returns int32) */ 1437f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMValueRef 1443f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*last_level)( const struct lp_sampler_dynamic_state *state, 145efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 1467f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul unsigned unit); 1477f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul 148542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain stride in bytes between image rows/blocks (returns int32) */ 149de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1503f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*row_stride)( const struct lp_sampler_dynamic_state *state, 151efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 15253efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul unsigned unit); 153de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 154542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain stride in bytes between image slices (returns int32) */ 155de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1563f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*img_stride)( const struct lp_sampler_dynamic_state *state, 157efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 158079081222a6881655e112351a57e0a07b0c7b031Brian Paul unsigned unit); 159079081222a6881655e112351a57e0a07b0c7b031Brian Paul 160542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain pointer to array of pointers to mimpap levels */ 161079081222a6881655e112351a57e0a07b0c7b031Brian Paul LLVMValueRef 1623f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*data_ptr)( const struct lp_sampler_dynamic_state *state, 163efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, 164de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 165de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 166542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain texture min lod (returns float) */ 16761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 16861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*min_lod)(const struct lp_sampler_dynamic_state *state, 169efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, unsigned unit); 17061b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul 171542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain texture max lod (returns float) */ 17261b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 17361b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*max_lod)(const struct lp_sampler_dynamic_state *state, 174efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, unsigned unit); 17561b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul 176542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain texture lod bias (returns float) */ 17761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 17861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*lod_bias)(const struct lp_sampler_dynamic_state *state, 179efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, unsigned unit); 180d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul 181542d6cb1b8a87615b4c4498ce1fcbf39d743f963Brian Paul /** Obtain texture border color (returns ptr to float[4]) */ 182d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul LLVMValueRef 183d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul (*border_color)(const struct lp_sampler_dynamic_state *state, 184efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm, unsigned unit); 185de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca}; 186de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 187de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 188de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 1890a7824862eb753878fa79b153b2a111884ff1197Brian Paul * Keep all information for sampling code generation in a single place. 1900a7824862eb753878fa79b153b2a111884ff1197Brian Paul */ 1910a7824862eb753878fa79b153b2a111884ff1197Brian Paulstruct lp_build_sample_context 1920a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 193efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul struct gallivm_state *gallivm; 1940a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1950a7824862eb753878fa79b153b2a111884ff1197Brian Paul const struct lp_sampler_static_state *static_state; 1960a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1970a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_sampler_dynamic_state *dynamic_state; 1980a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1990a7824862eb753878fa79b153b2a111884ff1197Brian Paul const struct util_format_description *format_desc; 2000a7824862eb753878fa79b153b2a111884ff1197Brian Paul 201f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca /* See texture_dims() */ 202f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca unsigned dims; 203f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca 2043469715a8a171512cf9b528702e70393f01c6041José Fonseca /** SIMD vector width */ 2053469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned vector_width; 2063469715a8a171512cf9b528702e70393f01c6041José Fonseca 2070a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** regular scalar float type */ 2080a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type float_type; 2090a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context float_bld; 2100a7824862eb753878fa79b153b2a111884ff1197Brian Paul 211d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul /** float vector type */ 212d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul struct lp_build_context float_vec_bld; 213d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul 2143469715a8a171512cf9b528702e70393f01c6041José Fonseca /** regular scalar int type */ 2150a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type int_type; 2160a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context int_bld; 2170a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2180a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Incoming coordinates type and build context */ 2190a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type coord_type; 2200a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context coord_bld; 2210a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2220a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Signed integer coordinates */ 2230a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type int_coord_type; 2240a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context int_coord_bld; 2250a7824862eb753878fa79b153b2a111884ff1197Brian Paul 226321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca /** Unsigned integer texture size */ 227438390418d27838bcfcb5bbb4c486db45dbaa44dJosé Fonseca struct lp_type int_size_type; 228438390418d27838bcfcb5bbb4c486db45dbaa44dJosé Fonseca struct lp_build_context int_size_bld; 229321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca 230321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca /** Unsigned integer texture size */ 231321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca struct lp_type float_size_type; 232321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca struct lp_build_context float_size_bld; 233321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca 2340a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Output texels type and build context */ 2350a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type texel_type; 2360a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context texel_bld; 237321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonseca 2383469715a8a171512cf9b528702e70393f01c6041José Fonseca /** Float per-quad type */ 2393469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type perquadf_type; 2403469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_build_context perquadf_bld; 2413469715a8a171512cf9b528702e70393f01c6041José Fonseca 2423469715a8a171512cf9b528702e70393f01c6041José Fonseca /** Int per-quad type */ 2433469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type perquadi_type; 2443469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_build_context perquadi_bld; 2453469715a8a171512cf9b528702e70393f01c6041José Fonseca 246f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca /* Common dynamic state values */ 247f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca LLVMValueRef row_stride_array; 248f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca LLVMValueRef img_stride_array; 249f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca LLVMValueRef data_array; 250f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca 251438390418d27838bcfcb5bbb4c486db45dbaa44dJosé Fonseca /** Integer vector with texture width, height, depth */ 252438390418d27838bcfcb5bbb4c486db45dbaa44dJosé Fonseca LLVMValueRef int_size; 2530a7824862eb753878fa79b153b2a111884ff1197Brian Paul}; 2540a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2550a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2560a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2570a7824862eb753878fa79b153b2a111884ff1197Brian Paul/** 2580a7824862eb753878fa79b153b2a111884ff1197Brian Paul * We only support a few wrap modes in lp_build_sample_wrap_linear_int() at 2590a7824862eb753878fa79b153b2a111884ff1197Brian Paul * this time. Return whether the given mode is supported by that function. 2600a7824862eb753878fa79b153b2a111884ff1197Brian Paul */ 2610a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE boolean 2620a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_is_simple_wrap_mode(unsigned mode) 2630a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2640a7824862eb753878fa79b153b2a111884ff1197Brian Paul switch (mode) { 2650a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEX_WRAP_REPEAT: 2660a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 2670a7824862eb753878fa79b153b2a111884ff1197Brian Paul return TRUE; 2680a7824862eb753878fa79b153b2a111884ff1197Brian Paul default: 2690a7824862eb753878fa79b153b2a111884ff1197Brian Paul return FALSE; 2700a7824862eb753878fa79b153b2a111884ff1197Brian Paul } 2710a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 2720a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2730a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2740a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE void 2750a7824862eb753878fa79b153b2a111884ff1197Brian Paulapply_sampler_swizzle(struct lp_build_sample_context *bld, 2760a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *texel) 2770a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2780a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned char swizzles[4]; 2790a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2800a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[0] = bld->static_state->swizzle_r; 2810a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[1] = bld->static_state->swizzle_g; 2820a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[2] = bld->static_state->swizzle_b; 2830a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[3] = bld->static_state->swizzle_a; 2840a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2850a7824862eb753878fa79b153b2a111884ff1197Brian Paul lp_build_swizzle_soa_inplace(&bld->texel_bld, texel, swizzles); 2860a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 2870a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2880a7824862eb753878fa79b153b2a111884ff1197Brian Paul 289321ec1a22468c1f23bbbf7d5c9de53d4687fec0cJosé Fonsecastatic INLINE unsigned 2900a7824862eb753878fa79b153b2a111884ff1197Brian Paultexture_dims(enum pipe_texture_target tex) 2910a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2920a7824862eb753878fa79b153b2a111884ff1197Brian Paul switch (tex) { 2930a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_1D: 2940a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 1; 2950a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_2D: 296c70d539e24c901c54f427b91997f8ca566847f33Brian Paul case PIPE_TEXTURE_RECT: 2970a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_CUBE: 2980a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 2; 2990a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_3D: 3000a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 3; 3010a7824862eb753878fa79b153b2a111884ff1197Brian Paul default: 3020a7824862eb753878fa79b153b2a111884ff1197Brian Paul assert(0 && "bad texture target in texture_dims()"); 3030a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 2; 3040a7824862eb753878fa79b153b2a111884ff1197Brian Paul } 3050a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 3060a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3070a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3084e6f5e8d43ee87c6f8cdc75de2eeb96f70beb013José Fonsecaboolean 3094e6f5e8d43ee87c6f8cdc75de2eeb96f70beb013José Fonsecalp_sampler_wrap_mode_uses_border_color(unsigned mode, 3104e6f5e8d43ee87c6f8cdc75de2eeb96f70beb013José Fonseca unsigned min_img_filter, 3114e6f5e8d43ee87c6f8cdc75de2eeb96f70beb013José Fonseca unsigned mag_img_filter); 3124e6f5e8d43ee87c6f8cdc75de2eeb96f70beb013José Fonseca 3130a7824862eb753878fa79b153b2a111884ff1197Brian Paul/** 314de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Derive the sampler static state. 315de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 316de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid 317de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_sampler_static_state(struct lp_sampler_static_state *state, 318d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonseca const struct pipe_sampler_view *view, 319de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const struct pipe_sampler_state *sampler); 320de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 321de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 32287dd859b342b844add906358810445da21b6b092José Fonsecavoid 3230a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_lod_selector(struct lp_build_sample_context *bld, 32461b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul unsigned unit, 3253469715a8a171512cf9b528702e70393f01c6041José Fonseca const struct lp_derivatives *derivs, 3260a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef lod_bias, /* optional */ 3270a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef explicit_lod, /* optional */ 32887dd859b342b844add906358810445da21b6b092José Fonseca unsigned mip_filter, 32987dd859b342b844add906358810445da21b6b092José Fonseca LLVMValueRef *out_lod_ipart, 33087dd859b342b844add906358810445da21b6b092José Fonseca LLVMValueRef *out_lod_fpart); 3310a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3320a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 3330a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_nearest_mip_level(struct lp_build_sample_context *bld, 3340a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned unit, 3350a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef lod, 3360a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *level_out); 3370a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3380a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 3390a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_linear_mip_levels(struct lp_build_sample_context *bld, 3400a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned unit, 34187dd859b342b844add906358810445da21b6b092José Fonseca LLVMValueRef lod_ipart, 342df7a2451b1a7b9ce8cc389b20bb707cf951f8d4eJosé Fonseca LLVMValueRef *lod_fpart_inout, 3430a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *level0_out, 34487dd859b342b844add906358810445da21b6b092José Fonseca LLVMValueRef *level1_out); 3450a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3460a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef 3470a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_get_mipmap_level(struct lp_build_sample_context *bld, 348f5b5fb32d3a9eb8667f91907bcf065fe8bd4988dJosé Fonseca LLVMValueRef level); 3490a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3500a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3510a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 3520a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_mipmap_level_sizes(struct lp_build_sample_context *bld, 35305fe33b71cd913876184d1aa4086e4e3f8636eb1José Fonseca LLVMValueRef ilevel, 35434c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *out_size_vec, 35505fe33b71cd913876184d1aa4086e4e3f8636eb1José Fonseca LLVMValueRef *row_stride_vec, 35605fe33b71cd913876184d1aa4086e4e3f8636eb1José Fonseca LLVMValueRef *img_stride_vec); 3570a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3580a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3590a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 36034c11c87e4e3b5639764abee413c45e918749477José Fonsecalp_build_extract_image_sizes(struct lp_build_sample_context *bld, 36134c11c87e4e3b5639764abee413c45e918749477José Fonseca struct lp_type size_type, 36234c11c87e4e3b5639764abee413c45e918749477José Fonseca struct lp_type coord_type, 36334c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef size, 36434c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *out_width, 36534c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *out_height, 36634c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *out_depth); 36734c11c87e4e3b5639764abee413c45e918749477José Fonseca 36834c11c87e4e3b5639764abee413c45e918749477José Fonseca 36934c11c87e4e3b5639764abee413c45e918749477José Fonsecavoid 37034c11c87e4e3b5639764abee413c45e918749477José Fonsecalp_build_unnormalized_coords(struct lp_build_sample_context *bld, 37134c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef flt_size, 37234c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *s, 37334c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *t, 37434c11c87e4e3b5639764abee413c45e918749477José Fonseca LLVMValueRef *r); 37534c11c87e4e3b5639764abee413c45e918749477José Fonseca 37634c11c87e4e3b5639764abee413c45e918749477José Fonseca 37734c11c87e4e3b5639764abee413c45e918749477José Fonsecavoid 3780a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_cube_lookup(struct lp_build_sample_context *bld, 3790a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef s, 3800a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef t, 3810a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef r, 3820a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face, 3830a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face_s, 3840a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face_t); 3850a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3860a7824862eb753878fa79b153b2a111884ff1197Brian Paul 387d981bde38472d8d3bb74dab67eccd7c82915a566José Fonsecavoid 3880a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecalp_build_sample_partial_offset(struct lp_build_context *bld, 3890a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca unsigned block_length, 3900a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef coord, 3910a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef stride, 3920a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef *out_offset, 3930a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef *out_i); 3940a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca 3950a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca 3960a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecavoid 397bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecalp_build_sample_offset(struct lp_build_context *bld, 398bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca const struct util_format_description *format_desc, 399bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca LLVMValueRef x, 400bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca LLVMValueRef y, 40167a2f98be79b368c316ebe6731112734d306b3f6Brian Paul LLVMValueRef z, 40267a2f98be79b368c316ebe6731112734d306b3f6Brian Paul LLVMValueRef y_stride, 403d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef z_stride, 404d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_offset, 405d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_i, 406d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_j); 407bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca 408bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca 409de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid 410efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_sample_soa(struct gallivm_state *gallivm, 411de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const struct lp_sampler_static_state *static_state, 412de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca struct lp_sampler_dynamic_state *dynamic_state, 413b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type fp_type, 414de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit, 415de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned num_coords, 416de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const LLVMValueRef *coords, 4173469715a8a171512cf9b528702e70393f01c6041José Fonseca const struct lp_derivatives *derivs, 418ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, 419ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef explicit_lod, 4201cd31459afa7ea859a7c1e6abb1fc4ae2f0060edBrian Paul LLVMValueRef texel_out[4]); 421de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 4223469715a8a171512cf9b528702e70393f01c6041José Fonseca 4233469715a8a171512cf9b528702e70393f01c6041José Fonsecavoid 4243469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_coord_repeat_npot_linear(struct lp_build_sample_context *bld, 4253469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef coord_f, 4263469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef length_i, 4273469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef length_f, 4283469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef *coord0_i, 4293469715a8a171512cf9b528702e70393f01c6041José Fonseca LLVMValueRef *weight_f); 4303469715a8a171512cf9b528702e70393f01c6041José Fonseca 4313469715a8a171512cf9b528702e70393f01c6041José Fonseca 432045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwellvoid 4335d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertlp_build_size_query_soa(struct gallivm_state *gallivm, 4345d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert const struct lp_sampler_static_state *static_state, 4355d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert struct lp_sampler_dynamic_state *dynamic_state, 4363469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type int_type, 4375d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert unsigned unit, 4385d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef explicit_lod, 4395d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef *sizes_out); 4405d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 4415d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertvoid 4423469715a8a171512cf9b528702e70393f01c6041José Fonsecalp_build_sample_nop(struct gallivm_state *gallivm, 4433469715a8a171512cf9b528702e70393f01c6041José Fonseca struct lp_type type, 4443469715a8a171512cf9b528702e70393f01c6041José Fonseca unsigned num_coords, 4453469715a8a171512cf9b528702e70393f01c6041José Fonseca const LLVMValueRef *coords, 446045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwell LLVMValueRef texel_out[4]); 447de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 448de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 4495d10d757276a599a60a68b88b21087b5824a8df7Olivier GalibertLLVMValueRef 4505d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertlp_build_minify(struct lp_build_context *bld, 4515d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef base_size, 4525d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert LLVMValueRef level); 4535d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 4545d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert 455de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#endif /* LP_BLD_SAMPLE_H */ 456