else if (util_format_has_stencil(bld.format_desc) &&
!util_format_has_depth(bld.format_desc)) {
/* for stencil only formats, sample stencil (uint) */
- bld.texel_type = lp_type_int_vec(type.width, type.width * type.length);
+ bld.texel_type = lp_type_uint_vec(type.width, type.width * type.length);
}
if (!static_texture_state->level_zero_only ||
* here which would say it's pure int despite such formats should sample
* the depth component).
* In GL such filters make the texture incomplete, this makes it robust
- * against state trackers which set this up regardless (we'd crash in the
+ * against gallium frontends which set this up regardless (we'd crash in the
* lerp later otherwise).
* At least in some apis it may be legal to use such filters with lod
* queries and/or gather (at least for gather d3d10 says only the wrap
const struct lp_static_texture_state *static_texture_state,
const struct lp_static_sampler_state *static_sampler_state,
struct lp_sampler_dynamic_state *dynamic_state,
- const struct lp_sampler_params *params)
+ const struct lp_sampler_params *params,
+ int texture_index, int sampler_index,
+ LLVMValueRef *tex_ret)
{
LLVMBuilderRef builder = gallivm->builder;
LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(
LLVMValueRef function, inst;
LLVMValueRef args[LP_MAX_TEX_FUNC_ARGS];
LLVMBasicBlockRef bb;
- LLVMValueRef tex_ret;
unsigned num_args = 0;
char func_name[64];
unsigned i, num_coords, num_derivs, num_offsets, layer;
- unsigned texture_index = params->texture_index;
- unsigned sampler_index = params->sampler_index;
unsigned sample_key = params->sample_key;
const LLVMValueRef *coords = params->coords;
const LLVMValueRef *offsets = params->offsets;
assert(num_args <= LP_MAX_TEX_FUNC_ARGS);
- tex_ret = LLVMBuildCall(builder, function, args, num_args, "");
+ *tex_ret = LLVMBuildCall(builder, function, args, num_args, "");
bb = LLVMGetInsertBlock(builder);
inst = LLVMGetLastInstruction(bb);
LLVMSetInstructionCallConv(inst, LLVMFastCallConv);
- for (i = 0; i < 4; i++) {
- params->texel[i] = LLVMBuildExtractValue(gallivm->builder, tex_ret, i, "");
- }
}
}
if (use_tex_func) {
+ LLVMValueRef tex_ret;
lp_build_sample_soa_func(gallivm,
static_texture_state,
static_sampler_state,
dynamic_state,
- params);
+ params, params->texture_index, params->sampler_index, &tex_ret);
+
+ for (unsigned i = 0; i < 4; i++) {
+ params->texel[i] = LLVMBuildExtractValue(gallivm->builder, tex_ret, i, "");
+ }
}
else {
lp_build_sample_soa_code(gallivm,
lp_build_context_init(&bld_int_vec4, gallivm, lp_type_int_vec(32, 128));
+ if (params->samples_only) {
+ params->sizes_out[0] = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, params->int_type),
+ dynamic_state->num_samples(dynamic_state, gallivm,
+ context_ptr, texture_unit));
+ return;
+ }
if (params->explicit_lod) {
/* FIXME: this needs to honor per-element lod */
lod = LLVMBuildExtractElement(gallivm->builder, params->explicit_lod,
struct lp_build_context int_bld, int_coord_bld;
const struct util_format_description *format_desc = util_format_description(static_texture_state->format);
LLVMValueRef x = params->coords[0], y = params->coords[1], z = params->coords[2];
+ LLVMValueRef ms_index = params->ms_index;
LLVMValueRef row_stride_vec = NULL, img_stride_vec = NULL;
int_type = lp_type_int(32);
int_coord_type = lp_int_type(params->type);
params->context_ptr, params->image_index);
LLVMValueRef depth = dynamic_state->depth(dynamic_state, gallivm,
params->context_ptr, params->image_index);
+ LLVMValueRef num_samples = NULL, sample_stride = NULL;
+ if (ms_index) {
+ num_samples = dynamic_state->num_samples(dynamic_state, gallivm,
+ params->context_ptr, params->image_index);
+ sample_stride = dynamic_state->sample_stride(dynamic_state, gallivm,
+ params->context_ptr, params->image_index);
+ }
+
boolean layer_coord = has_layer_coord(target);
width = lp_build_broadcast_scalar(&int_coord_bld, width);
x, y, z, row_stride_vec, img_stride_vec,
&offset, &i, &j);
+ if (ms_index) {
+ out1 = lp_build_cmp(&int_coord_bld, PIPE_FUNC_GEQUAL, ms_index, lp_build_broadcast_scalar(&int_coord_bld, num_samples));
+ out_of_bounds = lp_build_or(&int_coord_bld, out_of_bounds, out1);
+
+ offset = lp_build_add(&int_coord_bld, offset,
+ lp_build_mul(&int_coord_bld, lp_build_broadcast_scalar(&int_coord_bld, sample_stride),
+ ms_index));
+ }
if (params->img_op == LP_IMG_LOAD) {
struct lp_type texel_type = params->type;
if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB &&