Mesa (master): spirv: Skip creating unused variables in SPIR-V >= 1.4
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Feb 5 05:09:24 UTC 2021
Module: Mesa
Branch: master
Commit: 0c3fe064215864e7966c8640ad36f173d78cb855
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0c3fe064215864e7966c8640ad36f173d78cb855
Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date: Tue Jan 12 11:30:52 2021 -0800
spirv: Skip creating unused variables in SPIR-V >= 1.4
Newer versions of SPIR-V require that all the global variables used by
the entry point are declared (in contrast to only I/O in previous
versions), so there's no need to remove dead variables or keep track
of the indirectly used variables.
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8456>
---
src/compiler/spirv/spirv_to_nir.c | 13 +++++++------
src/compiler/spirv/vtn_variables.c | 17 ++++++++++++-----
2 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 8060e24c9fb..84f572e03a6 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -4189,7 +4189,7 @@ vtn_handle_entry_point(struct vtn_builder *b, const uint32_t *w,
vtn_assert(b->entry_point == NULL);
b->entry_point = entry_point;
- /* Entry points enumerate which I/O variables are used. */
+ /* Entry points enumerate which global variables are used. */
size_t start = 3 + name_words;
b->interface_ids_count = count - start;
b->interface_ids = ralloc_array(b, uint32_t, b->interface_ids_count);
@@ -5753,7 +5753,7 @@ vtn_create_builder(const uint32_t *words, size_t word_count,
b->value_id_bound = value_id_bound;
b->values = rzalloc_array(b, struct vtn_value, value_id_bound);
- if (b->options->environment == NIR_SPIRV_VULKAN)
+ if (b->options->environment == NIR_SPIRV_VULKAN && b->version < 0x10400)
b->vars_used_indirectly = _mesa_pointer_set_create(b);
return b;
@@ -5975,11 +5975,12 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
/* A SPIR-V module can have multiple shaders stages and also multiple
* shaders of the same stage. Global variables are declared per-module.
*
- * For I/O storage classes, OpEntryPoint will list the variables used, so
- * only valid ones are created. Remove dead variables to clean up the
- * remaining ones.
+ * Starting in SPIR-V 1.4 the list of global variables is part of
+ * OpEntryPoint, so only valid ones will be created. Previous versions
+ * only have Input and Output variables listed, so remove dead variables to
+ * clean up the remaining ones.
*/
- if (!options->create_library) {
+ if (!options->create_library && b->version < 0x10400) {
const nir_remove_dead_variables_options dead_opts = {
.can_remove_var = can_remove,
.can_remove_var_data = b->vars_used_indirectly,
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index bda82103348..ae0f8a9cba7 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -2287,12 +2287,19 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode,
SpvStorageClass storage_class = w[3];
- /* Skip I/O variables that are not used by the entry point. */
+ const bool is_global = storage_class != SpvStorageClassFunction;
+ const bool is_io = storage_class == SpvStorageClassInput ||
+ storage_class == SpvStorageClassOutput;
+
+ /* Skip global variables that are not used by the entrypoint. Before
+ * SPIR-V 1.4 the interface is only used for I/O variables, so extra
+ * variables will still need to be removed later.
+ */
if (!b->options->create_library &&
- (storage_class == SpvStorageClassInput ||
- storage_class == SpvStorageClassOutput) &&
- !bsearch(&w[2], b->interface_ids, b->interface_ids_count, 4, cmp_uint32_t))
- break;
+ (is_io || (b->version >= 0x10400 && is_global))) {
+ if (!bsearch(&w[2], b->interface_ids, b->interface_ids_count, 4, cmp_uint32_t))
+ break;
+ }
struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_pointer);
struct vtn_value *initializer = count > 4 ? vtn_untyped_value(b, w[4]) : NULL;
More information about the mesa-commit
mailing list