zink: set dynamic indexing caps

If we're not using uniform indexing, we need to emit caps to enable
dynamic indexing.

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17734>
This commit is contained in:
Erik Faye-Lund
2022-02-04 13:25:26 +01:00
committed by Marge Bot
parent e85a710a2a
commit a923b1636d
@@ -3704,6 +3704,28 @@ emit_deref_array(struct ntv_context *ctx, nir_deref_instr *deref)
assert(deref->deref_type == nir_deref_type_array);
nir_variable *var = nir_deref_instr_get_variable(deref);
if (!nir_src_is_always_uniform(deref->arr.index)) {
if (deref->modes & nir_var_mem_ubo)
spirv_builder_emit_cap(&ctx->builder,
SpvCapabilityUniformBufferArrayDynamicIndexing);
if (deref->modes & nir_var_mem_ssbo)
spirv_builder_emit_cap(&ctx->builder,
SpvCapabilityStorageBufferArrayDynamicIndexing);
if (deref->modes & (nir_var_uniform | nir_var_image)) {
const struct glsl_type *type = glsl_without_array(var->type);
assert(glsl_type_is_sampler(type) || glsl_type_is_image(type));
if (glsl_type_is_sampler(type))
spirv_builder_emit_cap(&ctx->builder,
SpvCapabilitySampledImageArrayDynamicIndexing);
else
spirv_builder_emit_cap(&ctx->builder,
SpvCapabilityStorageImageArrayDynamicIndexing);
}
}
SpvStorageClass storage_class = get_storage_class(var);
SpvId base, type;
switch (var->data.mode) {