/** * Serializes gl_shader structure, writes shader header * information and exec_list of instructions */ extern "C" char * mesa_shader_serialize(struct gl_context *ctx, struct gl_shader *shader, size_t *size, bool shader_only) { assert(ctx); if (!supported_by_shader_cache(shader, true /* is_write */)) return NULL; *size = 0; memory_writer blob; // write the size early for quick completeness checking assert(blob.position() == 0); uint32_t shader_sentinel = 0; blob.write_uint32_t(shader_sentinel); if (shader_only) { /* If only serializing shader, we must populate our cache identifiers */ blob.write(&cache_validation_data, sizeof(cache_validation_data)); blob.write_string(mesa_get_shader_cache_magic()); blob.write_string((const char *)ctx->Driver.GetString(ctx, GL_VENDOR)); blob.write_string((const char *)ctx->Driver.GetString(ctx, GL_RENDERER)); } int32_t start_pos = blob.position(); uint32_t shader_data_len = 0; uint32_t shader_type = shader->Type; blob.write_uint32_t(shader_data_len); blob.write_uint32_t(shader_type); blob.write(shader, sizeof(struct gl_shader)); /* dump all shader instructions */ serialize_list(shader->ir, blob); shader_data_len = blob.position() - start_pos - sizeof(shader_data_len); blob.overwrite(&shader_data_len, sizeof(shader_data_len), start_pos); // write shader length to sentinel for now shader_sentinel = shader_data_len; blob.overwrite(&shader_sentinel, sizeof(shader_sentinel), 0); *size = blob.position(); return blob.release_memory(size); }
void DHCP::domain_name_servers(const vector<ipaddress_type>& dns) { serialization_type buffer = serialize_list(dns); add_option(option(DOMAIN_NAME_SERVERS, buffer.begin(), buffer.end())); }
void DHCP::routers(const vector<ipaddress_type>& routers) { serialization_type buffer = serialize_list(routers); add_option(option(ROUTERS, buffer.begin(), buffer.end())); }
inline bool operator()( NodeType & dest, const SerType & src ) const { return serialize_list( dest, src ); }