diff options
author | Jason Ekstrand <jason@jlekstrand.net> | 2020-05-27 17:23:45 -0500 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-09-30 07:20:39 +0000 |
commit | 657d49a9ba17bea52689c8ad53a3752a647cdc53 (patch) | |
tree | f1b2640e305609034d5996f4a7b108c626fc867d | |
parent | d3fa7451a6651ea78bd4d1ec2f63e052e7608531 (diff) |
spirv: Use derefs for push constants
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5275>
-rw-r--r-- | src/compiler/spirv/spirv_to_nir.c | 1 | ||||
-rw-r--r-- | src/compiler/spirv/vtn_variables.c | 73 |
2 files changed, 10 insertions, 64 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index e19fd027483..09c7a804b9e 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -844,6 +844,7 @@ vtn_type_needs_explicit_layout(struct vtn_builder *b, enum vtn_variable_mode mod case vtn_variable_mode_ssbo: case vtn_variable_mode_phys_ssbo: case vtn_variable_mode_ubo: + case vtn_variable_mode_push_constant: return true; default: diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 4a73fc8dbe7..7ac60317cf2 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -179,10 +179,9 @@ bool vtn_mode_uses_ssa_offset(struct vtn_builder *b, enum vtn_variable_mode mode) { - return ((mode == vtn_variable_mode_ubo || - mode == vtn_variable_mode_ssbo) && - b->options->lower_ubo_ssbo_access_to_offsets) || - mode == vtn_variable_mode_push_constant; + return (mode == vtn_variable_mode_ubo || + mode == vtn_variable_mode_ssbo) && + b->options->lower_ubo_ssbo_access_to_offsets; } static bool @@ -203,8 +202,7 @@ vtn_pointer_is_external_block(struct vtn_builder *b, { return ptr->mode == vtn_variable_mode_ssbo || ptr->mode == vtn_variable_mode_ubo || - ptr->mode == vtn_variable_mode_phys_ssbo || - ptr->mode == vtn_variable_mode_push_constant; + ptr->mode == vtn_variable_mode_phys_ssbo; } static nir_ssa_def * @@ -773,60 +771,6 @@ vtn_pointer_to_offset(struct vtn_builder *b, struct vtn_pointer *ptr, return ptr->offset; } -/* Tries to compute the size of an interface block based on the strides and - * offsets that are provided to us in the SPIR-V source. - */ -static unsigned -vtn_type_block_size(struct vtn_builder *b, struct vtn_type *type) -{ - enum glsl_base_type base_type = glsl_get_base_type(type->type); - switch (base_type) { - case GLSL_TYPE_UINT: - case GLSL_TYPE_INT: - case GLSL_TYPE_UINT16: - case GLSL_TYPE_INT16: - case GLSL_TYPE_UINT8: - case GLSL_TYPE_INT8: - case GLSL_TYPE_UINT64: - case GLSL_TYPE_INT64: - case GLSL_TYPE_FLOAT: - case GLSL_TYPE_FLOAT16: - case GLSL_TYPE_BOOL: - case GLSL_TYPE_DOUBLE: { - unsigned cols = type->row_major ? glsl_get_vector_elements(type->type) : - glsl_get_matrix_columns(type->type); - if (cols > 1) { - vtn_assert(type->stride > 0); - return type->stride * cols; - } else { - unsigned type_size = glsl_get_bit_size(type->type) / 8; - return glsl_get_vector_elements(type->type) * type_size; - } - } - - case GLSL_TYPE_STRUCT: - case GLSL_TYPE_INTERFACE: { - unsigned size = 0; - unsigned num_fields = glsl_get_length(type->type); - for (unsigned f = 0; f < num_fields; f++) { - unsigned field_end = type->offsets[f] + - vtn_type_block_size(b, type->members[f]); - size = MAX2(size, field_end); - } - return size; - } - - case GLSL_TYPE_ARRAY: - vtn_assert(type->stride > 0); - vtn_assert(glsl_get_length(type->type) > 0); - return type->stride * glsl_get_length(type->type); - - default: - vtn_fail("Invalid block type"); - return 0; - } -} - static void _vtn_load_store_tail(struct vtn_builder *b, nir_intrinsic_op op, bool load, nir_ssa_def *index, nir_ssa_def *offset, @@ -1876,7 +1820,7 @@ vtn_storage_class_to_mode(struct vtn_builder *b, break; case SpvStorageClassPushConstant: mode = vtn_variable_mode_push_constant; - nir_mode = nir_var_uniform; + nir_mode = nir_var_mem_push_const; break; case SpvStorageClassInput: mode = vtn_variable_mode_input; @@ -2203,7 +2147,8 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, } break; case vtn_variable_mode_push_constant: - b->shader->num_uniforms = vtn_type_block_size(b, type); + b->shader->num_uniforms = + glsl_get_explicit_size(without_array->type, false); break; case vtn_variable_mode_image: @@ -2249,6 +2194,7 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, case vtn_variable_mode_ubo: case vtn_variable_mode_ssbo: + case vtn_variable_mode_push_constant: var->var = rzalloc(b->shader, nir_variable); var->var->name = ralloc_strdup(var->var, val->name); @@ -2257,7 +2203,7 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, var->var->data.mode = nir_mode; var->var->data.location = -1; - + var->var->data.driver_location = 0; break; case vtn_variable_mode_workgroup: @@ -2360,7 +2306,6 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, break; } - case vtn_variable_mode_push_constant: case vtn_variable_mode_cross_workgroup: /* These don't need actual variables. */ break; |