diff options
author | Dave Airlie <[email protected]> | 2018-07-04 16:21:49 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2018-11-20 05:36:16 +1000 |
commit | 2f4f5a5055c74a35916645ed6eb2f8bd8ca7d221 (patch) | |
tree | ac8785d0b4b0ee6122253ee2ce8413177135c0c4 | |
parent | dca35c598d1ac4c6abc27a842b7885f0b05ff1bc (diff) |
spirv/vtn: handle variable pointers without offset lowering
Reviewed-by: Jason Ekstrand <[email protected]>
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 15 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 3 |
2 files changed, 10 insertions, 8 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 4fa02b6fd7b..a05c4d236ca 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -1224,17 +1224,18 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode, val->type->type = glsl_uint_type(); } - if (storage_class == SpvStorageClassWorkgroup && - b->options->lower_workgroup_access_to_offsets) { - uint32_t size, align; - val->type->deref = vtn_type_layout_std430(b, val->type->deref, - &size, &align); - val->type->length = size; - val->type->align = align; + if (storage_class == SpvStorageClassWorkgroup) { /* These can actually be stored to nir_variables and used as SSA * values so they need a real glsl_type. */ val->type->type = glsl_uint_type(); + if (b->options->lower_workgroup_access_to_offsets) { + uint32_t size, align; + val->type->deref = vtn_type_layout_std430(b, val->type->deref, + &size, &align); + val->type->length = size; + val->type->align = align; + } } break; } diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 53f52255dc3..55721fc36e3 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1650,7 +1650,8 @@ vtn_pointer_from_ssa(struct vtn_builder *b, nir_ssa_def *ssa, vtn_assert(ssa->num_components == 2); ptr->block_index = nir_channel(&b->nb, ssa, 0); ptr->offset = nir_channel(&b->nb, ssa, 1); - } else if (ptr->mode == vtn_variable_mode_workgroup || + } else if ((ptr->mode == vtn_variable_mode_workgroup && + 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); |