LLVMValueRef shuffles2[LP_MAX_VECTOR_WIDTH/32];
int len = bld_base->base.type.length * 2;
for (unsigned i = 0; i < bld_base->base.type.length; i++) {
+#if UTIL_ARCH_LITTLE_ENDIAN
shuffles[i] = lp_build_const_int32(gallivm, i * 2);
shuffles2[i] = lp_build_const_int32(gallivm, (i * 2) + 1);
+#else
+ shuffles[i] = lp_build_const_int32(gallivm, (i * 2) + 1);
+ shuffles2[i] = lp_build_const_int32(gallivm, (i * 2));
+#endif
}
src = LLVMBuildBitCast(gallivm->builder, src, LLVMVectorType(LLVMInt32TypeInContext(gallivm->context), len), "");
assert(len <= (2 * (LP_MAX_VECTOR_WIDTH/32)));
for (i = 0; i < bld_base->base.type.length * 2; i+=2) {
+#if UTIL_ARCH_LITTLE_ENDIAN
shuffles[i] = lp_build_const_int32(gallivm, i / 2);
shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length);
+#else
+ shuffles[i] = lp_build_const_int32(gallivm, i / 2 + bld_base->base.type.length);
+ shuffles[i + 1] = lp_build_const_int32(gallivm, i / 2);
+#endif
}
return LLVMBuildShuffleVector(builder, input, input2, LLVMConstVector(shuffles, len), "");
}
LLVMValueRef result[NIR_MAX_VEC_COMPONENTS];
struct lp_build_context *int_bld = get_int_bld(bld_base, true, instr->def.bit_size);
for (unsigned i = 0; i < instr->def.num_components; i++)
- result[i] = lp_build_const_int_vec(bld_base->base.gallivm, int_bld->type, instr->value[i].u64);
+ result[i] = lp_build_const_int_vec(bld_base->base.gallivm, int_bld->type, instr->def.bit_size == 32 ? instr->value[i].u32 : instr->value[i].u64);
assign_ssa_dest(bld_base, &instr->def, result);
}
LLVMValueRef coords[5];
struct lp_img_params params;
const struct glsl_type *type = glsl_without_array(var->type);
+ unsigned const_index;
+ LLVMValueRef indir_index;
+ get_deref_offset(bld_base, deref, false, NULL, NULL,
+ &const_index, &indir_index);
memset(¶ms, 0, sizeof(params));
params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type), glsl_sampler_type_is_array(type));
params.img_op = LP_IMG_LOAD;
if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_MS)
params.ms_index = get_src(bld_base, instr->src[2]);
- params.image_index = var->data.binding;
+ params.image_index = var->data.binding + (indir_index ? 0 : const_index);
+ params.image_index_offset = indir_index;
bld_base->image_op(bld_base, ¶ms);
}
LLVMValueRef coords[5];
struct lp_img_params params;
const struct glsl_type *type = glsl_without_array(var->type);
+ unsigned const_index;
+ LLVMValueRef indir_index;
+ get_deref_offset(bld_base, deref, false, NULL, NULL,
+ &const_index, &indir_index);
memset(¶ms, 0, sizeof(params));
params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type), glsl_sampler_type_is_array(type));
if (glsl_get_sampler_dim(type) == GLSL_SAMPLER_DIM_MS)
params.ms_index = get_src(bld_base, instr->src[2]);
params.img_op = LP_IMG_STORE;
- params.image_index = var->data.binding;
+ params.image_index = var->data.binding + (indir_index ? 0 : const_index);
+ params.image_index_offset = indir_index;
if (params.target == PIPE_TEXTURE_1D_ARRAY)
coords[2] = coords[1];
LLVMValueRef in_val = get_src(bld_base, instr->src[3]);
LLVMValueRef coords[5];
const struct glsl_type *type = glsl_without_array(var->type);
+ unsigned const_index;
+ LLVMValueRef indir_index;
+ get_deref_offset(bld_base, deref, false, NULL, NULL,
+ &const_index, &indir_index);
memset(¶ms, 0, sizeof(params));
params.outdata = result;
params.img_op = (instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) ? LP_IMG_ATOMIC_CAS : LP_IMG_ATOMIC;
- params.image_index = var->data.binding;
+ params.image_index = var->data.binding + (indir_index ? 0 : const_index);
+ params.image_index_offset = indir_index;
bld_base->image_op(bld_base, ¶ms);
}
nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
nir_variable *var = nir_deref_instr_get_variable(deref);
struct lp_sampler_size_query_params params = { 0 };
- params.texture_unit = var->data.binding;
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(var->type), glsl_sampler_type_is_array(var->type));
+ unsigned const_index;
+ LLVMValueRef indir_index;
+ const struct glsl_type *type = glsl_without_array(var->type);
+ get_deref_offset(bld_base, deref, false, NULL, NULL,
+ &const_index, &indir_index);
+ params.texture_unit = var->data.binding + (indir_index ? 0 : const_index);
+ params.texture_unit_offset = indir_index;
+ params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type), glsl_sampler_type_is_array(type));
params.sizes_out = result;
bld_base->image_size(bld_base, ¶ms);
nir_deref_instr *deref = nir_instr_as_deref(instr->src[0].ssa->parent_instr);
nir_variable *var = nir_deref_instr_get_variable(deref);
struct lp_sampler_size_query_params params = { 0 };
- params.texture_unit = var->data.binding;
- params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(var->type), glsl_sampler_type_is_array(var->type));
+ unsigned const_index;
+ LLVMValueRef indir_index;
+ const struct glsl_type *type = glsl_without_array(var->type);
+ get_deref_offset(bld_base, deref, false, NULL, NULL,
+ &const_index, &indir_index);
+
+ params.texture_unit = var->data.binding + (indir_index ? 0 : const_index);
+ params.texture_unit_offset = indir_index;
+ params.target = glsl_sampler_to_pipe(glsl_get_sampler_dim(type), glsl_sampler_type_is_array(type));
params.sizes_out = result;
params.samples_only = true;
}
} else if (instr->intrinsic == nir_intrinsic_interp_deref_at_sample) {
offsets[0] = get_src(bld_base, instr->src[1]);
+ offsets[0] = cast_type(bld_base, offsets[0], nir_type_int, 32);
sample = true;
}
bld_base->interp_at(bld_base, num_components, var, centroid, sample, const_index, indir_index, offsets, result);
case nir_intrinsic_load_patch_vertices_in:
case nir_intrinsic_load_sample_id:
case nir_intrinsic_load_sample_pos:
+ case nir_intrinsic_load_sample_mask_in:
bld_base->sysval_intrin(bld_base, instr, result);
break;
case nir_intrinsic_load_helper_invocation:
case nir_intrinsic_control_barrier:
visit_barrier(bld_base);
break;
+ case nir_intrinsic_group_memory_barrier:
case nir_intrinsic_memory_barrier:
case nir_intrinsic_memory_barrier_shared:
case nir_intrinsic_memory_barrier_buffer:
case nir_intrinsic_global_atomic_exchange:
case nir_intrinsic_global_atomic_comp_swap:
visit_global_atomic(bld_base, instr, result);
+ break;
case nir_intrinsic_vote_all:
case nir_intrinsic_vote_any:
case nir_intrinsic_vote_ieq:
struct lp_sampler_size_query_params params = { 0 };
LLVMValueRef sizes_out[NIR_MAX_VEC_COMPONENTS];
LLVMValueRef explicit_lod = NULL;
-
+ LLVMValueRef texture_unit_offset = NULL;
for (unsigned i = 0; i < instr->num_srcs; i++) {
switch (instr->src[i].src_type) {
case nir_tex_src_lod:
explicit_lod = cast_type(bld_base, get_src(bld_base, instr->src[i].src), nir_type_int, 32);
break;
+ case nir_tex_src_texture_offset:
+ texture_unit_offset = get_src(bld_base, instr->src[i].src);
+ break;
default:
break;
}
params.is_sviewinfo = TRUE;
params.sizes_out = sizes_out;
params.samples_only = (instr->op == nir_texop_texture_samples);
+ params.texture_unit_offset = texture_unit_offset;
if (instr->op == nir_texop_query_levels)
params.explicit_lod = bld_base->uint_bld.zero;
unsigned sample_key = 0;
nir_deref_instr *texture_deref_instr = NULL;
nir_deref_instr *sampler_deref_instr = NULL;
+ LLVMValueRef texture_unit_offset = NULL;
LLVMValueRef texel[NIR_MAX_VEC_COMPONENTS];
unsigned lod_src = 0;
LLVMValueRef coord_undef = LLVMGetUndef(bld_base->base.int_vec_type);
sample_key |= LP_SAMPLER_FETCH_MS;
ms_index = cast_type(bld_base, get_src(bld_base, instr->src[i].src), nir_type_int, 32);
break;
+
+ case nir_tex_src_texture_offset:
+ texture_unit_offset = get_src(bld_base, instr->src[i].src);
+ break;
+ case nir_tex_src_sampler_offset:
+ break;
default:
assert(0);
break;
params.sample_key = sample_key;
params.offsets = offsets;
params.texture_index = base_index;
+ params.texture_index_offset = texture_unit_offset;
params.sampler_index = base_index;
params.coords = coords;
params.texel = texel;
nir_convert_from_ssa(nir, true);
nir_lower_locals_to_regs(nir);
nir_remove_dead_derefs(nir);
- nir_remove_dead_variables(nir, nir_var_function_temp);
+ nir_remove_dead_variables(nir, nir_var_function_temp, NULL);
nir_foreach_variable(variable, &nir->outputs)
handle_shader_output_decl(bld_base, nir, variable);