lp_bld_sample.h revision c70d539e24c901c54f427b91997f8ca566847f33
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;
8536a0c4219deaa1509ae9746abb845f9502ca9f1bBrian Paul   float lod_bias, min_lod, max_lod;
86946edea794646443abde05363294fed430d8d6f1Brian Paul   float border_color[4];
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
146de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca};
147de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
148de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
149de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
1500a7824862eb753878fa79b153b2a111884ff1197Brian Paul * Keep all information for sampling code generation in a single place.
1510a7824862eb753878fa79b153b2a111884ff1197Brian Paul */
1520a7824862eb753878fa79b153b2a111884ff1197Brian Paulstruct lp_build_sample_context
1530a7824862eb753878fa79b153b2a111884ff1197Brian Paul{
1540a7824862eb753878fa79b153b2a111884ff1197Brian Paul   LLVMBuilderRef builder;
1550a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1560a7824862eb753878fa79b153b2a111884ff1197Brian Paul   const struct lp_sampler_static_state *static_state;
1570a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1580a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_sampler_dynamic_state *dynamic_state;
1590a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1600a7824862eb753878fa79b153b2a111884ff1197Brian Paul   const struct util_format_description *format_desc;
1610a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1620a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** regular scalar float type */
1630a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type float_type;
1640a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context float_bld;
1650a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1660a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** regular scalar float type */
1670a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type int_type;
1680a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context int_bld;
1690a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1700a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** Incoming coordinates type and build context */
1710a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type coord_type;
1720a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context coord_bld;
1730a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1740a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** Unsigned integer coordinates */
1750a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type uint_coord_type;
1760a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context uint_coord_bld;
1770a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1780a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** Signed integer coordinates */
1790a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type int_coord_type;
1800a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context int_coord_bld;
1810a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1820a7824862eb753878fa79b153b2a111884ff1197Brian Paul   /** Output texels type and build context */
1830a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_type texel_type;
1840a7824862eb753878fa79b153b2a111884ff1197Brian Paul   struct lp_build_context texel_bld;
1850a7824862eb753878fa79b153b2a111884ff1197Brian Paul};
1860a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1870a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1880a7824862eb753878fa79b153b2a111884ff1197Brian Paul
1890a7824862eb753878fa79b153b2a111884ff1197Brian Paul/**
1900a7824862eb753878fa79b153b2a111884ff1197Brian Paul * We only support a few wrap modes in lp_build_sample_wrap_linear_int() at
1910a7824862eb753878fa79b153b2a111884ff1197Brian Paul * this time.  Return whether the given mode is supported by that function.
1920a7824862eb753878fa79b153b2a111884ff1197Brian Paul */
1930a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE boolean
1940a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_is_simple_wrap_mode(unsigned mode)
1950a7824862eb753878fa79b153b2a111884ff1197Brian Paul{
1960a7824862eb753878fa79b153b2a111884ff1197Brian Paul   switch (mode) {
1970a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEX_WRAP_REPEAT:
1980a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
1990a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return TRUE;
2000a7824862eb753878fa79b153b2a111884ff1197Brian Paul   default:
2010a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return FALSE;
2020a7824862eb753878fa79b153b2a111884ff1197Brian Paul   }
2030a7824862eb753878fa79b153b2a111884ff1197Brian Paul}
2040a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2050a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2060a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE void
2070a7824862eb753878fa79b153b2a111884ff1197Brian Paulapply_sampler_swizzle(struct lp_build_sample_context *bld,
2080a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef *texel)
2090a7824862eb753878fa79b153b2a111884ff1197Brian Paul{
2100a7824862eb753878fa79b153b2a111884ff1197Brian Paul   unsigned char swizzles[4];
2110a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2120a7824862eb753878fa79b153b2a111884ff1197Brian Paul   swizzles[0] = bld->static_state->swizzle_r;
2130a7824862eb753878fa79b153b2a111884ff1197Brian Paul   swizzles[1] = bld->static_state->swizzle_g;
2140a7824862eb753878fa79b153b2a111884ff1197Brian Paul   swizzles[2] = bld->static_state->swizzle_b;
2150a7824862eb753878fa79b153b2a111884ff1197Brian Paul   swizzles[3] = bld->static_state->swizzle_a;
2160a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2170a7824862eb753878fa79b153b2a111884ff1197Brian Paul   lp_build_swizzle_soa_inplace(&bld->texel_bld, texel, swizzles);
2180a7824862eb753878fa79b153b2a111884ff1197Brian Paul}
2190a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2200a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2210a7824862eb753878fa79b153b2a111884ff1197Brian Paulstatic INLINE int
2220a7824862eb753878fa79b153b2a111884ff1197Brian Paultexture_dims(enum pipe_texture_target tex)
2230a7824862eb753878fa79b153b2a111884ff1197Brian Paul{
2240a7824862eb753878fa79b153b2a111884ff1197Brian Paul   switch (tex) {
2250a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEXTURE_1D:
2260a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return 1;
2270a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEXTURE_2D:
228c70d539e24c901c54f427b91997f8ca566847f33Brian Paul   case PIPE_TEXTURE_RECT:
2290a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEXTURE_CUBE:
2300a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return 2;
2310a7824862eb753878fa79b153b2a111884ff1197Brian Paul   case PIPE_TEXTURE_3D:
2320a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return 3;
2330a7824862eb753878fa79b153b2a111884ff1197Brian Paul   default:
2340a7824862eb753878fa79b153b2a111884ff1197Brian Paul      assert(0 && "bad texture target in texture_dims()");
2350a7824862eb753878fa79b153b2a111884ff1197Brian Paul      return 2;
2360a7824862eb753878fa79b153b2a111884ff1197Brian Paul   }
2370a7824862eb753878fa79b153b2a111884ff1197Brian Paul}
2380a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2390a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2400a7824862eb753878fa79b153b2a111884ff1197Brian Paul/**
241de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Derive the sampler static state.
242de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
243de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
244de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_sampler_static_state(struct lp_sampler_static_state *state,
245d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonseca                        const struct pipe_sampler_view *view,
246de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                        const struct pipe_sampler_state *sampler);
247de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
248de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
2490a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef
2500a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_lod_selector(struct lp_build_sample_context *bld,
2510a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      const LLVMValueRef ddx[4],
2520a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      const LLVMValueRef ddy[4],
2530a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef lod_bias, /* optional */
2540a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef explicit_lod, /* optional */
2550a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef width,
2560a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef height,
2570a7824862eb753878fa79b153b2a111884ff1197Brian Paul                      LLVMValueRef depth);
2580a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2590a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid
2600a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_nearest_mip_level(struct lp_build_sample_context *bld,
2610a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           unsigned unit,
2620a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef lod,
2630a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef *level_out);
2640a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2650a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid
2660a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_linear_mip_levels(struct lp_build_sample_context *bld,
2670a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           unsigned unit,
2680a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef lod,
2690a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef *level0_out,
2700a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef *level1_out,
2710a7824862eb753878fa79b153b2a111884ff1197Brian Paul                           LLVMValueRef *weight_out);
2720a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2730a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef
2740a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_get_mipmap_level(struct lp_build_sample_context *bld,
2750a7824862eb753878fa79b153b2a111884ff1197Brian Paul                          LLVMValueRef data_array, LLVMValueRef level);
2760a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2770a7824862eb753878fa79b153b2a111884ff1197Brian PaulLLVMValueRef
2780a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_get_const_mipmap_level(struct lp_build_sample_context *bld,
2790a7824862eb753878fa79b153b2a111884ff1197Brian Paul                                LLVMValueRef data_array, int level);
2800a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2810a7824862eb753878fa79b153b2a111884ff1197Brian Paul
2820a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid
2830a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_mipmap_level_sizes(struct lp_build_sample_context *bld,
2840a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            unsigned dims,
2850a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef width_vec,
2860a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef height_vec,
2870a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef depth_vec,
2880a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef ilevel0,
2890a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef ilevel1,
2900a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef row_stride_array,
2910a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef img_stride_array,
2920a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *width0_vec,
2930a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *width1_vec,
2940a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *height0_vec,
2950a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *height1_vec,
2960a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *depth0_vec,
2970a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *depth1_vec,
2980a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *row_stride0_vec,
2990a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *row_stride1_vec,
3000a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *img_stride0_vec,
3010a7824862eb753878fa79b153b2a111884ff1197Brian Paul                            LLVMValueRef *img_stride1_vec);
3020a7824862eb753878fa79b153b2a111884ff1197Brian Paul
3030a7824862eb753878fa79b153b2a111884ff1197Brian Paul
3040a7824862eb753878fa79b153b2a111884ff1197Brian Paulvoid
3050a7824862eb753878fa79b153b2a111884ff1197Brian Paullp_build_cube_lookup(struct lp_build_sample_context *bld,
3060a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef s,
3070a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef t,
3080a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef r,
3090a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef *face,
3100a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef *face_s,
3110a7824862eb753878fa79b153b2a111884ff1197Brian Paul                     LLVMValueRef *face_t);
3120a7824862eb753878fa79b153b2a111884ff1197Brian Paul
3130a7824862eb753878fa79b153b2a111884ff1197Brian Paul
314d981bde38472d8d3bb74dab67eccd7c82915a566José Fonsecavoid
3150a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecalp_build_sample_partial_offset(struct lp_build_context *bld,
3160a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca                               unsigned block_length,
3170a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca                               LLVMValueRef coord,
3180a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca                               LLVMValueRef stride,
3190a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca                               LLVMValueRef *out_offset,
3200a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca                               LLVMValueRef *out_i);
3210a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca
3220a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonseca
3230a6c908e0d2d1721421f7b26d73975f4f61e24a2José Fonsecavoid
324bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecalp_build_sample_offset(struct lp_build_context *bld,
325bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       const struct util_format_description *format_desc,
326bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef x,
327bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef y,
32867a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef z,
32967a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef y_stride,
330d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca                       LLVMValueRef z_stride,
331d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca                       LLVMValueRef *out_offset,
332d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca                       LLVMValueRef *out_i,
333d981bde38472d8d3bb74dab67eccd7c82915a566José Fonseca                       LLVMValueRef *out_j);
334bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
335bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
336de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
337de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_build_sample_soa(LLVMBuilderRef builder,
338de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const struct lp_sampler_static_state *static_state,
339de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    struct lp_sampler_dynamic_state *dynamic_state,
340b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                    struct lp_type fp_type,
341de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned unit,
342de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned num_coords,
343de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const LLVMValueRef *coords,
344962558daaed43b0111cd062e32821aad106869d7José Fonseca                    const LLVMValueRef *ddx,
345962558daaed43b0111cd062e32821aad106869d7José Fonseca                    const LLVMValueRef *ddy,
346ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                    LLVMValueRef lod_bias,
347ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                    LLVMValueRef explicit_lod,
3481cd31459afa7ea859a7c1e6abb1fc4ae2f0060edBrian Paul                    LLVMValueRef texel_out[4]);
349de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
350045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwellvoid
351045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwelllp_build_sample_nop(struct lp_type type,
352045ee4601179c44f815ce3842ef900b36d54c914Keith Whitwell                    LLVMValueRef texel_out[4]);
353de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
354de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
355de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#endif /* LP_BLD_SAMPLE_H */
356