Mesa (main): compiler/types: Add a wrap_in_arrays helper
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Oct 16 06:15:09 UTC 2021
Module: Mesa
Branch: main
Commit: b62b2fa4b9c773705b20678810419d40559aae19
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b62b2fa4b9c773705b20678810419d40559aae19
Author: Jason Ekstrand <jason at jlekstrand.net>
Date: Fri Oct 15 16:26:32 2021 -0500
compiler/types: Add a wrap_in_arrays helper
This has been copied+pasted 3 times now.
Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13389>
---
src/compiler/glsl/glsl_to_nir.cpp | 13 +------------
src/compiler/nir/nir_split_vars.c | 15 +--------------
src/compiler/nir_types.cpp | 13 +++++++++++++
src/compiler/nir_types.h | 3 +++
src/compiler/spirv/spirv_to_nir.c | 17 ++---------------
5 files changed, 20 insertions(+), 41 deletions(-)
diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
index 30edad871f8..7ab447dcf06 100644
--- a/src/compiler/glsl/glsl_to_nir.cpp
+++ b/src/compiler/glsl/glsl_to_nir.cpp
@@ -432,17 +432,6 @@ nir_visitor::constant_copy(ir_constant *ir, void *mem_ctx)
return ret;
}
-static const glsl_type *
-wrap_type_in_array(const glsl_type *elem_type, const glsl_type *array_type)
-{
- if (!array_type->is_array())
- return elem_type;
-
- elem_type = wrap_type_in_array(elem_type, array_type->fields.array);
-
- return glsl_type::get_array_instance(elem_type, array_type->length);
-}
-
static unsigned
get_nir_how_declared(unsigned how_declared)
{
@@ -588,7 +577,7 @@ nir_visitor::visit(ir_variable *ir)
/* If the type contains the interface, wrap the explicit type in the
* right number of arrays.
*/
- var->type = wrap_type_in_array(explicit_ifc_type, ir->type);
+ var->type = glsl_type_wrap_in_arrays(explicit_ifc_type, ir->type);
} else {
/* Otherwise, this variable is one entry in the interface */
UNUSED bool found = false;
diff --git a/src/compiler/nir/nir_split_vars.c b/src/compiler/nir/nir_split_vars.c
index 3b8482f7204..fbe44287c7f 100644
--- a/src/compiler/nir/nir_split_vars.c
+++ b/src/compiler/nir/nir_split_vars.c
@@ -78,19 +78,6 @@ struct field {
nir_variable *var;
};
-static const struct glsl_type *
-wrap_type_in_array(const struct glsl_type *type,
- const struct glsl_type *array_type)
-{
- if (!glsl_type_is_array(array_type))
- return type;
-
- const struct glsl_type *elem_type =
- wrap_type_in_array(type, glsl_get_array_element(array_type));
- assert(glsl_get_explicit_stride(array_type) == 0);
- return glsl_array_type(elem_type, glsl_get_length(array_type), 0);
-}
-
static int
num_array_levels_in_array_of_vector_type(const struct glsl_type *type)
{
@@ -141,7 +128,7 @@ init_field_for_type(struct field *field, struct field *parent,
} else {
const struct glsl_type *var_type = type;
for (struct field *f = field->parent; f; f = f->parent)
- var_type = wrap_type_in_array(var_type, f->type);
+ var_type = glsl_type_wrap_in_arrays(var_type, f->type);
nir_variable_mode mode = state->base_var->data.mode;
if (mode == nir_var_function_temp) {
diff --git a/src/compiler/nir_types.cpp b/src/compiler/nir_types.cpp
index 048a03d523f..b069e92c40e 100644
--- a/src/compiler/nir_types.cpp
+++ b/src/compiler/nir_types.cpp
@@ -1048,6 +1048,19 @@ glsl_get_explicit_type_for_size_align(const struct glsl_type *type,
return type->get_explicit_type_for_size_align(type_info, size, align);
}
+const struct glsl_type *
+glsl_type_wrap_in_arrays(const struct glsl_type *type,
+ const struct glsl_type *arrays)
+{
+ if (!glsl_type_is_array(arrays))
+ return type;
+
+ const glsl_type *elem_type =
+ glsl_type_wrap_in_arrays(type, glsl_get_array_element(arrays));
+ return glsl_array_type(elem_type, glsl_get_length(arrays),
+ glsl_get_explicit_stride(arrays));
+}
+
const struct glsl_type *
glsl_type_replace_vec3_with_vec4(const struct glsl_type *type)
{
diff --git a/src/compiler/nir_types.h b/src/compiler/nir_types.h
index ee1e1321bb2..70347995579 100644
--- a/src/compiler/nir_types.h
+++ b/src/compiler/nir_types.h
@@ -248,6 +248,9 @@ const struct glsl_type *glsl_get_explicit_type_for_size_align(const struct glsl_
glsl_type_size_align_func type_info,
unsigned *size, unsigned *align);
+const struct glsl_type *glsl_type_wrap_in_arrays(const struct glsl_type *type,
+ const struct glsl_type *arrays);
+
const struct glsl_type *glsl_type_replace_vec3_with_vec4(const struct glsl_type *type);
unsigned glsl_type_get_sampler_count(const struct glsl_type *type);
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 99be91e4d2b..84944c51eb5 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -853,19 +853,6 @@ vtn_type_copy(struct vtn_builder *b, struct vtn_type *src)
return dest;
}
-static const struct glsl_type *
-wrap_type_in_array(const struct glsl_type *type,
- const struct glsl_type *array_type)
-{
- if (!glsl_type_is_array(array_type))
- return type;
-
- const struct glsl_type *elem_type =
- wrap_type_in_array(type, glsl_get_array_element(array_type));
- return glsl_array_type(elem_type, glsl_get_length(array_type),
- glsl_get_explicit_stride(array_type));
-}
-
static bool
vtn_type_needs_explicit_layout(struct vtn_builder *b, struct vtn_type *type,
enum vtn_variable_mode mode)
@@ -907,7 +894,7 @@ vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
vtn_fail_if(glsl_without_array(type->type) != glsl_uint_type(),
"Variables in the AtomicCounter storage class should be "
"(possibly arrays of arrays of) uint.");
- return wrap_type_in_array(glsl_atomic_uint_type(), type->type);
+ return glsl_type_wrap_in_arrays(glsl_atomic_uint_type(), type->type);
}
if (mode == vtn_variable_mode_uniform) {
@@ -968,7 +955,7 @@ vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
if (mode == vtn_variable_mode_image) {
struct vtn_type *image_type = vtn_type_without_array(type);
vtn_assert(image_type->base_type == vtn_base_type_image);
- return wrap_type_in_array(image_type->glsl_image, type->type);
+ return glsl_type_wrap_in_arrays(image_type->glsl_image, type->type);
}
/* Layout decorations are allowed but ignored in certain conditions,
More information about the mesa-commit
mailing list