lp_bld_sample.h revision 67a2f98be79b368c316ebe6731112734d306b3f6
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
39de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#include <llvm-c/Core.h>
40de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
41de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct pipe_texture;
42de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct pipe_sampler_state;
43bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct util_format_description;
44b4835ea03d64261da5a892f9590c9977b06920e8José Fonsecastruct lp_type;
45bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecastruct lp_build_context;
46de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
47de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
48de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
49de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler static state.
50de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
51de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * These are the bits of state from pipe_texture and pipe_sampler_state that
52de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are embedded in the generated code.
53de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
54de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_static_state
55de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{
56de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /* pipe_texture's state */
57de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   enum pipe_format format;
584139bc8f4375c1f8961b281b6303bccaab24367aJosé Fonseca   unsigned target:2;
59de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned pot_width:1;
60de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned pot_height:1;
61de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned pot_depth:1;
62de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
63de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /* pipe_sampler_state's state */
64de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_s:3;
65de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_t:3;
66de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned wrap_r:3;
67de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned min_img_filter:2;
68de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned min_mip_filter:2;
69de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned mag_img_filter:2;
70de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned compare_mode:1;
71de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned compare_func:3;
72de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   unsigned normalized_coords:1;
7336a0c4219deaa1509ae9746abb845f9502ca9f1bBrian Paul   float lod_bias, min_lod, max_lod;
74946edea794646443abde05363294fed430d8d6f1Brian Paul   float border_color[4];
75de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca};
76de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
77de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
78de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
79de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Sampler dynamic state.
80de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
81de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * These are the bits of state from pipe_texture and pipe_sampler_state that
82de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * are computed in runtime.
83de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca *
84de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * There are obtained through callbacks, as we don't want to tie the texture
85de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * sampling code generation logic to any particular texture layout or pipe
86de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * driver.
87de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
88de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecastruct lp_sampler_dynamic_state
89de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca{
90de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
91de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /** Obtain the base texture width. */
92de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
93de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   (*width)( struct lp_sampler_dynamic_state *state,
94de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca             LLVMBuilderRef builder,
95de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca             unsigned unit);
96de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
97de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   /** Obtain the base texture height. */
98de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
99de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   (*height)( struct lp_sampler_dynamic_state *state,
100de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              LLVMBuilderRef builder,
101de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              unsigned unit);
102de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
1037f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   /** Obtain the base texture depth. */
1047f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   LLVMValueRef
1057f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   (*depth)( struct lp_sampler_dynamic_state *state,
1067f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul             LLVMBuilderRef builder,
1077f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul             unsigned unit);
1087f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul
1097f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   /** Obtain the number of mipmap levels (minus one). */
1107f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   LLVMValueRef
1117f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul   (*last_level)( struct lp_sampler_dynamic_state *state,
1127f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul                  LLVMBuilderRef builder,
1137f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul                  unsigned unit);
1147f4b5c5387a3a8e3c5f31f0badc943c43857683aBrian Paul
115de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
116de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   (*stride)( struct lp_sampler_dynamic_state *state,
117de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              LLVMBuilderRef builder,
118de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca              unsigned unit);
119de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
120de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   LLVMValueRef
121de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca   (*data_ptr)( struct lp_sampler_dynamic_state *state,
122de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                LLVMBuilderRef builder,
123de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                unsigned unit);
124de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
125de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca};
126de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
127de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
128de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca/**
129de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca * Derive the sampler static state.
130de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca */
131de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
132de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_sampler_static_state(struct lp_sampler_static_state *state,
133de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                        const struct pipe_texture *texture,
134de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                        const struct pipe_sampler_state *sampler);
135de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
136de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
137b4f6907b8d8a966df56c06155049c52dadea105fJosé FonsecaLLVMValueRef
138b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonsecalp_build_gather(LLVMBuilderRef builder,
139b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned length,
140b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned src_width,
141b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                unsigned dst_width,
142b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                LLVMValueRef base_ptr,
143b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca                LLVMValueRef offsets);
144b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca
145b4f6907b8d8a966df56c06155049c52dadea105fJosé Fonseca
146bc93e9181cf179a797679d30cd1a3a563e1756c0José FonsecaLLVMValueRef
147bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonsecalp_build_sample_offset(struct lp_build_context *bld,
148bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       const struct util_format_description *format_desc,
149bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef x,
150bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca                       LLVMValueRef y,
15167a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef z,
15267a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef y_stride,
15367a2f98be79b368c316ebe6731112734d306b3f6Brian Paul                       LLVMValueRef z_stride);
154bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
155bc93e9181cf179a797679d30cd1a3a563e1756c0José Fonseca
156de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecavoid
157de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonsecalp_build_sample_soa(LLVMBuilderRef builder,
158de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const struct lp_sampler_static_state *static_state,
159de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    struct lp_sampler_dynamic_state *dynamic_state,
160b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                    struct lp_type fp_type,
161de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned unit,
162de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    unsigned num_coords,
163de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    const LLVMValueRef *coords,
164de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    LLVMValueRef lodbias,
165de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca                    LLVMValueRef *texel);
166de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
167de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
168de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca
169de8376e2f22a59a0bc18bb7ddab88ee3153678b8José Fonseca#endif /* LP_BLD_SAMPLE_H */
170