@@ -23,10 +23,17 @@ class IGeometryLoader : public IAssetLoader
23
23
protected:
24
24
inline IGeometryLoader () {}
25
25
26
- static inline IGeometry<ICPUBuffer>::SDataView createView (const E_FORMAT format, const size_t elementCount, const void * data=nullptr )
26
+ template <bool AdoptMemory=false >
27
+ static inline IGeometry<ICPUBuffer>::SDataView createView (
28
+ const E_FORMAT format, const size_t elementCount, const void * data=nullptr ,
29
+ core::smart_refctd_ptr<core::refctd_memory_resource>&& memoryResource=nullptr , const size_t alignment=_NBL_SIMD_ALIGNMENT
30
+ )
27
31
{
28
32
const auto stride = getTexelOrBlockBytesize (format);
29
- auto buffer = ICPUBuffer::create ({{stride*elementCount},const_cast <void *>(data)});
33
+ if constexpr (AdoptMemory)
34
+ buffer = ICPUBuffer::create ({{stride*elementCount},const_cast <void *>(data),std::move (memoryResource),alignment},core::adopt_memory);
35
+ else
36
+ buffer = ICPUBuffer::create ({{stride*elementCount},const_cast <void *>(data),std::move (memoryResource),alignment});
30
37
return {
31
38
.composed = {
32
39
.stride = stride,
@@ -36,6 +43,44 @@ class IGeometryLoader : public IAssetLoader
36
43
.src = {.offset =0 ,.size =buffer->getSize (),.buffer =std::move (buffer)}
37
44
};
38
45
}
46
+ // creates a View from a mapped file
47
+ class CFileMemoryResource final : public core::refctd_memory_resource
48
+ {
49
+ public:
50
+ inline CFileMemoryResource (core::smart_refctd_ptr<system::IFile>&& _file) : m_file(std::move(_file)) {}
51
+
52
+ inline void * allocate (std::size_t bytes, std::size_t alignment) override
53
+ {
54
+ assert (false ); // should never be called
55
+ }
56
+ inline void deallocate (void * p, std::size_t bytes, std::size_t alignment) override
57
+ {
58
+ assert (m_file);
59
+ auto * const basePtr = reinterpret_cast <const uint8_t *>(m_file->getMappedPointer ());
60
+ assert (basePtr && basePtr<=p && p<=basePtr+file->getSize ());
61
+ }
62
+
63
+ protected:
64
+ core::smart_refctd_ptr<system::IFile> m_file;
65
+ };
66
+ static inline IGeometry<ICPUBuffer>::SDataView createView (const E_FORMAT format, const size_t elementCount, core::smart_refctd_ptr<system::IFile>&& file, const size_t offsetInFile)
67
+ {
68
+ if (auto * const basePtr=reinterpret_cast <const uint8_t *>(file->getMappedPointer ()); basePtr)
69
+ {
70
+ auto resource = core::make_smart_refctd_ptr<CFileMemoryResource>(std::move (file));
71
+ auto * const data = basePtr+offsetInFile;
72
+ return createView<true >(format,elementCount,data,std::move (resource),0x1ull <<hlsl::findLSB (ptrdiff_t (data)));
73
+ }
74
+ else
75
+ {
76
+ auto view = createView (format,elementCount);
77
+ system::IFile::success_t success;
78
+ file->read (success,reinterpret_cast <uint8_t *>(view.src .buffer ->getPointer ())+view.src .offset ,offsetInFile,view.src .actualSize ());
79
+ if (success)
80
+ return view;
81
+ }
82
+ return {};
83
+ }
39
84
40
85
private:
41
86
};
0 commit comments