diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index 0ec73976847..0d97a6c614e 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -669,7 +669,7 @@ emit_ubo(struct ntv_context *ctx, struct nir_variable *var) /* variables accessed inside a uniform block will get merged into a big * memory blob and accessed by offset */ - if (var->data.location && !is_ubo_array) + if (var->data.location && !is_ubo_array && var->type != var->interface_type) return; uint32_t size = glsl_count_attribute_slots(var->interface_type, false); diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 58d9bdd8d9d..cc2e178de92 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -466,7 +466,7 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, if (var->data.mode == nir_var_mem_ubo) { /* ignore variables being accessed if they aren't the base of the UBO */ bool ubo_array = glsl_type_is_array(var->type) && glsl_type_is_interface(glsl_without_array(var->type)); - if (var->data.location && !ubo_array) + if (var->data.location && !ubo_array && var->type != var->interface_type) continue; var->data.binding = cur_ubo; /* if this is a ubo array, create a binding point for each array member: