diff options
author | Marek Olšák <[email protected]> | 2019-10-30 20:38:44 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-11-01 19:19:03 -0400 |
commit | c236e6c1e3224dd324b9ee3d3b501bd02ba2f177 (patch) | |
tree | 6fbf7216ad74e972be55ef0f3e9e1e2151bcbc15 | |
parent | 5dde2aa8d976a76eda3102f34977c3a24631179d (diff) |
glsl: encode struct/interface types better
Reviewed-by: Timothy Arceri <[email protected]>
-rw-r--r-- | src/compiler/glsl_types.cpp | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index ab3d3c97593..4450b23a8c4 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -2595,6 +2595,12 @@ union packed_type { unsigned length:13; unsigned explicit_stride:14; } array; + struct { + unsigned base_type:5; + unsigned interface_packing_or_packed:2; + unsigned interface_row_major:1; + unsigned length:24; + } strct; }; void @@ -2668,9 +2674,19 @@ encode_type_to_blob(struct blob *blob, const glsl_type *type) return; case GLSL_TYPE_STRUCT: case GLSL_TYPE_INTERFACE: + encoded.strct.length = MIN2(type->length, 0xffffff); + if (type->is_interface()) { + encoded.strct.interface_packing_or_packed = type->interface_packing; + encoded.strct.interface_row_major = type->interface_row_major; + } else { + encoded.strct.interface_packing_or_packed = type->packed; + } blob_write_uint32(blob, encoded.u32); blob_write_string(blob, type->name); - blob_write_uint32(blob, type->length); + + /* If we don't have enough bits for length, store it separately. */ + if (encoded.strct.length == 0xffffff) + blob_write_uint32(blob, type->length); size_t s_field_size, s_field_ptrs; get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs); @@ -2684,13 +2700,6 @@ encode_type_to_blob(struct blob *blob, const glsl_type *type) ((char *)&type->fields.structure[i]) + s_field_ptrs, s_field_size - s_field_ptrs); } - - if (type->is_interface()) { - blob_write_uint32(blob, type->interface_packing); - blob_write_uint32(blob, type->interface_row_major); - } else { - blob_write_uint32(blob, type->packed); - } return; case GLSL_TYPE_VOID: break; @@ -2763,7 +2772,9 @@ decode_type_from_blob(struct blob_reader *blob) case GLSL_TYPE_STRUCT: case GLSL_TYPE_INTERFACE: { char *name = blob_read_string(blob); - unsigned num_fields = blob_read_uint32(blob); + unsigned num_fields = encoded.strct.length; + if (num_fields == 0xffffff) + num_fields = blob_read_uint32(blob); size_t s_field_size, s_field_ptrs; get_struct_type_field_and_pointer_sizes(&s_field_size, &s_field_ptrs); @@ -2781,12 +2792,12 @@ decode_type_from_blob(struct blob_reader *blob) const glsl_type *t; if (base_type == GLSL_TYPE_INTERFACE) { enum glsl_interface_packing packing = - (glsl_interface_packing) blob_read_uint32(blob); - bool row_major = blob_read_uint32(blob); + (glsl_interface_packing) encoded.strct.interface_packing_or_packed; + bool row_major = encoded.strct.interface_row_major; t = glsl_type::get_interface_instance(fields, num_fields, packing, row_major, name); } else { - unsigned packed = blob_read_uint32(blob); + unsigned packed = encoded.strct.interface_packing_or_packed; t = glsl_type::get_struct_instance(fields, num_fields, name, packed); } |