1e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**************************************************************************
2e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
3e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Copyright 2009 VMware, Inc.
4e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * All rights reserved.
5e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
6e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * copy of this software and associated documentation files (the
8e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * "Software"), to deal in the Software without restriction, including
9e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * the following conditions:
13e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
14e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * The above copyright notice and this permission notice (including the
15e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * next paragraph) shall be included in all copies or substantial portions
16e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * of the Software.
17e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
18e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
26e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca **************************************************************************/
27e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
28e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**
29e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Texture sampling code generation
30e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
31e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * This file is nothing more than ugly glue between three largely independent
32e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * entities:
33e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - TGSI -> LLVM translation (i.e., lp_build_tgsi_soa)
34e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - texture sampling code generation (i.e., lp_build_sample_soa)
35e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * - LLVM pipe driver
36e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
37e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * All interesting code is in the functions mentioned above. There is really
38e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * nothing to see here.
39e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
40e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
41e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */
42e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
43e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "pipe/p_defines.h"
44e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "pipe/p_shader_tokens.h"
45c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_debug.h"
46efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "gallivm/lp_bld_const.h"
47c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_type.h"
48c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_sample.h"
49c61bf363937f40624a5632745630d4f2b9907082Zack Rusin#include "gallivm/lp_bld_tgsi.h"
5072120292b981fd96e1127f927d7257255c65befdKeith Whitwell#include "lp_jit.h"
51e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca#include "lp_tex_sample.h"
525f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell#include "lp_debug.h"
53e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
54e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
55e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**
56e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * This provides the bridge between the sampler state store in
57e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * lp_jit_context and lp_jit_texture and the sampler code
58e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * generator. It provides the texture layout information required by
59e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * the texture sampler code generator in terms of the state stored in
60e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * lp_jit_context and lp_jit_texture in runtime.
61e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */
62e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct llvmpipe_sampler_dynamic_state
63e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
64e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct lp_sampler_dynamic_state base;
65e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
66e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   const struct lp_sampler_static_state *static_state;
67e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
68e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LLVMValueRef context_ptr;
69e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca};
70e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
71e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
72e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**
73e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * This is the bridge between our sampler and the TGSI translator.
74e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */
75e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct lp_llvm_sampler_soa
76e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
77e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct lp_build_sampler_soa base;
78e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
79e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct llvmpipe_sampler_dynamic_state dynamic_state;
80e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca};
81e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
82e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
83e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**
84e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * Fetch the specified member of the lp_jit_texture structure.
85f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul * \param emit_load  if TRUE, emit the LLVM load instruction to actually
86f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul *                   fetch the field's value.  Otherwise, just emit the
87f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul *                   GEP code to address the field.
88e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
89e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca * @sa http://llvm.org/docs/GetElementPtr.html
90e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */
91e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic LLVMValueRef
923f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paullp_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
93efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                       struct gallivm_state *gallivm,
94e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       unsigned unit,
95e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       unsigned member_index,
96f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul                       const char *member_name,
97f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul                       boolean emit_load)
98e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
99e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul   struct llvmpipe_sampler_dynamic_state *state =
100e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul      (struct llvmpipe_sampler_dynamic_state *)base;
101efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMBuilderRef builder = gallivm->builder;
102e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LLVMValueRef indices[4];
103e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LLVMValueRef ptr;
104e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   LLVMValueRef res;
105e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
106e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   assert(unit < PIPE_MAX_SAMPLERS);
107e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
108e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   /* context[0] */
109efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[0] = lp_build_const_int32(gallivm, 0);
110e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   /* context[0].textures */
111efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[1] = lp_build_const_int32(gallivm, LP_JIT_CTX_TEXTURES);
112e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   /* context[0].textures[unit] */
113efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[2] = lp_build_const_int32(gallivm, unit);
114e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   /* context[0].textures[unit].member */
115efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[3] = lp_build_const_int32(gallivm, member_index);
116e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
117e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
118e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
119f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul   if (emit_load)
120f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul      res = LLVMBuildLoad(builder, ptr, "");
121f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul   else
122f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul      res = ptr;
123e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
124e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   lp_build_name(res, "context.texture%u.%s", unit, member_name);
125e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
126e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   return res;
127e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}
128e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
129e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
130e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca/**
131e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * Helper macro to instantiate the functions that generate the code to
132e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * fetch the members of lp_jit_texture to fulfill the sampler code
133e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * generator requests.
134e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca *
135e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * This complexity is the price we have to pay to keep the texture
136e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * sampler code generator a reusable module without dependencies to
137e3b6f7b8003a8838da2a219f62d6c025a87e9396Brian Paul * llvmpipe internals.
138e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca */
139f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul#define LP_LLVM_TEXTURE_MEMBER(_name, _index, _emit_load)  \
140e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   static LLVMValueRef \
1413f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul   lp_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \
142efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                            struct gallivm_state *gallivm, \
143e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                            unsigned unit) \
144e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   { \
145efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      return lp_llvm_texture_member(base, gallivm, unit, _index, #_name, _emit_load ); \
146e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   }
147e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
148e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
149f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(width,      LP_JIT_TEXTURE_WIDTH, TRUE)
150f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(height,     LP_JIT_TEXTURE_HEIGHT, TRUE)
151f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(depth,      LP_JIT_TEXTURE_DEPTH, TRUE)
15208070cead0bb79d4441d8c5b900d1571bb63c670Fabian BielerLP_LLVM_TEXTURE_MEMBER(first_level, LP_JIT_TEXTURE_FIRST_LEVEL, TRUE)
153f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(last_level, LP_JIT_TEXTURE_LAST_LEVEL, TRUE)
15453efb634a0c134feebb5a3e47fc33660694be9c3Brian PaulLP_LLVM_TEXTURE_MEMBER(row_stride, LP_JIT_TEXTURE_ROW_STRIDE, FALSE)
155f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian PaulLP_LLVM_TEXTURE_MEMBER(img_stride, LP_JIT_TEXTURE_IMG_STRIDE, FALSE)
156f027d5612901de8e6167e6288c4e24d91d964e7fBrian PaulLP_LLVM_TEXTURE_MEMBER(data_ptr,   LP_JIT_TEXTURE_DATA, FALSE)
15761b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(min_lod,    LP_JIT_TEXTURE_MIN_LOD, TRUE)
15861b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(max_lod,    LP_JIT_TEXTURE_MAX_LOD, TRUE)
15961b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian PaulLP_LLVM_TEXTURE_MEMBER(lod_bias,   LP_JIT_TEXTURE_LOD_BIAS, TRUE)
160d1a4dd4217a4b8b018d4d9a161afece640d75694Brian PaulLP_LLVM_TEXTURE_MEMBER(border_color, LP_JIT_TEXTURE_BORDER_COLOR, FALSE)
161e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
162e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
163e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic void
164e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecalp_llvm_sampler_soa_destroy(struct lp_build_sampler_soa *sampler)
165e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
166e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   FREE(sampler);
167e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}
168e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
169e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
170ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul/**
171ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul * Fetch filtered values from texture.
172ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul * The 'texel' parameter returns four vectors corresponding to R, G, B, A.
173ad1456a4447bff8a1dac69723663c698d6abbe81Brian Paul */
174e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastatic void
1753f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paullp_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
176efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                                     struct gallivm_state *gallivm,
177b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                                     struct lp_type type,
178e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                                     unsigned unit,
179e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                                     unsigned num_coords,
180e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                                     const LLVMValueRef *coords,
1813469715a8a171512cf9b528702e70393f01c6041José Fonseca                                     const struct lp_derivatives *derivs,
182ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                                     LLVMValueRef lod_bias, /* optional */
183ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                                     LLVMValueRef explicit_lod, /* optional */
184e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                                     LLVMValueRef *texel)
185e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
186e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base;
187e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
188e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   assert(unit < PIPE_MAX_SAMPLERS);
1895f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell
1905f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   if (LP_PERF & PERF_NO_TEX) {
1913469715a8a171512cf9b528702e70393f01c6041José Fonseca      lp_build_sample_nop(gallivm, type, num_coords, coords, texel);
1925f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell      return;
1935f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell   }
194e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
195efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_sample_soa(gallivm,
196e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       &sampler->dynamic_state.static_state[unit],
197e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       &sampler->dynamic_state.base,
198e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       type,
199e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       unit,
200962558daaed43b0111cd062e32821aad106869d7José Fonseca                       num_coords, coords,
2013469715a8a171512cf9b528702e70393f01c6041José Fonseca                       derivs,
202ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                       lod_bias, explicit_lod,
203e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                       texel);
204e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}
205e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
2065d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert/**
2075d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert * Fetch the texture size.
2085d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert */
2095d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void
2105d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertlp_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
2115d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                    struct gallivm_state *gallivm,
2123469715a8a171512cf9b528702e70393f01c6041José Fonseca                                    struct lp_type type,
2135d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                    unsigned unit,
2145d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                    LLVMValueRef explicit_lod, /* optional */
2155d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                    LLVMValueRef *sizes_out)
2165d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{
2175d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   struct lp_llvm_sampler_soa *sampler = (struct lp_llvm_sampler_soa *)base;
2185d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
2195d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   assert(unit < PIPE_MAX_SAMPLERS);
2205d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
2215d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   lp_build_size_query_soa(gallivm,
2225d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert			   &sampler->dynamic_state.static_state[unit],
2235d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert			   &sampler->dynamic_state.base,
2243469715a8a171512cf9b528702e70393f01c6041José Fonseca                           type,
2255d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert			   unit,
2265d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert			   explicit_lod,
2275d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert			   sizes_out);
2285d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert}
2295d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
230e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
231e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecastruct lp_build_sampler_soa *
232e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonsecalp_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
233e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca                           LLVMValueRef context_ptr)
234e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca{
235e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   struct lp_llvm_sampler_soa *sampler;
236e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
237e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler = CALLOC_STRUCT(lp_llvm_sampler_soa);
238e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   if(!sampler)
239e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca      return NULL;
240e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
241e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->base.destroy = lp_llvm_sampler_soa_destroy;
242e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->base.emit_fetch_texel = lp_llvm_sampler_soa_emit_fetch_texel;
2435d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   sampler->base.emit_size_query = lp_llvm_sampler_soa_emit_size_query;
244e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->dynamic_state.base.width = lp_llvm_texture_width;
245e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->dynamic_state.base.height = lp_llvm_texture_height;
246b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   sampler->dynamic_state.base.depth = lp_llvm_texture_depth;
24708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   sampler->dynamic_state.base.first_level = lp_llvm_texture_first_level;
248b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul   sampler->dynamic_state.base.last_level = lp_llvm_texture_last_level;
24953efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul   sampler->dynamic_state.base.row_stride = lp_llvm_texture_row_stride;
250f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul   sampler->dynamic_state.base.img_stride = lp_llvm_texture_img_stride;
251e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->dynamic_state.base.data_ptr = lp_llvm_texture_data_ptr;
25261b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   sampler->dynamic_state.base.min_lod = lp_llvm_texture_min_lod;
25361b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   sampler->dynamic_state.base.max_lod = lp_llvm_texture_max_lod;
25461b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul   sampler->dynamic_state.base.lod_bias = lp_llvm_texture_lod_bias;
255d1a4dd4217a4b8b018d4d9a161afece640d75694Brian Paul   sampler->dynamic_state.base.border_color = lp_llvm_texture_border_color;
25661b7da074e2faebf03d3dfc30e910ee1367bcd5aBrian Paul
257e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->dynamic_state.static_state = static_state;
258e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   sampler->dynamic_state.context_ptr = context_ptr;
259e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
260e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca   return &sampler->base;
261e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca}
262e4c76c02f77ed6e86537b546f4200f8f8132d114José Fonseca
263