Blender V5.0
BKE_bake_items_serialize.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_fileops.hh"
12#include "BLI_function_ref.hh"
13#include "BLI_mutex.hh"
14#include "BLI_serialize.hh"
15
16#include "BKE_bake_items.hh"
17
18namespace blender::bke::bake {
19
24struct BlobSlice {
25 std::string name;
27
28 std::shared_ptr<io::serialize::DictionaryValue> serialize() const;
29 static std::optional<BlobSlice> deserialize(const io::serialize::DictionaryValue &io_slice);
30};
31
36 public:
37 virtual ~BlobReader() = default;
38
43 [[nodiscard]] virtual bool read(const BlobSlice &slice, void *r_data) const = 0;
44
49 [[nodiscard]] virtual bool read_as_stream(const BlobSlice &slice,
50 FunctionRef<bool(std::istream &)> fn) const;
51};
52
57 protected:
59
60 public:
61 virtual ~BlobWriter() = default;
62
67 virtual BlobSlice write(const void *data, int64_t size) = 0;
68
75 virtual BlobSlice write_as_stream(StringRef file_extension,
76 FunctionRef<void(std::ostream &)> fn);
77
79 {
81 }
82};
83
88 private:
89 struct StoredByRuntimeValue {
94 int64_t sharing_info_version;
99 std::shared_ptr<io::serialize::DictionaryValue> io_data;
100 };
101
108
113 Map<uint64_t, BlobSlice> slice_by_content_hash_;
114
115 public:
117
124 [[nodiscard]] std::shared_ptr<io::serialize::DictionaryValue> write_implicitly_shared(
125 const ImplicitSharingInfo *sharing_info,
126 FunctionRef<std::shared_ptr<io::serialize::DictionaryValue>()> write_fn);
127
133 [[nodiscard]] std::shared_ptr<io::serialize::DictionaryValue> write_deduplicated(
134 BlobWriter &writer, const void *data, int64_t size_in_bytes);
135};
136
141 private:
145 mutable Mutex mutex_;
150 mutable Map<std::string, ImplicitSharingInfoAndData> runtime_by_stored_;
151
152 public:
154
159 [[nodiscard]] std::optional<ImplicitSharingInfoAndData> read_shared(
160 const io::serialize::DictionaryValue &io_data,
161 FunctionRef<std::optional<ImplicitSharingInfoAndData>()> read_fn) const;
162};
163
168 private:
169 const std::string blobs_dir_;
170 mutable Mutex mutex_;
171 mutable Map<std::string, std::unique_ptr<fstream>> open_input_streams_;
172
173 public:
174 DiskBlobReader(std::string blobs_dir);
175 [[nodiscard]] bool read(const BlobSlice &slice, void *r_data) const override;
176};
177
182 private:
184 std::string blob_dir_;
186 std::string base_name_;
187 std::string blob_name_;
189 std::fstream blob_stream_;
191 int64_t current_offset_ = 0;
193 int independent_file_count_ = 0;
194
195 public:
196 DiskBlobWriter(std::string blob_dir, std::string base_name);
197
198 BlobSlice write(const void *data, int64_t size) override;
199
200 BlobSlice write_as_stream(StringRef file_extension,
201 FunctionRef<void(std::ostream &)> fn) override;
202};
203
208 public:
210 std::unique_ptr<std::ostringstream> stream;
212 };
213
214 private:
215 std::string base_name_;
216 std::string blob_name_;
217 Map<std::string, OutputStream> stream_by_name_;
218 int independent_file_count_ = 0;
219
220 public:
221 MemoryBlobWriter(std::string base_name);
222
223 BlobSlice write(const void *data, int64_t size) override;
224
225 BlobSlice write_as_stream(StringRef file_extension,
226 FunctionRef<void(std::ostream &)> fn) override;
227
229 {
230 return stream_by_name_;
231 }
232};
233
238 private:
240
241 public:
242 void add(StringRef name, Span<std::byte> blob);
243
244 [[nodiscard]] bool read(const BlobSlice &slice, void *r_data) const override;
245};
246
247void serialize_bake(const BakeState &bake_state,
248 BlobWriter &blob_writer,
249 BlobWriteSharing &blob_sharing,
250 std::ostream &r_stream);
251
252std::optional<BakeState> deserialize_bake(std::istream &stream,
253 const BlobReader &blob_reader,
254 const BlobReadSharing &blob_sharing);
255
256} // namespace blender::bke::bake
File and directory operations.
BMesh const char void * data
long long int int64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
NonCopyable(const NonCopyable &other)=delete
NonMovable(NonMovable &&other)=delete
std::optional< ImplicitSharingInfoAndData > read_shared(const io::serialize::DictionaryValue &io_data, FunctionRef< std::optional< ImplicitSharingInfoAndData >()> read_fn) const
virtual bool read_as_stream(const BlobSlice &slice, FunctionRef< bool(std::istream &)> fn) const
virtual ~BlobReader()=default
virtual bool read(const BlobSlice &slice, void *r_data) const =0
std::shared_ptr< io::serialize::DictionaryValue > write_implicitly_shared(const ImplicitSharingInfo *sharing_info, FunctionRef< std::shared_ptr< io::serialize::DictionaryValue >()> write_fn)
std::shared_ptr< io::serialize::DictionaryValue > write_deduplicated(BlobWriter &writer, const void *data, int64_t size_in_bytes)
virtual BlobSlice write(const void *data, int64_t size)=0
virtual BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn)
virtual ~BlobWriter()=default
DiskBlobWriter(std::string blob_dir, std::string base_name)
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
BlobSlice write(const void *data, int64_t size) override
void add(StringRef name, Span< std::byte > blob)
const Map< std::string, OutputStream > & get_stream_by_name() const
BlobSlice write(const void *data, int64_t size) override
BlobSlice write_as_stream(StringRef file_extension, FunctionRef< void(std::ostream &)> fn) override
void serialize_bake(const BakeState &bake_state, BlobWriter &blob_writer, BlobWriteSharing &blob_sharing, std::ostream &r_stream)
std::optional< BakeState > deserialize_bake(std::istream &stream, const BlobReader &blob_reader, const BlobReadSharing &blob_sharing)
std::mutex Mutex
Definition BLI_mutex.hh:47
const char * name
std::shared_ptr< io::serialize::DictionaryValue > serialize() const
static std::optional< BlobSlice > deserialize(const io::serialize::DictionaryValue &io_slice)