mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-14 14:28:08 +02:00
compiler/types: Flip wrapping of array related functions
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25129>
This commit is contained in:
parent
3bf500af7b
commit
67210f90ad
4 changed files with 70 additions and 83 deletions
|
|
@ -358,9 +358,10 @@ const struct glsl_type *glsl_type::get_scalar_type() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const struct glsl_type *glsl_type::get_bare_type() const
|
extern "C" const struct glsl_type *
|
||||||
|
glsl_get_bare_type(const struct glsl_type *t)
|
||||||
{
|
{
|
||||||
switch (this->base_type) {
|
switch (t->base_type) {
|
||||||
case GLSL_TYPE_UINT8:
|
case GLSL_TYPE_UINT8:
|
||||||
case GLSL_TYPE_INT8:
|
case GLSL_TYPE_INT8:
|
||||||
case GLSL_TYPE_UINT16:
|
case GLSL_TYPE_UINT16:
|
||||||
|
|
@ -373,26 +374,26 @@ const struct glsl_type *glsl_type::get_bare_type() const
|
||||||
case GLSL_TYPE_DOUBLE:
|
case GLSL_TYPE_DOUBLE:
|
||||||
case GLSL_TYPE_UINT64:
|
case GLSL_TYPE_UINT64:
|
||||||
case GLSL_TYPE_INT64:
|
case GLSL_TYPE_INT64:
|
||||||
return get_instance(this->base_type, this->vector_elements,
|
return glsl_type::get_instance(t->base_type, t->vector_elements,
|
||||||
this->matrix_columns);
|
t->matrix_columns);
|
||||||
|
|
||||||
case GLSL_TYPE_STRUCT:
|
case GLSL_TYPE_STRUCT:
|
||||||
case GLSL_TYPE_INTERFACE: {
|
case GLSL_TYPE_INTERFACE: {
|
||||||
struct glsl_struct_field *bare_fields = (struct glsl_struct_field *)
|
struct glsl_struct_field *bare_fields = (struct glsl_struct_field *)
|
||||||
calloc(this->length, sizeof(struct glsl_struct_field));
|
calloc(t->length, sizeof(struct glsl_struct_field));
|
||||||
for (unsigned i = 0; i < this->length; i++) {
|
for (unsigned i = 0; i < t->length; i++) {
|
||||||
bare_fields[i].type = this->fields.structure[i].type->get_bare_type();
|
bare_fields[i].type = t->fields.structure[i].type->get_bare_type();
|
||||||
bare_fields[i].name = this->fields.structure[i].name;
|
bare_fields[i].name = t->fields.structure[i].name;
|
||||||
}
|
}
|
||||||
const struct glsl_type *bare_type =
|
const struct glsl_type *bare_type =
|
||||||
get_struct_instance(bare_fields, this->length, glsl_get_type_name(this));
|
glsl_type::get_struct_instance(bare_fields, t->length, glsl_get_type_name(t));
|
||||||
free(bare_fields);
|
free(bare_fields);
|
||||||
return bare_type;
|
return bare_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
case GLSL_TYPE_ARRAY:
|
case GLSL_TYPE_ARRAY:
|
||||||
return get_array_instance(this->fields.array->get_bare_type(),
|
return glsl_type::get_array_instance(t->fields.array->get_bare_type(),
|
||||||
this->length);
|
t->length);
|
||||||
|
|
||||||
case GLSL_TYPE_COOPERATIVE_MATRIX:
|
case GLSL_TYPE_COOPERATIVE_MATRIX:
|
||||||
case GLSL_TYPE_SAMPLER:
|
case GLSL_TYPE_SAMPLER:
|
||||||
|
|
@ -402,7 +403,7 @@ const struct glsl_type *glsl_type::get_bare_type() const
|
||||||
case GLSL_TYPE_VOID:
|
case GLSL_TYPE_VOID:
|
||||||
case GLSL_TYPE_SUBROUTINE:
|
case GLSL_TYPE_SUBROUTINE:
|
||||||
case GLSL_TYPE_ERROR:
|
case GLSL_TYPE_ERROR:
|
||||||
return this;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
unreachable("Invalid base type");
|
unreachable("Invalid base type");
|
||||||
|
|
@ -3441,4 +3442,43 @@ glsl_contains_atomic(const struct glsl_type *t)
|
||||||
return t->atomic_size() > 0;
|
return t->atomic_size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct glsl_type *
|
||||||
|
glsl_without_array(const struct glsl_type *t)
|
||||||
|
{
|
||||||
|
while (t->is_array())
|
||||||
|
t = t->fields.array;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct glsl_type *
|
||||||
|
glsl_without_array_or_matrix(const struct glsl_type *t)
|
||||||
|
{
|
||||||
|
t = t->without_array();
|
||||||
|
if (t->is_matrix())
|
||||||
|
t = t->column_type();
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct glsl_type *
|
||||||
|
glsl_type_wrap_in_arrays(const struct glsl_type *t,
|
||||||
|
const struct glsl_type *arrays)
|
||||||
|
{
|
||||||
|
if (!glsl_type_is_array(arrays))
|
||||||
|
return t;
|
||||||
|
|
||||||
|
const struct glsl_type *elem_type =
|
||||||
|
glsl_type_wrap_in_arrays(t, glsl_get_array_element(arrays));
|
||||||
|
return glsl_type::get_array_instance(elem_type, glsl_get_length(arrays),
|
||||||
|
glsl_get_explicit_stride(arrays));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned
|
||||||
|
glsl_get_length(const struct glsl_type *t)
|
||||||
|
{
|
||||||
|
return t->is_matrix() ? t->matrix_columns : t->length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1283,7 +1283,12 @@ unsigned glsl_get_vector_elements(const struct glsl_type *t);
|
||||||
unsigned glsl_get_components(const struct glsl_type *t);
|
unsigned glsl_get_components(const struct glsl_type *t);
|
||||||
unsigned glsl_get_matrix_columns(const struct glsl_type *t);
|
unsigned glsl_get_matrix_columns(const struct glsl_type *t);
|
||||||
|
|
||||||
int glsl_array_size(const struct glsl_type *t);
|
static inline int
|
||||||
|
glsl_array_size(const struct glsl_type *t)
|
||||||
|
{
|
||||||
|
return glsl_type_is_array(t) ? t->length : -1;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned glsl_get_aoa_size(const struct glsl_type *t);
|
unsigned glsl_get_aoa_size(const struct glsl_type *t);
|
||||||
const struct glsl_type *glsl_get_array_element(const struct glsl_type *t);
|
const struct glsl_type *glsl_get_array_element(const struct glsl_type *t);
|
||||||
const struct glsl_type *glsl_without_array(const struct glsl_type *t);
|
const struct glsl_type *glsl_without_array(const struct glsl_type *t);
|
||||||
|
|
@ -1461,7 +1466,13 @@ unsigned glsl_get_std140_size(const struct glsl_type *t, bool row_major);
|
||||||
unsigned glsl_get_std430_base_alignment(const struct glsl_type *t, bool row_major);
|
unsigned glsl_get_std430_base_alignment(const struct glsl_type *t, bool row_major);
|
||||||
unsigned glsl_get_std430_size(const struct glsl_type *t, bool row_major);
|
unsigned glsl_get_std430_size(const struct glsl_type *t, bool row_major);
|
||||||
unsigned glsl_get_explicit_size(const struct glsl_type *t, bool align_to_stride);
|
unsigned glsl_get_explicit_size(const struct glsl_type *t, bool align_to_stride);
|
||||||
unsigned glsl_get_explicit_stride(const struct glsl_type *t);
|
|
||||||
|
static inline unsigned
|
||||||
|
glsl_get_explicit_stride(const struct glsl_type *t)
|
||||||
|
{
|
||||||
|
return t->explicit_stride;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned glsl_get_explicit_alignment(const struct glsl_type *t);
|
unsigned glsl_get_explicit_alignment(const struct glsl_type *t);
|
||||||
|
|
||||||
void glsl_get_natural_size_align_bytes(const struct glsl_type *t, unsigned *size, unsigned *align);
|
void glsl_get_natural_size_align_bytes(const struct glsl_type *t, unsigned *size, unsigned *align);
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,11 @@ glsl_type::components() const
|
||||||
return vector_elements * matrix_columns;
|
return vector_elements * matrix_columns;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline int glsl_type::array_size() const { return glsl_array_size(this); }
|
||||||
|
inline const glsl_type *glsl_type::without_array() const { return glsl_without_array(this); }
|
||||||
|
|
||||||
|
inline const glsl_type *glsl_type::get_bare_type() const { return glsl_get_bare_type(this); }
|
||||||
|
|
||||||
inline unsigned
|
inline unsigned
|
||||||
glsl_type::count_attribute_slots(bool is_gl_vertex_input) const
|
glsl_type::count_attribute_slots(bool is_gl_vertex_input) const
|
||||||
{
|
{
|
||||||
|
|
@ -166,17 +171,6 @@ glsl_type::is_anonymous() const
|
||||||
return !strncmp(glsl_get_type_name(this), "#anon", 5);
|
return !strncmp(glsl_get_type_name(this), "#anon", 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const glsl_type *
|
|
||||||
glsl_type::without_array() const
|
|
||||||
{
|
|
||||||
const glsl_type *t = this;
|
|
||||||
|
|
||||||
while (t->is_array())
|
|
||||||
t = t->fields.array;
|
|
||||||
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline unsigned
|
inline unsigned
|
||||||
glsl_type::arrays_of_arrays_size() const
|
glsl_type::arrays_of_arrays_size() const
|
||||||
{
|
{
|
||||||
|
|
@ -245,12 +239,6 @@ glsl_type::column_type() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int
|
|
||||||
glsl_type::array_size() const
|
|
||||||
{
|
|
||||||
return is_array() ? length : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool glsl_type::is_unsized_array() const { return glsl_type_is_unsized_array(this); }
|
inline bool glsl_type::is_unsized_array() const { return glsl_type_is_unsized_array(this); }
|
||||||
|
|
||||||
inline enum glsl_interface_packing
|
inline enum glsl_interface_packing
|
||||||
|
|
|
||||||
|
|
@ -40,33 +40,6 @@ glsl_get_type_name(const struct glsl_type *type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
glsl_array_size(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
return type->array_size();
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct glsl_type *
|
|
||||||
glsl_without_array(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
return type->without_array();
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct glsl_type *
|
|
||||||
glsl_without_array_or_matrix(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
type = type->without_array();
|
|
||||||
if (type->is_matrix())
|
|
||||||
type = type->column_type();
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct glsl_type *
|
|
||||||
glsl_get_bare_type(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
return type->get_bare_type();
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct glsl_type *
|
const struct glsl_type *
|
||||||
glsl_get_struct_field(const struct glsl_type *type, unsigned index)
|
glsl_get_struct_field(const struct glsl_type *type, unsigned index)
|
||||||
{
|
{
|
||||||
|
|
@ -90,12 +63,6 @@ glsl_get_struct_field_data(const struct glsl_type *type, unsigned index)
|
||||||
return &type->fields.structure[index];
|
return &type->fields.structure[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
|
||||||
glsl_get_explicit_stride(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
return type->explicit_stride;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct glsl_type *
|
const struct glsl_type *
|
||||||
glsl_texture_type_to_sampler(const struct glsl_type *type, bool is_shadow)
|
glsl_texture_type_to_sampler(const struct glsl_type *type, bool is_shadow)
|
||||||
{
|
{
|
||||||
|
|
@ -150,12 +117,6 @@ glsl_get_matrix_columns(const struct glsl_type *type)
|
||||||
return type->matrix_columns;
|
return type->matrix_columns;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned
|
|
||||||
glsl_get_length(const struct glsl_type *type)
|
|
||||||
{
|
|
||||||
return type->is_matrix() ? type->matrix_columns : type->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
glsl_get_aoa_size(const struct glsl_type *type)
|
glsl_get_aoa_size(const struct glsl_type *type)
|
||||||
{
|
{
|
||||||
|
|
@ -702,19 +663,6 @@ glsl_get_explicit_type_for_size_align(const struct glsl_type *type,
|
||||||
return type->get_explicit_type_for_size_align(type_info, size, align);
|
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 struct 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 *
|
const struct glsl_type *
|
||||||
glsl_type_replace_vec3_with_vec4(const struct glsl_type *type)
|
glsl_type_replace_vec3_with_vec4(const struct glsl_type *type)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue