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