Skip to content

Commit 3398802

Browse files
committed
asset: reference counted memory_resource
Signed-off-by: Ali Cheraghi <alichraghi@proton.me>
1 parent f25b884 commit 3398802

File tree

6 files changed

+98
-28
lines changed

6 files changed

+98
-28
lines changed

include/nbl/asset/ICPUBuffer.h

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include "nbl/asset/IAsset.h"
1111
#include "nbl/asset/IPreHashed.h"
1212

13+
#include "nbl/core/alloc/refctd_memory_resource.h"
14+
1315
namespace 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
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright (C) 2019-2024 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine" and was originally part of the "Irrlicht Engine"
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
// See the original file in irrlicht source for authors
5+
6+
#ifndef _NBL_CORE_ALLOC_REFCTD_MEMORY_RESOURCE_INCLUDED_
7+
#define _NBL_CORE_ALLOC_REFCTD_MEMORY_RESOURCE_INCLUDED_
8+
9+
#include "BuildConfigOptions.h"
10+
#include "nbl/core/IReferenceCounted.h"
11+
12+
#include <memory_resource>
13+
14+
using namespace nbl;
15+
16+
namespace nbl::core
17+
{
18+
19+
class refctd_memory_resource : public core::IReferenceCounted
20+
{
21+
public:
22+
refctd_memory_resource(std::pmr::memory_resource* pmr) : m_pmr(pmr) {};
23+
24+
void* allocate(size_t bytes, size_t alignment) {
25+
return m_pmr->allocate(bytes, alignment);
26+
}
27+
28+
void deallocate(void* p, size_t bytes, size_t alignment) {
29+
return m_pmr->deallocate(p, bytes, alignment);
30+
}
31+
32+
private:
33+
std::pmr::memory_resource* m_pmr;
34+
};
35+
36+
NBL_API2 smart_refctd_ptr<refctd_memory_resource> getNullMemoryResource();
37+
NBL_API2 smart_refctd_ptr<refctd_memory_resource> getDefaultMemoryResource();
38+
NBL_API2 void setDefaultMemoryResource(smart_refctd_ptr<refctd_memory_resource> memoryResource);
39+
40+
}
41+
42+
#endif

src/nbl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ unset(NABLA_HEADERS_PUBLIC2 ${NBL_TMP_FULL_PATHS})
119119

120120
set(NBL_CORE_SOURCES
121121
${NBL_ROOT_PATH}/src/nbl/core/IReferenceCounted.cpp
122+
${NBL_ROOT_PATH}/src/nbl/core/alloc/refctd_memory_resource.cpp
122123
${NBL_ROOT_PATH}/src/nbl/core/hash/blake.cpp
123124
)
124125
set(NBL_SYSTEM_SOURCES

src/nbl/asset/utils/IShaderCompiler.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,8 @@ core::smart_refctd_ptr<ICPUBuffer> IShaderCompiler::CCache::serialize() const
342342
// Might as well memcpy everything
343343
memcpy(retVal.data() + SHADER_BUFFER_SIZE_BYTES + shaderBufferSize, dumpedContainerJson.data(), dumpedContainerJsonLength);
344344

345-
return ICPUBuffer::create({ .size = retVal.size(), .data = retVal.data(), .memoryResource = new core::VectorViewNullMemoryResource(std::move(retVal)) });
345+
auto memoryResource = new core::VectorViewNullMemoryResource(std::move(retVal));
346+
return ICPUBuffer::create({ .size = retVal.size(), .data = retVal.data(), .memoryResource = core::make_smart_refctd_ptr<core::refctd_memory_resource>(memoryResource) });
346347
}
347348

348349
core::smart_refctd_ptr<IShaderCompiler::CCache> IShaderCompiler::CCache::deserialize(const std::span<const uint8_t> serializedCache)
@@ -417,7 +418,7 @@ bool nbl::asset::IShaderCompiler::CCache::SEntry::setContent(const asset::ICPUBu
417418
compressedSpirv.resize(propsSize + destLen);
418419

419420
auto memResource = new core::VectorViewNullMemoryResource(std::move(compressedSpirv));
420-
spirv = ICPUBuffer::create({ .size = propsSize + destLen, .data = memResource->data(), .memoryResource = std::move(memResource)});
421+
spirv = ICPUBuffer::create({ .size = propsSize + destLen, .data = memResource->data(), .memoryResource = core::make_smart_refctd_ptr<core::refctd_memory_resource>(memResource) });
421422

422423
return true;
423424
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (C) 2018-2024 - DevSH Graphics Programming Sp. z O.O.
2+
// This file is part of the "Nabla Engine".
3+
// For conditions of distribution and use, see copyright notice in nabla.h
4+
5+
#include "nbl/core/alloc/refctd_memory_resource.h"
6+
7+
using namespace nbl;
8+
using namespace core;
9+
10+
static smart_refctd_ptr<refctd_memory_resource> null_memory_resource = nullptr;
11+
static smart_refctd_ptr<refctd_memory_resource> default_memory_resource = nullptr;
12+
13+
smart_refctd_ptr<refctd_memory_resource> core::getNullMemoryResource()
14+
{
15+
if (!null_memory_resource)
16+
null_memory_resource = make_smart_refctd_ptr<refctd_memory_resource>(std::pmr::null_memory_resource());
17+
return null_memory_resource;
18+
}
19+
20+
smart_refctd_ptr<refctd_memory_resource> core::getDefaultMemoryResource()
21+
{
22+
if (!default_memory_resource)
23+
default_memory_resource = make_smart_refctd_ptr<refctd_memory_resource>(std::pmr::get_default_resource());
24+
return default_memory_resource;
25+
}
26+
27+
void core::setDefaultMemoryResource(smart_refctd_ptr<refctd_memory_resource> memoryResource)
28+
{
29+
default_memory_resource = memoryResource;
30+
}

src/nbl/video/utilities/ImageRegionIterator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ ImageRegionIterator::ImageRegionIterator(
9292

9393
uint64_t offsetInCPUBuffer = region.bufferOffset;
9494
uint8_t* inCpuBufferPointer = const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(srcData) + offsetInCPUBuffer);
95-
core::smart_refctd_ptr<asset::ICPUBuffer> inCPUBuffer = asset::ICPUBuffer::create({ .size = 0xdeadbeefBADC0FFEull, .data = inCpuBufferPointer }, core::adopt_memory);
95+
core::smart_refctd_ptr<asset::ICPUBuffer> inCPUBuffer = asset::ICPUBuffer::create({ .size = 0xdeadbeefBADC0FFEull, .data = inCpuBufferPointer, .memoryResource = core::getNullMemoryResource() }, core::adopt_memory);
9696
inCPUImage->setBufferAndRegions(std::move(inCPUBuffer), inCPUImageRegions);
9797
assert(inCPUImage->getBuffer());
9898
assert(inCPUImage->getRegions().size() > 0u);
@@ -392,7 +392,7 @@ bool ImageRegionIterator::advanceAndCopyToStagingBuffer(asset::IImage::SBufferCo
392392
outCpuImageRegion.imageSubresource.layerCount = core::max(regionToCopyNext.imageSubresource.layerCount, 1u);
393393

394394
uint8_t* outCpuBufferPointer = reinterpret_cast<uint8_t*>(stagingBufferPointer) + stagingBufferOffset;
395-
core::smart_refctd_ptr<asset::ICPUBuffer> outCPUBuffer = asset::ICPUBuffer::create({ .size = outCPUBufferSize, .data = outCpuBufferPointer }, core::adopt_memory);
395+
core::smart_refctd_ptr<asset::ICPUBuffer> outCPUBuffer = asset::ICPUBuffer::create({ .size = outCPUBufferSize, .data = outCpuBufferPointer, .memoryResource = core::getNullMemoryResource() }, core::adopt_memory);
396396
outCPUImage->setBufferAndRegions(std::move(outCPUBuffer), outCPUImageRegions);
397397
assert(outCPUImage->getBuffer());
398398
assert(outCPUImage->getRegions().size() > 0u);

0 commit comments

Comments
 (0)