return progress;
}
-static void
-lower_store_output(nir_builder *b,
- struct nir_instr *instr)
-{
- if (instr->type != nir_instr_type_intrinsic)
- return;
-
- nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
- if (intr->intrinsic != nir_intrinsic_store_output)
- return;
-
- if (nir_intrinsic_base(intr) != VARYING_SLOT_POS)
- return;
-
- b->cursor = nir_before_instr(&intr->instr);
-
- nir_ssa_def *src = nir_ssa_for_src(b, intr->src[0], 4);
- nir_ssa_def *def = nir_vec4(b,
- nir_channel(b, src, 0),
- nir_channel(b, src, 1),
- nir_fmul(b,
- nir_fadd(b,
- nir_channel(b, src, 2),
- nir_channel(b, src, 3)),
- nir_imm_float(b, 0.5)),
- nir_channel(b, src, 3));
- nir_instr_rewrite_src(&intr->instr, &intr->src[0], nir_src_for_ssa(def));
-}
-
-static void
-position_to_vulkan(nir_shader *s)
-{
- if (s->info.stage != MESA_SHADER_VERTEX)
- return;
-
- nir_foreach_function(function, s) {
- if (function->impl) {
- nir_builder b;
- nir_builder_init(&b, function->impl);
-
- nir_foreach_block(block, function->impl) {
- nir_foreach_instr_safe(instr, block)
- lower_store_output(&b, instr);
- }
-
- nir_metadata_preserve(function->impl, nir_metadata_block_index |
- nir_metadata_dominance);
- }
- }
-}
-
static bool
lower_discard_if_instr(nir_intrinsic_instr *instr, nir_builder *b)
{
static const struct nir_shader_compiler_options nir_options = {
.lower_all_io_to_temps = true,
.lower_ffma = true,
+ .lower_fdph = true,
.lower_flrp32 = true,
.lower_fpow = true,
.lower_fsat = true,
} while (progress);
}
-static int
-glsl_type_size(const struct glsl_type *type, bool bindless)
-{
- return glsl_count_attribute_slots(type, false);
-}
-
static uint32_t
zink_binding(enum pipe_shader_type stage, VkDescriptorType type, int index)
{
{
struct zink_shader *ret = CALLOC_STRUCT(zink_shader);
- NIR_PASS_V(nir, nir_lower_io, nir_var_all, glsl_type_size, (nir_lower_io_options)0);
NIR_PASS_V(nir, lower_uniforms_to_ubo);
- NIR_PASS_V(nir, position_to_vulkan);
+ NIR_PASS_V(nir, nir_lower_clip_halfz);
NIR_PASS_V(nir, nir_lower_regs_to_ssa);
- NIR_PASS_V(nir, nir_lower_bool_to_float);
optimize_nir(nir);
NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_function_temp);
NIR_PASS_V(nir, lower_discard_if);
+ NIR_PASS_V(nir, nir_convert_from_ssa, true);
if (zink_debug & ZINK_DEBUG_NIR) {
fprintf(stderr, "NIR shader:\n---8<---\n");
ret->num_bindings = 0;
nir_foreach_variable(var, &nir->uniforms) {
- if (glsl_type_is_sampler(var->type)) {
- ret->bindings[ret->num_bindings].index = var->data.driver_location;
- var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location);
- ret->bindings[ret->num_bindings].binding = var->data.binding;
- ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- ret->num_bindings++;
- } else if (var->interface_type) {
+ if (var->data.mode == nir_var_mem_ubo) {
ret->bindings[ret->num_bindings].index = var->data.binding;
var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, var->data.binding);
ret->bindings[ret->num_bindings].binding = var->data.binding;
ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
ret->num_bindings++;
+ } else {
+ assert(var->data.mode == nir_var_uniform);
+ if (glsl_type_is_array(var->type) &&
+ glsl_type_is_sampler(glsl_get_array_element(var->type))) {
+ for (int i = 0; i < glsl_get_length(var->type); ++i) {
+ ret->bindings[ret->num_bindings].index = var->data.driver_location + i;
+ var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location + i);
+ ret->bindings[ret->num_bindings].binding = var->data.binding;
+ ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ ret->num_bindings++;
+ }
+ } else if (glsl_type_is_sampler(var->type)) {
+ ret->bindings[ret->num_bindings].index = var->data.driver_location;
+ var->data.binding = zink_binding(stage, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, var->data.driver_location);
+ ret->bindings[ret->num_bindings].binding = var->data.binding;
+ ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ ret->num_bindings++;
+ }
}
}
+ ret->info = nir->info;
+
struct spirv_shader *spirv = nir_to_spirv(nir);
assert(spirv);