Will be utilized by IR serialization to serialize user defined types. Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> Reviewed-by: Paul Berry <stereotype...@gmail.com> (v1) --- src/glsl/glsl_types.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ src/glsl/glsl_types.h | 6 +++++ 2 files changed, 64 insertions(+)
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 849a79a..212d533 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -143,6 +143,64 @@ glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields, } +void +glsl_type::serialize(memory_writer &mem) const +{ + uint32_t data_len = 0; + + mem.write_string(name); + + unsigned start_pos = mem.position(); + mem.write_uint32_t(data_len); + + /** + * Used to notify reader if a user defined type + * has been serialized before. + */ + uint8_t user_type_exists = 0; + + /* Serialize only user defined types. */ + switch (base_type) { + case GLSL_TYPE_ARRAY: + case GLSL_TYPE_STRUCT: + case GLSL_TYPE_INTERFACE: + break; + default: + goto serilization_epilogue; + } + + uint32_t type_id; + user_type_exists = mem.make_unique_id(this, &type_id); + + mem.write_uint8_t(user_type_exists); + mem.write_uint32_t(type_id); + + /* No need to write again. */ + if (user_type_exists) + goto serilization_epilogue; + + mem.write_uint32_t((uint32_t)length); + mem.write_uint8_t((uint8_t)base_type); + mem.write_uint8_t((uint8_t)interface_packing); + + if (base_type == GLSL_TYPE_ARRAY) { + element_type()->serialize(mem); + } else { + glsl_struct_field *field = fields.structure; + for (unsigned i = 0; i < length; i++, field++) { + mem.write(field, sizeof(glsl_struct_field)); + mem.write_string(field->name); + field->type->serialize(mem); + } + } + +serilization_epilogue: + /* Update the length of written data in 'start_pos'. */ + data_len = mem.position() - start_pos - sizeof(data_len); + mem.overwrite(&data_len, sizeof(data_len), start_pos); +} + + bool glsl_type::contains_sampler() const { diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h index dca5492..bc2dffe 100644 --- a/src/glsl/glsl_types.h +++ b/src/glsl/glsl_types.h @@ -82,6 +82,7 @@ enum glsl_interface_packing { #ifdef __cplusplus #include "GL/gl.h" #include "ralloc.h" +#include "memory_writer.h" struct glsl_type { GLenum gl_type; @@ -122,6 +123,11 @@ struct glsl_type { } /** + * Serialization functionality used by binary shaders. + */ + void serialize(memory_writer &mem) const; + + /** * \name Vector and matrix element counts * * For scalars, each of these values will be 1. For non-numeric types -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev