lp_bld_sample.h revision 1cd31459afa7ea859a7c1e6abb1fc4ae2f0060ed
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
390d71ba46e613230c84165106c1fcc9027dec4cd3Brian Paul#include "gallivm/lp_bld.h"
40de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
41287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct pipe_resource;
42d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonsecastruct pipe_sampler_view;
43de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct pipe_sampler_state;
44bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct util_format_description;
45b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecastruct lp_type;
46bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct lp_build_context;
47de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
48de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
49de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
50de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler static state.
51de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
52287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that
53de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are embedded in the generated code.
54de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
55de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_static_state
56de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{
5781ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca   /* pipe_sampler_view's state */
58de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   enum pipe_format format;
590a0d17616382948092adeb652701681a2ea7753eBrian Paul   unsigned swizzle_r:3;     /**< PIPE_SWIZZLE_* */
6081ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca   unsigned swizzle_g:3;
6181ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca   unsigned swizzle_b:3;
6281ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca   unsigned swizzle_a:3;
6381ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca
6481ab19de04e623d24cb65ad1ed3b240bce78235bJosé Fonseca   /* pipe_texture's state */
650a0d17616382948092adeb652701681a2ea7753eBrian Paul   unsigned target:3;        /**< PIPE_TEXTURE_* */
660a0d17616382948092adeb652701681a2ea7753eBrian Paul   unsigned pot_width:1;     /**< is the width a power of two? */
67de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned pot_height:1;
68de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned pot_depth:1;
69de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
70de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /* pipe_sampler_state's state */
71de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_s:3;
72de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_t:3;
73de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_r:3;
74de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned min_img_filter:2;
75de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned min_mip_filter:2;
76de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned mag_img_filter:2;
77de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned compare_mode:1;
78de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned compare_func:3;
79de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned normalized_coords:1;
8036a0c4219deaa1509ae9746abb845f9502ca9f1bBrian Paul   float lod_bias, min_lod, max_lod;
81946edea794646443abde05363294fed430d8d6f1Brian Paul   float border_color[4];
82de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca};
83de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
84de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
85de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
86de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler dynamic state.
87de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
88287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell * These are the bits of state from pipe_resource and pipe_sampler_state that
89de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are computed in runtime.
90de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
91de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * There are obtained through callbacks, as we don't want to tie the texture
92de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * sampling code generation logic to any particular texture layout or pipe
93de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * driver.
94de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
95de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_dynamic_state
96de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{
97de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
98de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /** Obtain the base texture width. */
99de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
1003f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*width)( const struct lp_sampler_dynamic_state *state,
101de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca             LLVMBuilderRef builder,
102de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca             unsigned unit);
103de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
104de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /** Obtain the base texture height. */
105de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
1063f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*height)( const struct lp_sampler_dynamic_state *state,
107de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              LLVMBuilderRef builder,
108de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              unsigned unit);
109de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
1107f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   /** Obtain the base texture depth. */
1117f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   LLVMValueRef
1123f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*depth)( const struct lp_sampler_dynamic_state *state,
1137f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul             LLVMBuilderRef builder,
1147f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul             unsigned unit);
1157f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul
1167f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   /** Obtain the number of mipmap levels (minus one). */
1177f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   LLVMValueRef
1183f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*last_level)( const struct lp_sampler_dynamic_state *state,
1197f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul                  LLVMBuilderRef builder,
1207f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul                  unsigned unit);
1217f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul
122de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
1233f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*row_stride)( const struct lp_sampler_dynamic_state *state,
12453efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul                  LLVMBuilderRef builder,
12553efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul                  unsigned unit);
126de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
127de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
1283f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*img_stride)( const struct lp_sampler_dynamic_state *state,
129079081222a6881655e112351a57e0a07b0c7b031Brian Paul                  LLVMBuilderRef builder,
130079081222a6881655e112351a57e0a07b0c7b031Brian Paul                  unsigned unit);
131079081222a6881655e112351a57e0a07b0c7b031Brian Paul
132079081222a6881655e112351a57e0a07b0c7b031Brian Paul   LLVMValueRef
1333f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   (*data_ptr)( const struct lp_sampler_dynamic_state *state,
134de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                LLVMBuilderRef builder,
135de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                unsigned unit);
136de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
137de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca};
138de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
139de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
140de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
141de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Derive the sampler static state.
142de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
143de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
144de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_sampler_static_state(struct lp_sampler_static_state *state,
145d67e3487ac4c678892d0aea535cacfd5f1d86a27José Fonseca                        const struct pipe_sampler_view *view,
146de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                        const struct pipe_sampler_state *sampler);
147de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
148de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
149b4f6907b8d8a966df56c06155049c52dadea105fJosé FonsecaLLVMValueRef
150b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonsecalp_build_gather(LLVMBuilderRef builder,
151b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned length,
152b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned src_width,
153b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned dst_width,
154b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                LLVMValueRef base_ptr,
155b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                LLVMValueRef offsets);
156b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca
157b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca
158bc93e9181cf179a797679d30cd1a3a563e1756c0José FonsecaLLVMValueRef
159bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecalp_build_sample_offset(struct lp_build_context *bld,
160bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       const struct util_format_description *format_desc,
161bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef x,
162bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef y,
16367a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef z,
16467a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef y_stride,
16567a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef z_stride);
166bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
167bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
168de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
169de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_build_sample_soa(LLVMBuilderRef builder,
170de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const struct lp_sampler_static_state *static_state,
171de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    struct lp_sampler_dynamic_state *dynamic_state,
172b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                    struct lp_type fp_type,
173de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned unit,
174de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned num_coords,
175de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const LLVMValueRef *coords,
176962558daaed43b0111cd062e32821aad106869d7José Fonseca                    const LLVMValueRef *ddx,
177962558daaed43b0111cd062e32821aad106869d7José Fonseca                    const LLVMValueRef *ddy,
178ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                    LLVMValueRef lod_bias,
179ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                    LLVMValueRef explicit_lod,
1801cd31459afa7ea859a7c1e6abb1fc4ae2f0060edBrian Paul                    LLVMValueRef texel_out[4]);
181de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
182de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
183de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
184de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#endif /* LP_BLD_SAMPLE_H */
185