Skip to content

Commit 03cf11e

Browse files
Radient: expose GPU resource pool settings in engine create info
1 parent f5c9a90 commit 03cf11e

9 files changed

Lines changed: 387 additions & 34 deletions

File tree

‎Radient/include/Assets/RadientAssetManagerImpl.hpp‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,10 @@ class RadientAssetManagerImpl final : public ObjectBase<IRadientAssetManager>
7070

7171
struct CreateInfo
7272
{
73-
RadientAssetManagerCreateInfo Assets;
74-
IThreadPool* pThreadPool = nullptr;
75-
IRenderDevice* pDevice = nullptr;
73+
RadientAssetManagerCreateInfo Assets;
74+
RadientResourceManagerCreateInfo Resources;
75+
IThreadPool* pThreadPool = nullptr;
76+
IRenderDevice* pDevice = nullptr;
7677
};
7778

7879
RadientAssetManagerImpl(IReferenceCounters* pRefCounters,

‎Radient/interface/RadientAssets.h‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,46 @@ DILIGENT_TYPED_ENUM(RADIENT_INDEX_TYPE, Uint8)
112112
// clang-format on
113113

114114

115+
/// GPU resource pool creation attributes used by the engine's asset manager.
116+
/// These settings control resource capacity, not rendering feature availability.
117+
struct RadientResourceManagerCreateInfo
118+
{
119+
/// Initial size and growth increment of each index buffer, in bytes.
120+
/// Zero selects the engine default.
121+
Uint32 IndexBufferSize DEFAULT_INITIALIZER(4u * 1024u * 1024u);
122+
123+
/// Maximum size of each index buffer, in bytes. Zero prevents growth beyond IndexBufferSize.
124+
Uint64 MaxIndexBufferSize DEFAULT_INITIALIZER(256ull * 1024ull * 1024ull);
125+
126+
/// Initial size and growth increment of the morph-target buffer, in bytes.
127+
/// Zero selects the engine default.
128+
Uint32 MorphTargetBufferSize DEFAULT_INITIALIZER(1024u * 1024u);
129+
130+
/// Maximum morph-target buffer size, in bytes. Zero prevents growth beyond MorphTargetBufferSize.
131+
Uint64 MaxMorphTargetBufferSize DEFAULT_INITIALIZER(256ull * 1024ull * 1024ull);
132+
133+
/// Vertex capacity of each new vertex pool. Zero selects the engine default.
134+
/// Rounded up to a multiple of 1024 vertices.
135+
Uint32 VertexPoolSize DEFAULT_INITIALIZER(64u * 1024u);
136+
137+
/// Starting width and height of each default texture atlas, in texels.
138+
/// Zero selects the engine default.
139+
Uint32 TextureAtlasSize DEFAULT_INITIALIZER(2048);
140+
141+
/// Maximum mip-level-0 size of one atlas slice, in bytes. Zero disables this limit.
142+
/// Both dimensions are halved until the slice fits, without reducing either below 16.
143+
/// The minimum dimensions take precedence when the limit is too small.
144+
Uint64 TextureAtlasMipLevel0Size DEFAULT_INITIALIZER(16ull * 1024ull * 1024ull);
145+
146+
/// Initial number of slices in each texture atlas. Zero defers storage allocation.
147+
Uint32 TextureAtlasSlices DEFAULT_INITIALIZER(1);
148+
149+
/// Maximum number of slices in each texture atlas. Zero selects the engine default.
150+
Uint32 TextureAtlasMaxSlices DEFAULT_INITIALIZER(2048);
151+
};
152+
typedef struct RadientResourceManagerCreateInfo RadientResourceManagerCreateInfo;
153+
154+
115155
/// Asset manager description.
116156
struct RadientAssetManagerDesc
117157
{

‎Radient/interface/RadientEngine.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ struct RadientEngineCreateInfo
5656
/// Number of worker threads for the internal thread pool.
5757
/// Zero lets Radient choose a default based on the host system.
5858
Uint32 WorkerThreadCount DEFAULT_INITIALIZER(0);
59+
60+
/// GPU resource pool creation attributes. Used when the backend has a native device.
61+
RadientResourceManagerCreateInfo Resources DEFAULT_INITIALIZER({});
5962
};
6063
typedef struct RadientEngineCreateInfo RadientEngineCreateInfo;
6164

‎Radient/src/Assets/RadientAssetManagerImpl.cpp‎

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,6 @@ namespace Diligent
5555
namespace
5656
{
5757

58-
constexpr Uint64 RadientDefaultIndexBufferSize = 16ull * 1024ull * 1024ull;
59-
constexpr Uint64 RadientDefaultMaxIndexBufferSize = 256ull * 1024ull * 1024ull;
60-
constexpr Uint64 RadientDefaultMorphTargetBufferSize = 1024ull * 1024ull;
61-
constexpr Uint64 RadientDefaultMaxMorphTargetBufferSize = 256ull * 1024ull * 1024ull;
62-
constexpr Uint32 RadientDefaultVertexPoolSize = 1024u * 1024u;
63-
constexpr Uint32 RadientDefaultTextureAtlasSize = 2048u;
64-
constexpr Uint64 RadientDefaultTextureAtlasMipLevel0Size = 16ull * 1024ull * 1024ull;
65-
constexpr Uint32 RadientDefaultTextureAtlasSlices = 1u;
66-
constexpr Uint32 RadientDefaultTextureAtlasMaxSlices = 2048u;
67-
6858
static constexpr INTERFACE_ID IID_SceneAssetImpl = {0xb59806f1, 0xa08a, 0x4dff, {0xb0, 0x37, 0x84, 0x75, 0xd6, 0xfd, 0x7f, 0x1b}};
6959

7060
struct ImportedSceneStorage
@@ -196,52 +186,52 @@ struct ImportedSceneStorage
196186
mutable std::atomic<RADIENT_STATUS> GPUResourceStatus{RADIENT_STATUS_OK};
197187
};
198188

199-
GLTF::ResourceManager::CreateInfo CreateResourceManagerInfo()
189+
GLTF::ResourceManager::CreateInfo CreateResourceManagerInfo(const RadientResourceManagerCreateInfo& ResourceCI)
200190
{
201191
GLTF::ResourceManager::CreateInfo CreateInfo;
202192

203193
CreateInfo.IndexAllocatorCI.Desc.Name = "Radient index pool";
204-
CreateInfo.IndexAllocatorCI.Desc.Size = RadientDefaultIndexBufferSize;
194+
CreateInfo.IndexAllocatorCI.Desc.Size = ResourceCI.IndexBufferSize;
205195
CreateInfo.IndexAllocatorCI.Desc.Usage = USAGE_DEFAULT;
206196
CreateInfo.IndexAllocatorCI.Desc.BindFlags = BIND_INDEX_BUFFER;
207-
CreateInfo.IndexAllocatorCI.ExpansionSize = static_cast<Uint32>(RadientDefaultIndexBufferSize);
208-
CreateInfo.IndexAllocatorCI.MaxSize = RadientDefaultMaxIndexBufferSize;
197+
CreateInfo.IndexAllocatorCI.ExpansionSize = ResourceCI.IndexBufferSize;
198+
CreateInfo.IndexAllocatorCI.MaxSize = ResourceCI.MaxIndexBufferSize;
209199

210200
CreateInfo.MorphTargetAllocatorCI.Desc.Name = "Radient morph target buffer";
211-
CreateInfo.MorphTargetAllocatorCI.Desc.Size = RadientDefaultMorphTargetBufferSize;
201+
CreateInfo.MorphTargetAllocatorCI.Desc.Size = ResourceCI.MorphTargetBufferSize;
212202
CreateInfo.MorphTargetAllocatorCI.Desc.Usage = USAGE_DEFAULT;
213203
CreateInfo.MorphTargetAllocatorCI.Desc.BindFlags = BIND_SHADER_RESOURCE;
214204
CreateInfo.MorphTargetAllocatorCI.Desc.Mode = BUFFER_MODE_STRUCTURED;
215205
CreateInfo.MorphTargetAllocatorCI.Desc.ElementByteStride = sizeof(Float32);
216-
CreateInfo.MorphTargetAllocatorCI.ExpansionSize = static_cast<Uint32>(RadientDefaultMorphTargetBufferSize);
217-
CreateInfo.MorphTargetAllocatorCI.MaxSize = RadientDefaultMaxMorphTargetBufferSize;
206+
CreateInfo.MorphTargetAllocatorCI.ExpansionSize = ResourceCI.MorphTargetBufferSize;
207+
CreateInfo.MorphTargetAllocatorCI.MaxSize = ResourceCI.MaxMorphTargetBufferSize;
218208

219209
CreateInfo.DefaultPoolDesc.Name = "Radient vertex pool";
220-
CreateInfo.DefaultPoolDesc.VertexCount = RadientDefaultVertexPoolSize;
210+
CreateInfo.DefaultPoolDesc.VertexCount = ResourceCI.VertexPoolSize;
221211
CreateInfo.DefaultPoolDesc.Usage = USAGE_DEFAULT;
222212
CreateInfo.DefaultPoolDesc.Mode = BUFFER_MODE_UNDEFINED;
223213

224214
CreateInfo.DefaultAtlasDesc.Desc.Name = "Radient texture atlas";
225215
CreateInfo.DefaultAtlasDesc.Desc.Type = RESOURCE_DIM_TEX_2D_ARRAY;
226-
CreateInfo.DefaultAtlasDesc.Desc.Width = RadientDefaultTextureAtlasSize;
227-
CreateInfo.DefaultAtlasDesc.Desc.Height = RadientDefaultTextureAtlasSize;
216+
CreateInfo.DefaultAtlasDesc.Desc.Width = ResourceCI.TextureAtlasSize;
217+
CreateInfo.DefaultAtlasDesc.Desc.Height = ResourceCI.TextureAtlasSize;
228218
CreateInfo.DefaultAtlasDesc.Desc.MipLevels = 0;
229-
CreateInfo.DefaultAtlasDesc.Desc.ArraySize = RadientDefaultTextureAtlasSlices;
219+
CreateInfo.DefaultAtlasDesc.Desc.ArraySize = ResourceCI.TextureAtlasSlices;
230220
CreateInfo.DefaultAtlasDesc.Desc.Format = TEX_FORMAT_RGBA8_TYPELESS;
231221
CreateInfo.DefaultAtlasDesc.Desc.Usage = USAGE_DEFAULT;
232222
CreateInfo.DefaultAtlasDesc.Desc.BindFlags = BIND_SHADER_RESOURCE;
233-
CreateInfo.DefaultAtlasDesc.MaxSliceCount = RadientDefaultTextureAtlasMaxSlices;
234-
CreateInfo.DefaultAtlasMipLevel0Size = RadientDefaultTextureAtlasMipLevel0Size;
223+
CreateInfo.DefaultAtlasDesc.MaxSliceCount = ResourceCI.TextureAtlasMaxSlices;
224+
CreateInfo.DefaultAtlasMipLevel0Size = ResourceCI.TextureAtlasMipLevel0Size;
235225

236226
return CreateInfo;
237227
}
238228

239-
RefCntAutoPtr<GLTF::ResourceManager> CreateRadientResourceManager(IRenderDevice* pDevice)
229+
RefCntAutoPtr<GLTF::ResourceManager> CreateRadientResourceManager(IRenderDevice* pDevice, const RadientResourceManagerCreateInfo& ResourceCI)
240230
{
241231
if (pDevice == nullptr)
242232
return {};
243233

244-
return GLTF::ResourceManager::Create(pDevice, CreateResourceManagerInfo());
234+
return GLTF::ResourceManager::Create(pDevice, CreateResourceManagerInfo(ResourceCI));
245235
}
246236

247237
RefCntAutoPtr<IGPUUploadManager> CreateRadientGPUUploadManager(IRenderDevice* pDevice)
@@ -404,7 +394,7 @@ RadientAssetManagerImpl::RadientAssetManagerImpl(IReferenceCounters* pRefCounter
404394
m_pThreadPool{CreateInfo.pThreadPool},
405395
m_pDevice{CreateInfo.pDevice},
406396
m_pAssetResolver{GetRadientAssetResolverOrDefault(CreateInfo.Assets.pAssetResolver)},
407-
m_pResourceManager{CreateRadientResourceManager(CreateInfo.pDevice)},
397+
m_pResourceManager{CreateRadientResourceManager(CreateInfo.pDevice, CreateInfo.Resources)},
408398
m_pUploadManager{CreateRadientGPUUploadManager(CreateInfo.pDevice)},
409399
m_pTextureManager{
410400
RadientTextureAssetManager::Create(

‎Radient/src/Core/RadientEngineImpl.cpp‎

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@
2929
#include "Animation/RadientAnimationRegistryImpl.hpp"
3030
#include "Assets/RadientAssetManagerImpl.hpp"
3131
#include "Core/RadientBackendImpl.hpp"
32+
#include "Core/RadientValidation.hpp"
3233
#include "Render/RadientRendererImpl.hpp"
3334
#include "Scene/RadientSceneImpl.hpp"
3435
#include "Import/RadientSceneImporterImpl.hpp"
3536
#include "Scene/RadientSceneWriterImpl.hpp"
3637

38+
#include "Align.hpp"
3739
#include "Errors.hpp"
3840
#include "ThreadPool.hpp"
3941

@@ -53,6 +55,41 @@ size_t GetDefaultRadientWorkerThreadCount()
5355
return std::max(1u, HardwareThreads != 0 ? HardwareThreads - 1u : 1u);
5456
}
5557

58+
bool NormalizeResourceManagerCreateInfo(RadientResourceManagerCreateInfo& ResourceCI)
59+
{
60+
constexpr RadientResourceManagerCreateInfo Defaults{};
61+
if (ResourceCI.IndexBufferSize == 0)
62+
ResourceCI.IndexBufferSize = Defaults.IndexBufferSize;
63+
if (ResourceCI.MorphTargetBufferSize == 0)
64+
ResourceCI.MorphTargetBufferSize = Defaults.MorphTargetBufferSize;
65+
if (ResourceCI.VertexPoolSize == 0)
66+
ResourceCI.VertexPoolSize = Defaults.VertexPoolSize;
67+
if (ResourceCI.TextureAtlasSize == 0)
68+
ResourceCI.TextureAtlasSize = Defaults.TextureAtlasSize;
69+
if (ResourceCI.TextureAtlasMaxSlices == 0)
70+
ResourceCI.TextureAtlasMaxSlices = Defaults.TextureAtlasMaxSlices;
71+
72+
constexpr Uint32 VertexPoolAlignment = 1024;
73+
if (!RadientValidation::IsSumRepresentable<Uint32>(ResourceCI.VertexPoolSize, VertexPoolAlignment - 1u))
74+
{
75+
LOG_ERROR_MESSAGE("Radient resource manager VertexPoolSize (", ResourceCI.VertexPoolSize,
76+
") cannot be rounded up to a multiple of ", VertexPoolAlignment, " without overflowing Uint32.");
77+
return false;
78+
}
79+
ResourceCI.VertexPoolSize = AlignUp(ResourceCI.VertexPoolSize, VertexPoolAlignment);
80+
81+
constexpr Uint64 AtlasMipLevel0SizeAlignment = 64ull * 1024ull;
82+
if (!RadientValidation::IsSumRepresentable<Uint64>(ResourceCI.TextureAtlasMipLevel0Size, AtlasMipLevel0SizeAlignment - 1u))
83+
{
84+
LOG_ERROR_MESSAGE("Radient resource manager TextureAtlasMipLevel0Size (", ResourceCI.TextureAtlasMipLevel0Size,
85+
") cannot be rounded up to a multiple of ", AtlasMipLevel0SizeAlignment, " bytes without overflowing Uint64.");
86+
return false;
87+
}
88+
ResourceCI.TextureAtlasMipLevel0Size = AlignUp(ResourceCI.TextureAtlasMipLevel0Size, AtlasMipLevel0SizeAlignment);
89+
90+
return true;
91+
}
92+
5693
} // namespace
5794

5895
RadientEngineImpl::RadientEngineImpl(IReferenceCounters* pRefCounters, const RadientEngineCreateInfo& CreateInfo) :
@@ -76,6 +113,7 @@ RadientEngineImpl::RadientEngineImpl(IReferenceCounters* pRefCounters, const Rad
76113

77114
RadientAssetManagerImpl::CreateInfo AssetManagerCI{};
78115
AssetManagerCI.Assets = CreateInfo.Assets;
116+
AssetManagerCI.Resources = CreateInfo.Resources;
79117
AssetManagerCI.pThreadPool = m_pThreadPool;
80118
AssetManagerCI.pDevice = m_pBackend != nullptr ? m_pBackend->GetNativeDevice() : nullptr;
81119
m_pAssetManager = RadientAssetManagerImpl::Create(AssetManagerCI);
@@ -234,7 +272,11 @@ RADIENT_STATUS DILIGENT_GLOBAL_FUNCTION(CreateRadientEngine)(const RadientEngine
234272
DEV_CHECK_ERR(*ppEngine == nullptr, "Output engine pointer must be null. Overwriting a non-null output pointer may result in memory leaks.");
235273
*ppEngine = nullptr;
236274

237-
RefCntAutoPtr<IRadientEngine> pEngine = RadientEngineImpl::Create(EngineCI);
275+
RadientEngineCreateInfo NormalizedCI = EngineCI;
276+
if (NormalizedCI.Backend.pDevice != nullptr && !NormalizeResourceManagerCreateInfo(NormalizedCI.Resources))
277+
return RADIENT_STATUS_INVALID_ARGUMENT;
278+
279+
RefCntAutoPtr<IRadientEngine> pEngine = RadientEngineImpl::Create(NormalizedCI);
238280
*ppEngine = pEngine.Detach();
239281
return RADIENT_STATUS_OK;
240282
}

‎Tests/IncludeTest/Radient/RadientEngineH_test.c‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,18 @@ void RadientEngine_C_TestMacros(IRadientEngine* pEngine)
6262

6363
void RadientEngine_C_TestCreateFunction(void)
6464
{
65-
RadientEngineCreateInfo EngineCI = {0};
66-
IRadientEngine* pEngine = 0;
67-
RADIENT_STATUS Status = Diligent_CreateRadientEngine(&EngineCI, &pEngine);
65+
RadientEngineCreateInfo EngineCI = {0};
66+
EngineCI.Resources.IndexBufferSize = 4u * 1024u * 1024u;
67+
EngineCI.Resources.MaxIndexBufferSize = 256ull * 1024ull * 1024ull;
68+
EngineCI.Resources.MorphTargetBufferSize = 1024u * 1024u;
69+
EngineCI.Resources.MaxMorphTargetBufferSize = 256ull * 1024ull * 1024ull;
70+
EngineCI.Resources.VertexPoolSize = 64u * 1024u;
71+
EngineCI.Resources.TextureAtlasSize = 2048;
72+
EngineCI.Resources.TextureAtlasMipLevel0Size = 16ull * 1024ull * 1024ull;
73+
EngineCI.Resources.TextureAtlasSlices = 1;
74+
EngineCI.Resources.TextureAtlasMaxSlices = 2048;
75+
IRadientEngine* pEngine = 0;
76+
RADIENT_STATUS Status = Diligent_CreateRadientEngine(&EngineCI, &pEngine);
6877

6978
(void)pEngine;
7079
(void)Status;

‎Tests/IncludeTest/Radient/RadientEngineH_test.cpp‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@
2626

2727
#include "Radient/interface/RadientEngine.h"
2828

29+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.IndexBufferSize == 4u * 1024u * 1024u, "Resource default changed");
30+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.MaxIndexBufferSize == 256ull * 1024ull * 1024ull, "Resource default changed");
31+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.MorphTargetBufferSize == 1024u * 1024u, "Resource default changed");
32+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.MaxMorphTargetBufferSize == 256ull * 1024ull * 1024ull, "Resource default changed");
33+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.VertexPoolSize == 64u * 1024u, "Resource default changed");
34+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.TextureAtlasSize == 2048, "Resource default changed");
35+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.TextureAtlasMipLevel0Size == 16ull * 1024ull * 1024ull, "Resource default changed");
36+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.TextureAtlasSlices == 1, "Resource default changed");
37+
static_assert(Diligent::RadientEngineCreateInfo{}.Resources.TextureAtlasMaxSlices == 2048, "Resource default changed");
38+
2939
void RadientEngine_CPP_UseAnimationRegistry(Diligent::IRadientEngine* pEngine,
3040
Diligent::IRadientScene* pScene)
3141
{

0 commit comments

Comments
 (0)