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 5a28cce44eb..99d25b541e9 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 @@ -305,6 +305,7 @@ get_storage_class(struct nir_variable *var) case nir_var_shader_out: return SpvStorageClassOutput; case nir_var_uniform: + case nir_var_mem_image: return SpvStorageClassUniformConstant; default: unreachable("Unsupported nir_variable_mode"); @@ -1004,7 +1005,8 @@ emit_uniform(struct ntv_context *ctx, struct nir_variable *var) if (var->data.mode == nir_var_mem_ubo || var->data.mode == nir_var_mem_ssbo) emit_bo(ctx, var, 0); else { - assert(var->data.mode == nir_var_uniform); + assert(var->data.mode == nir_var_uniform || + var->data.mode == nir_var_mem_image); const struct glsl_type *type = glsl_without_array(var->type); if (glsl_type_is_sampler(type) || glsl_type_is_image(type)) emit_image(ctx, var, false); @@ -3414,7 +3416,8 @@ emit_deref_array(struct ntv_context *ctx, nir_deref_instr *deref) type = get_glsl_type(ctx, deref->type); break; - case nir_var_uniform: { + case nir_var_uniform: + case nir_var_mem_image: { struct hash_entry *he = _mesa_hash_table_search(ctx->vars, var); assert(he); base = (SpvId)(intptr_t)he->data; @@ -3944,6 +3947,7 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info, uint32_t /* we have to reverse iterate to match what's done in zink_compiler.c */ foreach_list_typed_reverse(nir_variable, var, node, &s->variables) if (_nir_shader_variable_has_mode(var, nir_var_uniform | + nir_var_mem_image | nir_var_mem_ubo | nir_var_mem_ssbo)) emit_uniform(&ctx, var); diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 0a48ad98458..a798bf93eee 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1064,7 +1064,7 @@ create_bindless_image(nir_shader *nir, enum glsl_sampler_dim dim) nir_variable *var; const struct glsl_type *image_type = glsl_image_type(dim, false, GLSL_TYPE_FLOAT); - var = nir_variable_create(nir, nir_var_uniform, glsl_array_type(image_type, ZINK_MAX_BINDLESS_HANDLES, 0), "bindless_image"); + var = nir_variable_create(nir, nir_var_mem_image, glsl_array_type(image_type, ZINK_MAX_BINDLESS_HANDLES, 0), "bindless_image"); var->data.descriptor_set = ZINK_DESCRIPTOR_BINDLESS; var->data.driver_location = var->data.binding = binding; var->data.image.format = PIPE_FORMAT_R8G8B8A8_UNORM; @@ -1364,6 +1364,7 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, foreach_list_typed_reverse_safe(nir_variable, var, node, &nir->variables) { if (_nir_shader_variable_has_mode(var, nir_var_uniform | + nir_var_mem_image | nir_var_mem_ubo | nir_var_mem_ssbo)) { enum zink_descriptor_type ztype; @@ -1399,7 +1400,8 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, ret->bindings[ztype][ret->num_bindings[ztype]].size = 1; ret->num_bindings[ztype]++; } else { - assert(var->data.mode == nir_var_uniform); + assert(var->data.mode == nir_var_uniform || + var->data.mode == nir_var_mem_image); if (var->data.bindless) { ret->bindless = true; handle_bindless_var(nir, var, type, bindless);