1010#include " nbl/asset/IAsset.h"
1111#include " nbl/asset/IPreHashed.h"
1212
13+ #include " nbl/core/alloc/refctd_memory_resource.h"
14+
1315namespace nbl ::asset
1416{
1517
@@ -28,7 +30,7 @@ class ICPUBuffer final : public asset::IBuffer, public IPreHashed
2830 size_t size;
2931 void * data = nullptr ;
3032 size_t alignment = _NBL_SIMD_ALIGNMENT;
31- std::pmr::memory_resource* memoryResource = nullptr ;
33+ core::smart_refctd_ptr<core::refctd_memory_resource> memoryResource = nullptr ;
3234
3335 SCreationParams& operator =(const asset::IBuffer::SCreationParams& rhs)
3436 {
@@ -37,31 +39,28 @@ class ICPUBuffer final : public asset::IBuffer, public IPreHashed
3739 }
3840 };
3941
40- ICPUBuffer (size_t size, void * data, std::pmr::memory_resource* memoryResource, size_t alignment, bool adopt_memory) :
41- asset::IBuffer ({ size, EUF_TRANSFER_DST_BIT }), m_data(data), m_mem_resource(memoryResource), m_alignment(alignment), m_adopt_memory(adopt_memory) {}
42-
4342 // ! allocates uninitialized memory, copies `data` into allocation if `!data` not nullptr
44- core::smart_refctd_ptr<ICPUBuffer> static create (const SCreationParams& params) {
45- std::pmr::memory_resource* memoryResource = params.memoryResource ;
43+ core::smart_refctd_ptr<ICPUBuffer> static create (SCreationParams&& params) {
4644 if (!params.memoryResource )
47- memoryResource = std::pmr::get_default_resource ();
45+ params. memoryResource = core::getDefaultMemoryResource ();
4846
49- auto data = memoryResource->allocate (params.size , params.alignment );
47+ auto data = params. memoryResource ->allocate (params.size , params.alignment );
5048 if (!data)
5149 return nullptr ;
52-
5350 if (params.data )
5451 memcpy (data, params.data , params.size );
52+ params.data = data;
5553
56- return core::make_smart_refctd_ptr <ICPUBuffer>(params. size , data, memoryResource, params. alignment , false );
54+ return core::smart_refctd_ptr <ICPUBuffer>(new ICPUBuffer ( std::move ( params)), core::dont_grab );
5755 }
5856
5957 // ! does not allocate memory, adopts the `data` pointer, no copies done
60- core::smart_refctd_ptr<ICPUBuffer> static create (const SCreationParams& params, core::adopt_memory_t ) {
61- std::pmr::memory_resource* memoryResource;
58+ core::smart_refctd_ptr<ICPUBuffer> static create (SCreationParams&& params, core::adopt_memory_t ) {
59+ if (!params.data )
60+ return nullptr ;
6261 if (!params.memoryResource )
63- memoryResource = std::pmr::get_default_resource ();
64- return core::make_smart_refctd_ptr <ICPUBuffer>(params. size , params. data , memoryResource, params. alignment , true );
62+ params. memoryResource = core::getDefaultMemoryResource ();
63+ return core::smart_refctd_ptr <ICPUBuffer>(new ICPUBuffer ( std::move ( params)), core::dont_grab );
6564 }
6665
6766 core::smart_refctd_ptr<IAsset> clone (uint32_t = ~0u ) const override final
@@ -77,7 +76,6 @@ class ICPUBuffer final : public asset::IBuffer, public IPreHashed
7776
7877 inline size_t getDependantCount () const override { return 0 ; }
7978
80- //
8179 inline core::blake3_hash_t computeContentHash () const override
8280 {
8381 core::blake3_hasher hasher;
@@ -121,22 +119,20 @@ class ICPUBuffer final : public asset::IBuffer, public IPreHashed
121119
122120 inline void discardContent_impl () override
123121 {
124- return freeData ();
125- }
126-
127- // REMEMBER TO CALL FROM DTOR!
128- virtual inline void freeData ()
129- {
130- if (!m_adopt_memory && m_data)
122+ if (m_data)
131123 m_mem_resource->deallocate (m_data, m_creationParams.size , m_alignment);
132124 m_data = nullptr ;
133125 m_creationParams.size = 0ull ;
134126 }
135127
128+ private:
129+ ICPUBuffer (SCreationParams&& params) :
130+ asset::IBuffer ({ params.size , EUF_TRANSFER_DST_BIT }), m_data(params.data),
131+ m_mem_resource (params.memoryResource), m_alignment(params.alignment) {}
132+
136133 void * m_data;
137- std::pmr::memory_resource* m_mem_resource;
134+ core::smart_refctd_ptr<core::refctd_memory_resource> m_mem_resource;
138135 size_t m_alignment;
139- bool m_adopt_memory;
140136};
141137
142138} // end namespace nbl::asset
0 commit comments