X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir_types.cpp;h=c8a2940496909682d4c277b5f5388b1cfe7562af;hb=477d4b9960ae8b7524806a9dff1d91b0546ec0f2;hp=5583bc01620ba3cb35ef6ad10ac725095fb66141;hpb=bce6f9987522ebb585571f7333d47e41e1dead9b;p=mesa.git diff --git a/src/compiler/nir_types.cpp b/src/compiler/nir_types.cpp index 5583bc01620..c8a29404969 100644 --- a/src/compiler/nir_types.cpp +++ b/src/compiler/nir_types.cpp @@ -39,6 +39,8 @@ glsl_get_array_element(const glsl_type* type) { if (type->is_matrix()) return type->column_type(); + else if (type->is_vector()) + return type->get_scalar_type(); return type->fields.array; } @@ -79,6 +81,12 @@ glsl_get_column_type(const struct glsl_type *type) return type->column_type(); } +GLenum +glsl_get_gl_type(const struct glsl_type *type) +{ + return type->gl_type; +} + enum glsl_base_type glsl_get_base_type(const struct glsl_type *type) { @@ -122,6 +130,12 @@ glsl_count_attribute_slots(const struct glsl_type *type, return type->count_attribute_slots(is_vertex_input); } +unsigned +glsl_get_component_slots(const struct glsl_type *type) +{ + return type->component_slots(); +} + const char * glsl_get_struct_elem_name(const struct glsl_type *type, unsigned index) { @@ -142,6 +156,13 @@ glsl_get_sampler_result_type(const struct glsl_type *type) return (glsl_base_type)type->sampled_type; } +unsigned +glsl_get_sampler_target(const struct glsl_type *type) +{ + assert(glsl_type_is_sampler(type)); + return type->sampler_index(); +} + unsigned glsl_get_record_location_offset(const struct glsl_type *type, unsigned length) @@ -149,6 +170,18 @@ glsl_get_record_location_offset(const struct glsl_type *type, return type->record_location_offset(length); } +bool +glsl_type_is_16bit(const glsl_type *type) +{ + return type->is_16bit(); +} + +bool +glsl_type_is_64bit(const glsl_type *type) +{ + return type->is_64bit(); +} + bool glsl_type_is_void(const glsl_type *type) { @@ -265,6 +298,12 @@ glsl_double_type(void) return glsl_type::double_type; } +const glsl_type * +glsl_float16_t_type(void) +{ + return glsl_type::float16_t_type; +} + const glsl_type * glsl_vec_type(unsigned n) { @@ -283,6 +322,12 @@ glsl_vec4_type(void) return glsl_type::vec4_type; } +const glsl_type * +glsl_uvec4_type(void) +{ + return glsl_type::uvec4_type; +} + const glsl_type * glsl_int_type(void) { @@ -307,6 +352,30 @@ glsl_uint64_t_type(void) return glsl_type::uint64_t_type; } +const glsl_type * +glsl_int16_t_type(void) +{ + return glsl_type::int16_t_type; +} + +const glsl_type * +glsl_uint16_t_type(void) +{ + return glsl_type::uint16_t_type; +} + +const glsl_type * +glsl_int8_t_type(void) +{ + return glsl_type::int8_t_type; +} + +const glsl_type * +glsl_uint8_t_type(void) +{ + return glsl_type::uint8_t_type; +} + const glsl_type * glsl_bool_type(void) { @@ -322,15 +391,17 @@ glsl_scalar_type(enum glsl_base_type base_type) const glsl_type * glsl_vector_type(enum glsl_base_type base_type, unsigned components) { - assert(components > 1 && components <= 4); - return glsl_type::get_instance(base_type, components, 1); + const glsl_type *t = glsl_type::get_instance(base_type, components, 1); + assert(t != glsl_type::error_type); + return t; } const glsl_type * glsl_matrix_type(enum glsl_base_type base_type, unsigned rows, unsigned columns) { - assert(rows > 1 && rows <= 4 && columns >= 1 && columns <= 4); - return glsl_type::get_instance(base_type, rows, columns); + const glsl_type *t = glsl_type::get_instance(base_type, rows, columns); + assert(t != glsl_type::error_type); + return t; } const glsl_type * @@ -391,3 +462,110 @@ glsl_transposed_type(const struct glsl_type *type) return glsl_type::get_instance(type->base_type, type->matrix_columns, type->vector_elements); } + +const glsl_type * +glsl_channel_type(const glsl_type *t) +{ + switch (glsl_get_base_type(t)) { + case GLSL_TYPE_ARRAY: { + const glsl_type *base = glsl_channel_type(glsl_get_array_element(t)); + return glsl_array_type(base, glsl_get_length(t)); + } + case GLSL_TYPE_UINT: + return glsl_uint_type(); + case GLSL_TYPE_INT: + return glsl_int_type(); + case GLSL_TYPE_FLOAT: + return glsl_float_type(); + case GLSL_TYPE_BOOL: + return glsl_bool_type(); + case GLSL_TYPE_DOUBLE: + return glsl_double_type(); + case GLSL_TYPE_UINT64: + return glsl_uint64_t_type(); + case GLSL_TYPE_INT64: + return glsl_int64_t_type(); + case GLSL_TYPE_FLOAT16: + return glsl_float16_t_type(); + case GLSL_TYPE_UINT16: + return glsl_uint16_t_type(); + case GLSL_TYPE_INT16: + return glsl_int16_t_type(); + default: + unreachable("Unhandled base type glsl_channel_type()"); + } +} + +void +glsl_get_natural_size_align_bytes(const struct glsl_type *type, + unsigned *size, unsigned *align) +{ + switch (type->base_type) { + case GLSL_TYPE_UINT8: + case GLSL_TYPE_INT8: + case GLSL_TYPE_UINT16: + case GLSL_TYPE_INT16: + case GLSL_TYPE_FLOAT16: + case GLSL_TYPE_UINT: + case GLSL_TYPE_INT: + case GLSL_TYPE_FLOAT: + case GLSL_TYPE_BOOL: + case GLSL_TYPE_DOUBLE: + case GLSL_TYPE_UINT64: + case GLSL_TYPE_INT64: { + unsigned N = glsl_get_bit_size(type) / 8; + *size = N * type->components(); + *align = N; + break; + } + + case GLSL_TYPE_ARRAY: { + unsigned elem_size, elem_align; + glsl_get_natural_size_align_bytes(type->fields.array, + &elem_size, &elem_align); + *align = elem_align; + *size = type->length * ALIGN_POT(elem_size, elem_align); + break; + } + + case GLSL_TYPE_STRUCT: + *size = 0; + *align = 0; + for (unsigned i = 0; i < type->length; i++) { + unsigned elem_size, elem_align; + glsl_get_natural_size_align_bytes(type->fields.structure[i].type, + &elem_size, &elem_align); + *align = MAX2(*align, elem_align); + *size = ALIGN_POT(*size, elem_align) + elem_size; + } + break; + + case GLSL_TYPE_SAMPLER: + case GLSL_TYPE_ATOMIC_UINT: + case GLSL_TYPE_SUBROUTINE: + case GLSL_TYPE_IMAGE: + case GLSL_TYPE_VOID: + case GLSL_TYPE_ERROR: + case GLSL_TYPE_INTERFACE: + case GLSL_TYPE_FUNCTION: + unreachable("type does not have a natural size"); + } +} + +const glsl_type * +glsl_atomic_uint_type(void) +{ + return glsl_type::atomic_uint_type; +} + +unsigned +glsl_atomic_size(const struct glsl_type *type) +{ + return type->atomic_size(); +} + +bool +glsl_contains_atomic(const struct glsl_type *type) +{ + return type->contains_atomic(); +}