101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**************************************************************************
201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Copyright 2010 VMware, Inc.
401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * All rights reserved.
501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Permission is hereby granted, free of charge, to any person obtaining a
701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * copy of this software and associated documentation files (the
801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * "Software"), to deal in the Software without restriction, including
901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * without limitation the rights to use, copy, modify, merge, publish,
1001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * distribute, sub license, and/or sell copies of the Software, and to
1101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * permit persons to whom the Software is furnished to do so, subject to
1201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * the following conditions:
1301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
1401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * The above copyright notice and this permission notice (including the
1501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * next paragraph) shall be included in all copies or substantial portions
1601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * of the Software.
1701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
1801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
2201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
2601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin **************************************************************************/
2701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
2801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
2901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Texture sampling code generation
3001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * @author Jose Fonseca <jfonseca@vmware.com>
3101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
3201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
3301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "pipe/p_defines.h"
3401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "pipe/p_shader_tokens.h"
35efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul#include "gallivm/lp_bld_const.h"
3601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_debug.h"
3701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_type.h"
3801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_sample.h"
3901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "gallivm/lp_bld_tgsi.h"
4001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
4101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
4201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_debug.h"
4301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_memory.h"
4401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_pointer.h"
4501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "util/u_string.h"
4601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
4701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#include "draw_llvm.h"
4801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
4901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
5001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
5101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This provides the bridge between the sampler state store in
5201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * lp_jit_context and lp_jit_texture and the sampler code
5301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * generator. It provides the texture layout information required by
5401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * the texture sampler code generator in terms of the state stored in
5501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * lp_jit_context and lp_jit_texture in runtime.
5601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
5701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct draw_llvm_sampler_dynamic_state
5801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
5901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct lp_sampler_dynamic_state base;
6001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
6101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   const struct lp_sampler_static_state *static_state;
6201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
6301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   LLVMValueRef context_ptr;
6401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin};
6501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
6601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
6701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
6801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This is the bridge between our sampler and the TGSI translator.
6901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
7001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct draw_llvm_sampler_soa
7101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
7201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct lp_build_sampler_soa base;
7301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
7401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct draw_llvm_sampler_dynamic_state dynamic_state;
7501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin};
7601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
7701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
7801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
7901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Fetch the specified member of the lp_jit_texture structure.
8001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * \param emit_load  if TRUE, emit the LLVM load instruction to actually
8101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *                   fetch the field's value.  Otherwise, just emit the
8201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *                   GEP code to address the field.
8301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
8401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * @sa http://llvm.org/docs/GetElementPtr.html
8501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
8601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic LLVMValueRef
8701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_texture_member(const struct lp_sampler_dynamic_state *base,
88efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                         struct gallivm_state *gallivm,
8901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                         unsigned unit,
9001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                         unsigned member_index,
9101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                         const char *member_name,
9201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                         boolean emit_load)
9301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
94efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   LLVMBuilderRef builder = gallivm->builder;
9501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct draw_llvm_sampler_dynamic_state *state =
9601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin      (struct draw_llvm_sampler_dynamic_state *)base;
9701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   LLVMValueRef indices[4];
9801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   LLVMValueRef ptr;
9901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   LLVMValueRef res;
10001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
101cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   debug_assert(unit < PIPE_MAX_SAMPLERS);
10201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
10301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   /* context[0] */
104efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[0] = lp_build_const_int32(gallivm, 0);
10501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   /* context[0].textures */
106efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[1] = lp_build_const_int32(gallivm, DRAW_JIT_CTX_TEXTURES);
10701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   /* context[0].textures[unit] */
108efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[2] = lp_build_const_int32(gallivm, unit);
10901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   /* context[0].textures[unit].member */
110efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   indices[3] = lp_build_const_int32(gallivm, member_index);
11101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
11201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   ptr = LLVMBuildGEP(builder, state->context_ptr, indices, Elements(indices), "");
11301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
11401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   if (emit_load)
11501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin      res = LLVMBuildLoad(builder, ptr, "");
11601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   else
11701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin      res = ptr;
11801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
11901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   lp_build_name(res, "context.texture%u.%s", unit, member_name);
12001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
12101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   return res;
12201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
12301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
12401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
12501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
12601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Helper macro to instantiate the functions that generate the code to
12701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * fetch the members of lp_jit_texture to fulfill the sampler code
12801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * generator requests.
12901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin *
13001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * This complexity is the price we have to pay to keep the texture
13101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * sampler code generator a reusable module without dependencies to
13201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * llvmpipe internals.
13301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
13401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin#define DRAW_LLVM_TEXTURE_MEMBER(_name, _index, _emit_load)  \
13501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   static LLVMValueRef \
13601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   draw_llvm_texture_##_name( const struct lp_sampler_dynamic_state *base, \
137efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                              struct gallivm_state *gallivm,               \
13801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                              unsigned unit)                            \
13901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   { \
140efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      return draw_llvm_texture_member(base, gallivm, unit, _index, #_name, _emit_load ); \
14101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   }
14201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
14301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
14401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(width,      DRAW_JIT_TEXTURE_WIDTH, TRUE)
14501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(height,     DRAW_JIT_TEXTURE_HEIGHT, TRUE)
14601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(depth,      DRAW_JIT_TEXTURE_DEPTH, TRUE)
14708070cead0bb79d4441d8c5b900d1571bb63c670Fabian BielerDRAW_LLVM_TEXTURE_MEMBER(first_level,DRAW_JIT_TEXTURE_FIRST_LEVEL, TRUE)
14801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(last_level, DRAW_JIT_TEXTURE_LAST_LEVEL, TRUE)
14901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(row_stride, DRAW_JIT_TEXTURE_ROW_STRIDE, FALSE)
15001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(img_stride, DRAW_JIT_TEXTURE_IMG_STRIDE, FALSE)
15101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack RusinDRAW_LLVM_TEXTURE_MEMBER(data_ptr,   DRAW_JIT_TEXTURE_DATA, FALSE)
152998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(min_lod,    DRAW_JIT_TEXTURE_MIN_LOD, TRUE)
153998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(max_lod,    DRAW_JIT_TEXTURE_MAX_LOD, TRUE)
154998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(lod_bias,   DRAW_JIT_TEXTURE_LOD_BIAS, TRUE)
155998cf11e1387b3b0f774426eb7b52abfebbb20d3José FonsecaDRAW_LLVM_TEXTURE_MEMBER(border_color, DRAW_JIT_TEXTURE_BORDER_COLOR, FALSE)
15601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
15701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
15801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic void
15901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_destroy(struct lp_build_sampler_soa *sampler)
16001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
16101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   FREE(sampler);
16201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
16301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
16401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
16501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin/**
16601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * Fetch filtered values from texture.
16701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin * The 'texel' parameter returns four vectors corresponding to R, G, B, A.
16801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin */
16901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstatic void
17001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_emit_fetch_texel(const struct lp_build_sampler_soa *base,
171efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                                       struct gallivm_state *gallivm,
17201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       struct lp_type type,
17301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       unsigned unit,
17401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       unsigned num_coords,
17501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       const LLVMValueRef *coords,
1763469715a8a171512cf9b528702e70393f01c6041José Fonseca                                       const struct lp_derivatives *derivs,
17701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       LLVMValueRef lod_bias, /* optional */
17801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       LLVMValueRef explicit_lod, /* optional */
17901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                                       LLVMValueRef *texel)
18001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
18101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct draw_llvm_sampler_soa *sampler = (struct draw_llvm_sampler_soa *)base;
18201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
183cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   assert(unit < PIPE_MAX_SAMPLERS);
18401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
185efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_sample_soa(gallivm,
18601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       &sampler->dynamic_state.static_state[unit],
18701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       &sampler->dynamic_state.base,
18801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       type,
18901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       unit,
19001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       num_coords, coords,
1913469715a8a171512cf9b528702e70393f01c6041José Fonseca                       derivs,
19201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       lod_bias, explicit_lod,
19301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                       texel);
19401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
19501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
19601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
1975d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert/**
1985d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert * Fetch the texture size.
1995d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert */
2005d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertstatic void
2015d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibertdraw_llvm_sampler_soa_emit_size_query(const struct lp_build_sampler_soa *base,
2025d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                      struct gallivm_state *gallivm,
2033469715a8a171512cf9b528702e70393f01c6041José Fonseca                                      struct lp_type type,
2045d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                      unsigned unit,
2055d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                      LLVMValueRef explicit_lod, /* optional */
2065d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                                      LLVMValueRef *sizes_out)
2075d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert{
2085d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   struct draw_llvm_sampler_soa *sampler = (struct draw_llvm_sampler_soa *)base;
2095d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
210cab2fed135bc1edf7b65ddca3236020638427061Brian Paul   assert(unit < PIPE_MAX_SAMPLERS);
2115d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
2125d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   lp_build_size_query_soa(gallivm,
2135d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                           &sampler->dynamic_state.static_state[unit],
2145d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                           &sampler->dynamic_state.base,
2153469715a8a171512cf9b528702e70393f01c6041José Fonseca			   type,
2165d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                           unit,
2175d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                           explicit_lod,
2185d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert                           sizes_out);
2195d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert}
2205d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert
22101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusinstruct lp_build_sampler_soa *
22201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusindraw_llvm_sampler_soa_create(const struct lp_sampler_static_state *static_state,
22301eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin                             LLVMValueRef context_ptr)
22401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin{
22501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   struct draw_llvm_sampler_soa *sampler;
22601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
22701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler = CALLOC_STRUCT(draw_llvm_sampler_soa);
22801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   if(!sampler)
22901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin      return NULL;
23001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
23101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->base.destroy = draw_llvm_sampler_soa_destroy;
23201eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->base.emit_fetch_texel = draw_llvm_sampler_soa_emit_fetch_texel;
2335d10d757276a599a60a68b88b21087b5824a8df7Olivier Galibert   sampler->base.emit_size_query = draw_llvm_sampler_soa_emit_size_query;
23401eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.width = draw_llvm_texture_width;
23501eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.height = draw_llvm_texture_height;
23601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.depth = draw_llvm_texture_depth;
23708070cead0bb79d4441d8c5b900d1571bb63c670Fabian Bieler   sampler->dynamic_state.base.first_level = draw_llvm_texture_first_level;
23801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.last_level = draw_llvm_texture_last_level;
23901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.row_stride = draw_llvm_texture_row_stride;
24001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.img_stride = draw_llvm_texture_img_stride;
24101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.base.data_ptr = draw_llvm_texture_data_ptr;
242998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   sampler->dynamic_state.base.min_lod = draw_llvm_texture_min_lod;
243998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   sampler->dynamic_state.base.max_lod = draw_llvm_texture_max_lod;
244998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   sampler->dynamic_state.base.lod_bias = draw_llvm_texture_lod_bias;
245998cf11e1387b3b0f774426eb7b52abfebbb20d3José Fonseca   sampler->dynamic_state.base.border_color = draw_llvm_texture_border_color;
24601eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.static_state = static_state;
24701eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   sampler->dynamic_state.context_ptr = context_ptr;
24801eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
24901eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin   return &sampler->base;
25001eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin}
25101eebfe1b6de2e36dd3af0952fc8329b7073a100Zack Rusin
252