spirv: Add vtn_variable_mode_image

Corresponding to SpvStorageClassImage.  We see pointers for that
storage class in tests, but don't use the storage class any further.
Adding this so that we can call vtn_mode_to_address_format() for all
supported pointers.

v2: Fail when trying to create a SpvStorageClassImage
    variable.  (Jason)

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Caio Marcelo de Oliveira Filho 2019-05-09 19:33:51 -07:00
parent 672a3f42d9
commit 48ea3bbff6
2 changed files with 11 additions and 0 deletions

View File

@ -438,6 +438,7 @@ enum vtn_variable_mode {
vtn_variable_mode_cross_workgroup,
vtn_variable_mode_input,
vtn_variable_mode_output,
vtn_variable_mode_image,
};
struct vtn_pointer {

View File

@ -1779,6 +1779,10 @@ vtn_storage_class_to_mode(struct vtn_builder *b,
mode = vtn_variable_mode_cross_workgroup;
nir_mode = nir_var_mem_global;
break;
case SpvStorageClassImage:
mode = vtn_variable_mode_image;
nir_mode = nir_var_mem_ubo;
break;
case SpvStorageClassGeneric:
default:
vtn_fail("Unhandled variable storage class: %s (%u)",
@ -1822,6 +1826,7 @@ vtn_mode_to_address_format(struct vtn_builder *b, enum vtn_variable_mode mode)
case vtn_variable_mode_uniform:
case vtn_variable_mode_input:
case vtn_variable_mode_output:
case vtn_variable_mode_image:
return nir_address_format_logical;
}
@ -2082,6 +2087,10 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
b->shader->num_uniforms = vtn_type_block_size(b, type);
break;
case vtn_variable_mode_image:
vtn_fail("Cannot create a variable with the Image storage class");
break;
case vtn_variable_mode_phys_ssbo:
vtn_fail("Cannot create a variable with the "
"PhysicalStorageBufferEXT storage class");
@ -2244,6 +2253,7 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
/* These don't need actual variables. */
break;
case vtn_variable_mode_image:
case vtn_variable_mode_phys_ssbo:
unreachable("Should have been caught before");
}