<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Nov 5, 2018 at 8:58 PM Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This creates a new glsl_type with the specified number on components.<br>
<br>
We will use this in the following patch when vectorising io.<br>
---<br>
src/compiler/nir_types.cpp | 24 ++++++++++++++++++++++++<br>
src/compiler/nir_types.h | 2 ++<br>
2 files changed, 26 insertions(+)<br>
<br>
diff --git a/src/compiler/nir_types.cpp b/src/compiler/nir_types.cpp<br>
index d24f0941519..45a06e0214b 100644<br>
--- a/src/compiler/nir_types.cpp<br>
+++ b/src/compiler/nir_types.cpp<br>
@@ -432,6 +432,30 @@ glsl_array_type(const glsl_type *base, unsigned elements)<br>
return glsl_type::get_array_instance(base, elements);<br>
}<br>
<br>
+const glsl_type *<br>
+glsl_replace_vector_type(const glsl_type *t, unsigned components)<br></blockquote><div><br></div><div>On the one hand, this doesn't seem incredibly generic. On the other hand, I seem to recall having written this function before....<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+{<br>
+ switch (glsl_get_base_type(t)) {<br>
+ case GLSL_TYPE_ARRAY: {<br>
+ const glsl_type *base = glsl_replace_vector_type(t->fields.array, components);<br>
+ return glsl_array_type(base, glsl_get_length(t));<br>
+ }<br>
+ case GLSL_TYPE_UINT:<br>
+ case GLSL_TYPE_INT:<br>
+ case GLSL_TYPE_FLOAT:<br>
+ case GLSL_TYPE_BOOL:<br>
+ case GLSL_TYPE_DOUBLE:<br>
+ case GLSL_TYPE_UINT64:<br>
+ case GLSL_TYPE_INT64:<br>
+ case GLSL_TYPE_FLOAT16:<br>
+ case GLSL_TYPE_UINT16:<br>
+ case GLSL_TYPE_INT16:<br>
+ return glsl_vector_type(glsl_get_base_type(t), components);<br></blockquote><div><br></div><div>Would it be better to just do:</div><div><br></div><div>if (glsl_type_is_array(t)) {<br></div><div> return glsl_array_type(glsl_replace_vector_type(t->fields.array), t->length);</div><div>} else if (glsl_type_is_vector_or_scalar(t)) {</div><div> return glsl_vector_type(t->base_type, components);<br></div><div>} else {</div><div> unreachable();</div><div>}</div><div><br></div><div>That way we don't accidentally forget to add new scalar cases (INT8 is coming!) and we ensure that the matrix case (currently unhandled) hits the unreachable?</div><div><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ default:<br>
+ unreachable("Unhandled base type glsl_replace_vector_type()");<br>
+ }<br>
+}<br>
+<br>
const glsl_type *<br>
glsl_struct_type(const glsl_struct_field *fields,<br>
unsigned num_fields, const char *name)<br>
diff --git a/src/compiler/nir_types.h b/src/compiler/nir_types.h<br>
index 77454fa9fab..deb7ead8dd2 100644<br>
--- a/src/compiler/nir_types.h<br>
+++ b/src/compiler/nir_types.h<br>
@@ -167,6 +167,8 @@ const struct glsl_type *glsl_bool_type(void);<br>
const struct glsl_type *glsl_scalar_type(enum glsl_base_type base_type);<br>
const struct glsl_type *glsl_vector_type(enum glsl_base_type base_type,<br>
unsigned components);<br>
+const struct glsl_type * glsl_replace_vector_type(const struct glsl_type *t,<br>
+ unsigned components);<br>
const struct glsl_type *glsl_matrix_type(enum glsl_base_type base_type,<br>
unsigned rows, unsigned columns);<br>
const struct glsl_type *glsl_array_type(const struct glsl_type *base,<br>
-- <br>
2.19.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>