lp_bld_sample.h revision d1a4dd4217a4b8b018d4d9a161afece640d75694
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/** 55de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler static state. 56de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that 58de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are embedded in the generated code. 59de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 60de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_static_state 61de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{ 6281ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca /* pipe_sampler_view's state */ 63de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca enum pipe_format format; 640a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned swizzle_r:3; /**< PIPE_SWIZZLE_* */ 6581ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_g:3; 6681ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_b:3; 6781ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca unsigned swizzle_a:3; 6881ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca 6981ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca /* pipe_texture's state */ 700a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned target:3; /**< PIPE_TEXTURE_* */ 710a0d17616382948092adeb652701681a2ea7753eBrian Paul unsigned pot_width:1; /**< is the width a power of two? */ 72de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned pot_height:1; 73de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned pot_depth:1; 74de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 75de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca /* pipe_sampler_state's state */ 76de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_s:3; 77de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_t:3; 78de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned wrap_r:3; 79de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned min_img_filter:2; 80de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned min_mip_filter:2; 81de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned mag_img_filter:2; 82de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned compare_mode:1; 83de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned compare_func:3; 84de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned normalized_coords:1; 8561b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul unsigned min_max_lod_equal:1; /**< min_lod == max_lod ? */ 8661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul float min_max_lod; /**< only valid when min_max_lod_equal=1 */ 870a7824862eb753878fa79b153b2a111884ff1197Brian Paul 880a7824862eb753878fa79b153b2a111884ff1197Brian Paul /* Aero hacks */ 890a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned force_nearest_s:1; 900a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned force_nearest_t:1; 91de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca}; 92de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 93de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 94de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 95de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler dynamic state. 96de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that 98de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are computed in runtime. 99de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * 100de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * There are obtained through callbacks, as we don't want to tie the texture 101de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * sampling code generation logic to any particular texture layout or pipe 102de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * driver. 103de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 104de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_dynamic_state 105de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{ 106de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 107de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca /** Obtain the base texture width. */ 108de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1093f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*width)( const struct lp_sampler_dynamic_state *state, 110de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMBuilderRef builder, 111de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 112de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 113de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca /** Obtain the base texture height. */ 114de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1153f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*height)( const struct lp_sampler_dynamic_state *state, 116de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMBuilderRef builder, 117de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 118de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 1197f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul /** Obtain the base texture depth. */ 1207f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMValueRef 1213f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*depth)( const struct lp_sampler_dynamic_state *state, 1227f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMBuilderRef builder, 1237f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul unsigned unit); 1247f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul 1257f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul /** Obtain the number of mipmap levels (minus one). */ 1267f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMValueRef 1273f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*last_level)( const struct lp_sampler_dynamic_state *state, 1287f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul LLVMBuilderRef builder, 1297f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul unsigned unit); 1307f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul 131de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1323f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*row_stride)( const struct lp_sampler_dynamic_state *state, 13353efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul LLVMBuilderRef builder, 13453efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul unsigned unit); 135de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 136de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMValueRef 1373f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*img_stride)( const struct lp_sampler_dynamic_state *state, 138079081222a6881655e112351a57e0a07b0c7b031Brian Paul LLVMBuilderRef builder, 139079081222a6881655e112351a57e0a07b0c7b031Brian Paul unsigned unit); 140079081222a6881655e112351a57e0a07b0c7b031Brian Paul 141079081222a6881655e112351a57e0a07b0c7b031Brian Paul LLVMValueRef 1423f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul (*data_ptr)( const struct lp_sampler_dynamic_state *state, 143de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca LLVMBuilderRef builder, 144de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit); 145de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 14661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul /** Obtain texture min lod */ 14761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 14861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*min_lod)(const struct lp_sampler_dynamic_state *state, 14961b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMBuilderRef builder, unsigned unit); 15061b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul 15161b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul /** Obtain texture max lod */ 15261b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 15361b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*max_lod)(const struct lp_sampler_dynamic_state *state, 15461b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMBuilderRef builder, unsigned unit); 15561b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul 15661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul /** Obtain texture lod bias */ 15761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMValueRef 15861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul (*lod_bias)(const struct lp_sampler_dynamic_state *state, 15961b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul LLVMBuilderRef builder, unsigned unit); 160d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul 161d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul /** Obtain texture border color */ 162d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul LLVMValueRef 163d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul (*border_color)(const struct lp_sampler_dynamic_state *state, 164d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul LLVMBuilderRef builder, unsigned unit); 165de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca}; 166de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 167de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 168de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/** 1690a7824862eb753878fa79b153b2a111884ff1197Brian Paul * Keep all information for sampling code generation in a single place. 1700a7824862eb753878fa79b153b2a111884ff1197Brian Paul */ 1710a7824862eb753878fa79b153b2a111884ff1197Brian Paulstruct lp_build_sample_context 1720a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 1730a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMBuilderRef builder; 1740a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1750a7824862eb753878fa79b153b2a111884ff1197Brian Paul const struct lp_sampler_static_state *static_state; 1760a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1770a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_sampler_dynamic_state *dynamic_state; 1780a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1790a7824862eb753878fa79b153b2a111884ff1197Brian Paul const struct util_format_description *format_desc; 1800a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1810a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** regular scalar float type */ 1820a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type float_type; 1830a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context float_bld; 1840a7824862eb753878fa79b153b2a111884ff1197Brian Paul 185d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul /** float vector type */ 186d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul struct lp_build_context float_vec_bld; 187d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul 1880a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** regular scalar float type */ 1890a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type int_type; 1900a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context int_bld; 1910a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1920a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Incoming coordinates type and build context */ 1930a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type coord_type; 1940a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context coord_bld; 1950a7824862eb753878fa79b153b2a111884ff1197Brian Paul 1960a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Unsigned integer coordinates */ 1970a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type uint_coord_type; 1980a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context uint_coord_bld; 1990a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2000a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Signed integer coordinates */ 2010a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type int_coord_type; 2020a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context int_coord_bld; 2030a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2040a7824862eb753878fa79b153b2a111884ff1197Brian Paul /** Output texels type and build context */ 2050a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_type texel_type; 2060a7824862eb753878fa79b153b2a111884ff1197Brian Paul struct lp_build_context texel_bld; 2070a7824862eb753878fa79b153b2a111884ff1197Brian Paul}; 2080a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2090a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2100a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2110a7824862eb753878fa79b153b2a111884ff1197Brian Paul/** 2120a7824862eb753878fa79b153b2a111884ff1197Brian Paul * We only support a few wrap modes in lp_build_sample_wrap_linear_int() at 2130a7824862eb753878fa79b153b2a111884ff1197Brian Paul * this time. Return whether the given mode is supported by that function. 2140a7824862eb753878fa79b153b2a111884ff1197Brian Paul */ 2150a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE boolean 2160a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_is_simple_wrap_mode(unsigned mode) 2170a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2180a7824862eb753878fa79b153b2a111884ff1197Brian Paul switch (mode) { 2190a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEX_WRAP_REPEAT: 2200a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEX_WRAP_CLAMP_TO_EDGE: 2210a7824862eb753878fa79b153b2a111884ff1197Brian Paul return TRUE; 2220a7824862eb753878fa79b153b2a111884ff1197Brian Paul default: 2230a7824862eb753878fa79b153b2a111884ff1197Brian Paul return FALSE; 2240a7824862eb753878fa79b153b2a111884ff1197Brian Paul } 2250a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 2260a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2270a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2280a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE void 2290a7824862eb753878fa79b153b2a111884ff1197Brian Paulapply_sampler_swizzle(struct lp_build_sample_context *bld, 2300a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *texel) 2310a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2320a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned char swizzles[4]; 2330a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2340a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[0] = bld->static_state->swizzle_r; 2350a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[1] = bld->static_state->swizzle_g; 2360a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[2] = bld->static_state->swizzle_b; 2370a7824862eb753878fa79b153b2a111884ff1197Brian Paul swizzles[3] = bld->static_state->swizzle_a; 2380a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2390a7824862eb753878fa79b153b2a111884ff1197Brian Paul lp_build_swizzle_soa_inplace(&bld->texel_bld, texel, swizzles); 2400a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 2410a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2420a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2430a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE int 2440a7824862eb753878fa79b153b2a111884ff1197Brian Paultexture_dims(enum pipe_texture_target tex) 2450a7824862eb753878fa79b153b2a111884ff1197Brian Paul{ 2460a7824862eb753878fa79b153b2a111884ff1197Brian Paul switch (tex) { 2470a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_1D: 2480a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 1; 2490a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_2D: 250c70d539e24c901c54f427b91997f8ca566847f33Brian Paul case PIPE_TEXTURE_RECT: 2510a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_CUBE: 2520a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 2; 2530a7824862eb753878fa79b153b2a111884ff1197Brian Paul case PIPE_TEXTURE_3D: 2540a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 3; 2550a7824862eb753878fa79b153b2a111884ff1197Brian Paul default: 2560a7824862eb753878fa79b153b2a111884ff1197Brian Paul assert(0 && "bad texture target in texture_dims()"); 2570a7824862eb753878fa79b153b2a111884ff1197Brian Paul return 2; 2580a7824862eb753878fa79b153b2a111884ff1197Brian Paul } 2590a7824862eb753878fa79b153b2a111884ff1197Brian Paul} 2600a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2610a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2620a7824862eb753878fa79b153b2a111884ff1197Brian Paul/** 263de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Derive the sampler static state. 264de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */ 265de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid 266de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_sampler_static_state(struct lp_sampler_static_state *state, 267d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonseca const struct pipe_sampler_view *view, 268de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const struct pipe_sampler_state *sampler); 269de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 270de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 2710a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef 2720a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_lod_selector(struct lp_build_sample_context *bld, 27361b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul unsigned unit, 2740a7824862eb753878fa79b153b2a111884ff1197Brian Paul const LLVMValueRef ddx[4], 2750a7824862eb753878fa79b153b2a111884ff1197Brian Paul const LLVMValueRef ddy[4], 2760a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef lod_bias, /* optional */ 2770a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef explicit_lod, /* optional */ 2780a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef width, 2790a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef height, 2800a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef depth); 2810a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2820a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 2830a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_nearest_mip_level(struct lp_build_sample_context *bld, 2840a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned unit, 2850a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef lod, 2860a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *level_out); 2870a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2880a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 2890a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_linear_mip_levels(struct lp_build_sample_context *bld, 2900a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned unit, 2910a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef lod, 2920a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *level0_out, 2930a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *level1_out, 2940a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *weight_out); 2950a7824862eb753878fa79b153b2a111884ff1197Brian Paul 2960a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef 2970a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_get_mipmap_level(struct lp_build_sample_context *bld, 2980a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef data_array, LLVMValueRef level); 2990a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3000a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef 3010a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_get_const_mipmap_level(struct lp_build_sample_context *bld, 3020a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef data_array, int level); 3030a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3040a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3050a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 3060a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_mipmap_level_sizes(struct lp_build_sample_context *bld, 3070a7824862eb753878fa79b153b2a111884ff1197Brian Paul unsigned dims, 3080a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef width_vec, 3090a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef height_vec, 3100a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef depth_vec, 3110a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef ilevel0, 3120a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef ilevel1, 3130a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef row_stride_array, 3140a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef img_stride_array, 3150a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *width0_vec, 3160a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *width1_vec, 3170a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *height0_vec, 3180a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *height1_vec, 3190a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *depth0_vec, 3200a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *depth1_vec, 3210a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *row_stride0_vec, 3220a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *row_stride1_vec, 3230a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *img_stride0_vec, 3240a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *img_stride1_vec); 3250a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3260a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3270a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid 3280a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_cube_lookup(struct lp_build_sample_context *bld, 3290a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef s, 3300a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef t, 3310a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef r, 3320a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face, 3330a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face_s, 3340a7824862eb753878fa79b153b2a111884ff1197Brian Paul LLVMValueRef *face_t); 3350a7824862eb753878fa79b153b2a111884ff1197Brian Paul 3360a7824862eb753878fa79b153b2a111884ff1197Brian Paul 337d981bde38472d8d3bb74dab67eccd7c82915a566José Fonsecavoid 3380a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecalp_build_sample_partial_offset(struct lp_build_context *bld, 3390a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca unsigned block_length, 3400a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef coord, 3410a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef stride, 3420a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef *out_offset, 3430a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca LLVMValueRef *out_i); 3440a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca 3450a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca 3460a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecavoid 347bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecalp_build_sample_offset(struct lp_build_context *bld, 348bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca const struct util_format_description *format_desc, 349bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca LLVMValueRef x, 350bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca LLVMValueRef y, 35167a2f98be79b368c316ebe6731112734d306b3f6Brian Paul LLVMValueRef z, 35267a2f98be79b368c316ebe6731112734d306b3f6Brian Paul LLVMValueRef y_stride, 353d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef z_stride, 354d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_offset, 355d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_i, 356d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca LLVMValueRef *out_j); 357bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca 358bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca 359de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid 360de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_build_sample_soa(LLVMBuilderRef builder, 361de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const struct lp_sampler_static_state *static_state, 362de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca struct lp_sampler_dynamic_state *dynamic_state, 363b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type fp_type, 364de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned unit, 365de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca unsigned num_coords, 366de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca const LLVMValueRef *coords, 367962558daaed43b0111cd062e32821aad106869d7José Fonseca const LLVMValueRef *ddx, 368962558daaed43b0111cd062e32821aad106869d7José Fonseca const LLVMValueRef *ddy, 369ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, 370ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef explicit_lod, 3711cd31459afa7ea859a7c1e6abb1fc4ae2f0060edBrian Paul LLVMValueRef texel_out[4]); 372de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 373045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwellvoid 374045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwelllp_build_sample_nop(struct lp_type type, 375045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwell LLVMValueRef texel_out[4]); 376de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 377de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca 378de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#endif /* LP_BLD_SAMPLE_H */ 379