spirv: Make better use of vtn_pointer_uses_ssa_offset

The choice of whether or not we should use block_load/store isn't a
choice between external and not so much as a choice between deref
instructions and manually calculated offsets.  In vtn_pointer_from_ssa,
we guard the index+offset case behind vtn_pointer_uses_ssa_offset and
then branch out from there.

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:
Jason Ekstrand
2018-12-14 18:25:38 -06:00
committed by Jason Ekstrand
parent adc155a815
commit 3a7c5667c8

View File

@@ -917,7 +917,7 @@ _vtn_variable_load_store(struct vtn_builder *b, bool load,
struct vtn_ssa_value * struct vtn_ssa_value *
vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src) vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src)
{ {
if (vtn_pointer_is_external_block(b, src)) { if (vtn_pointer_uses_ssa_offset(b, src)) {
return vtn_block_load(b, src); return vtn_block_load(b, src);
} else { } else {
struct vtn_ssa_value *val = NULL; struct vtn_ssa_value *val = NULL;
@@ -930,7 +930,7 @@ void
vtn_variable_store(struct vtn_builder *b, struct vtn_ssa_value *src, vtn_variable_store(struct vtn_builder *b, struct vtn_ssa_value *src,
struct vtn_pointer *dest) struct vtn_pointer *dest)
{ {
if (vtn_pointer_is_external_block(b, dest)) { if (vtn_pointer_uses_ssa_offset(b, dest)) {
vtn_assert(dest->mode == vtn_variable_mode_ssbo || vtn_assert(dest->mode == vtn_variable_mode_ssbo ||
dest->mode == vtn_variable_mode_workgroup); dest->mode == vtn_variable_mode_workgroup);
vtn_block_store(b, src, dest); vtn_block_store(b, src, dest);
@@ -1625,21 +1625,19 @@ vtn_pointer_from_ssa(struct vtn_builder *b, nir_ssa_def *ssa,
ptr->type = ptr_type->deref; ptr->type = ptr_type->deref;
ptr->ptr_type = ptr_type; ptr->ptr_type = ptr_type;
if (ptr->mode == vtn_variable_mode_ubo || if (vtn_pointer_uses_ssa_offset(b, ptr)) {
ptr->mode == vtn_variable_mode_ssbo) {
/* This pointer type needs to have actual storage */ /* This pointer type needs to have actual storage */
vtn_assert(ptr_type->type); vtn_assert(ptr_type->type);
if (ptr->mode == vtn_variable_mode_ubo ||
ptr->mode == vtn_variable_mode_ubo) {
vtn_assert(ssa->num_components == 2); vtn_assert(ssa->num_components == 2);
ptr->block_index = nir_channel(&b->nb, ssa, 0); ptr->block_index = nir_channel(&b->nb, ssa, 0);
ptr->offset = nir_channel(&b->nb, ssa, 1); ptr->offset = nir_channel(&b->nb, ssa, 1);
} else if ((ptr->mode == vtn_variable_mode_workgroup && } else {
b->options->lower_workgroup_access_to_offsets) ||
ptr->mode == vtn_variable_mode_push_constant) {
/* This pointer type needs to have actual storage */
vtn_assert(ptr_type->type);
vtn_assert(ssa->num_components == 1); vtn_assert(ssa->num_components == 1);
ptr->block_index = NULL; ptr->block_index = NULL;
ptr->offset = ssa; ptr->offset = ssa;
}
} else { } else {
assert(!vtn_pointer_is_external_block(b, ptr)); assert(!vtn_pointer_is_external_block(b, ptr));
const struct glsl_type *deref_type = ptr_type->deref->type; const struct glsl_type *deref_type = ptr_type->deref->type;