zink: Images can live in nir_var_mem_image now
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4743>
This commit is contained in:
parent
d68bedbb45
commit
ae58894ee7
|
@ -305,6 +305,7 @@ get_storage_class(struct nir_variable *var)
|
||||||
case nir_var_shader_out:
|
case nir_var_shader_out:
|
||||||
return SpvStorageClassOutput;
|
return SpvStorageClassOutput;
|
||||||
case nir_var_uniform:
|
case nir_var_uniform:
|
||||||
|
case nir_var_mem_image:
|
||||||
return SpvStorageClassUniformConstant;
|
return SpvStorageClassUniformConstant;
|
||||||
default:
|
default:
|
||||||
unreachable("Unsupported nir_variable_mode");
|
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)
|
if (var->data.mode == nir_var_mem_ubo || var->data.mode == nir_var_mem_ssbo)
|
||||||
emit_bo(ctx, var, 0);
|
emit_bo(ctx, var, 0);
|
||||||
else {
|
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);
|
const struct glsl_type *type = glsl_without_array(var->type);
|
||||||
if (glsl_type_is_sampler(type) || glsl_type_is_image(type))
|
if (glsl_type_is_sampler(type) || glsl_type_is_image(type))
|
||||||
emit_image(ctx, var, false);
|
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);
|
type = get_glsl_type(ctx, deref->type);
|
||||||
break;
|
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);
|
struct hash_entry *he = _mesa_hash_table_search(ctx->vars, var);
|
||||||
assert(he);
|
assert(he);
|
||||||
base = (SpvId)(intptr_t)he->data;
|
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 */
|
/* we have to reverse iterate to match what's done in zink_compiler.c */
|
||||||
foreach_list_typed_reverse(nir_variable, var, node, &s->variables)
|
foreach_list_typed_reverse(nir_variable, var, node, &s->variables)
|
||||||
if (_nir_shader_variable_has_mode(var, nir_var_uniform |
|
if (_nir_shader_variable_has_mode(var, nir_var_uniform |
|
||||||
|
nir_var_mem_image |
|
||||||
nir_var_mem_ubo |
|
nir_var_mem_ubo |
|
||||||
nir_var_mem_ssbo))
|
nir_var_mem_ssbo))
|
||||||
emit_uniform(&ctx, var);
|
emit_uniform(&ctx, var);
|
||||||
|
|
|
@ -1064,7 +1064,7 @@ create_bindless_image(nir_shader *nir, enum glsl_sampler_dim dim)
|
||||||
nir_variable *var;
|
nir_variable *var;
|
||||||
|
|
||||||
const struct glsl_type *image_type = glsl_image_type(dim, false, GLSL_TYPE_FLOAT);
|
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.descriptor_set = ZINK_DESCRIPTOR_BINDLESS;
|
||||||
var->data.driver_location = var->data.binding = binding;
|
var->data.driver_location = var->data.binding = binding;
|
||||||
var->data.image.format = PIPE_FORMAT_R8G8B8A8_UNORM;
|
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) {
|
foreach_list_typed_reverse_safe(nir_variable, var, node, &nir->variables) {
|
||||||
if (_nir_shader_variable_has_mode(var, nir_var_uniform |
|
if (_nir_shader_variable_has_mode(var, nir_var_uniform |
|
||||||
|
nir_var_mem_image |
|
||||||
nir_var_mem_ubo |
|
nir_var_mem_ubo |
|
||||||
nir_var_mem_ssbo)) {
|
nir_var_mem_ssbo)) {
|
||||||
enum zink_descriptor_type ztype;
|
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->bindings[ztype][ret->num_bindings[ztype]].size = 1;
|
||||||
ret->num_bindings[ztype]++;
|
ret->num_bindings[ztype]++;
|
||||||
} else {
|
} 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) {
|
if (var->data.bindless) {
|
||||||
ret->bindless = true;
|
ret->bindless = true;
|
||||||
handle_bindless_var(nir, var, type, bindless);
|
handle_bindless_var(nir, var, type, bindless);
|
||||||
|
|
Loading…
Reference in New Issue