Skip to content

Commit 82af55e

Browse files
Hydrogent: use sparse texture atlas and dynamic buffers when supported
1 parent c308f4e commit 82af55e

File tree

1 file changed

+46
-4
lines changed

1 file changed

+46
-4
lines changed

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,30 @@ static std::shared_ptr<USD_Renderer> CreateUSDRenderer(const HnRenderDelegate::C
298298
return std::make_shared<USD_Renderer>(RenderDelegateCI.pDevice, RenderDelegateCI.pRenderStateCache, RenderDelegateCI.pContext, USDRendererCI);
299299
}
300300

301+
static bool CheckSparseTextureSupport(IRenderDevice* pDevice)
302+
{
303+
const DeviceFeatures& Features = pDevice->GetDeviceInfo().Features;
304+
if (!Features.SparseResources)
305+
{
306+
return false;
307+
}
308+
309+
const SparseResourceProperties& SparseRes = pDevice->GetAdapterInfo().SparseResources;
310+
return (SparseRes.CapFlags & SPARSE_RESOURCE_CAP_FLAG_TEXTURE_2D_ARRAY_MIP_TAIL) != 0;
311+
}
312+
313+
static bool CheckSparseBufferSupport(IRenderDevice* pDevice)
314+
{
315+
const DeviceFeatures& Features = pDevice->GetDeviceInfo().Features;
316+
if (!Features.SparseResources)
317+
{
318+
return false;
319+
}
320+
321+
const SparseResourceProperties& SparseRes = pDevice->GetAdapterInfo().SparseResources;
322+
return (SparseRes.CapFlags & SPARSE_RESOURCE_CAP_FLAG_BUFFER) != 0;
323+
}
324+
301325
static RefCntAutoPtr<GLTF::ResourceManager> CreateResourceManager(const HnRenderDelegate::CreateInfo& CI)
302326
{
303327
// Initial vertex and index counts are not important as the
@@ -314,6 +338,16 @@ static RefCntAutoPtr<GLTF::ResourceManager> CreateResourceManager(const HnRender
314338
ResMgrCI.DefaultPoolDesc.VertexCount = InitialVertexCount;
315339
ResMgrCI.DefaultPoolDesc.Usage = USAGE_DEFAULT;
316340

341+
if (CheckSparseBufferSupport(CI.pDevice))
342+
{
343+
if (CI.pDevice->GetDeviceInfo().Type != RENDER_DEVICE_TYPE_D3D11)
344+
{
345+
// Direct3D11 does not support sparse index buffers
346+
ResMgrCI.IndexAllocatorCI.Desc.Usage = USAGE_SPARSE;
347+
}
348+
ResMgrCI.DefaultPoolDesc.Usage = USAGE_SPARSE;
349+
}
350+
317351
if (CI.TextureBindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_ATLAS)
318352
{
319353
Uint32 TextureAtlasDim = CI.TextureAtlasDim;
@@ -344,9 +378,18 @@ static RefCntAutoPtr<GLTF::ResourceManager> CreateResourceManager(const HnRender
344378
TextureAtlasDim = 2048;
345379
}
346380

347-
ResMgrCI.DefaultAtlasDesc.Desc.Name = "Hydrogent texture atlas";
348-
ResMgrCI.DefaultAtlasDesc.Desc.Type = RESOURCE_DIM_TEX_2D_ARRAY;
349-
ResMgrCI.DefaultAtlasDesc.Desc.Usage = USAGE_DEFAULT;
381+
ResMgrCI.DefaultAtlasDesc.Desc.Name = "Hydrogent texture atlas";
382+
ResMgrCI.DefaultAtlasDesc.Desc.Type = RESOURCE_DIM_TEX_2D_ARRAY;
383+
if (CheckSparseTextureSupport(CI.pDevice))
384+
{
385+
ResMgrCI.DefaultAtlasDesc.Desc.Usage = USAGE_SPARSE;
386+
ResMgrCI.DefaultAtlasDesc.ExtraSliceCount = 1;
387+
}
388+
else
389+
{
390+
ResMgrCI.DefaultAtlasDesc.Desc.Usage = USAGE_DEFAULT;
391+
ResMgrCI.DefaultAtlasDesc.GrowthFactor = 1.25f;
392+
}
350393
ResMgrCI.DefaultAtlasDesc.Desc.BindFlags = BIND_SHADER_RESOURCE;
351394
ResMgrCI.DefaultAtlasDesc.Desc.Width = TextureAtlasDim;
352395
ResMgrCI.DefaultAtlasDesc.Desc.Height = TextureAtlasDim;
@@ -356,7 +399,6 @@ static RefCntAutoPtr<GLTF::ResourceManager> CreateResourceManager(const HnRender
356399
// return null.
357400
ResMgrCI.DefaultAtlasDesc.Desc.ArraySize = 1;
358401
ResMgrCI.DefaultAtlasDesc.Desc.MipLevels = 6;
359-
ResMgrCI.DefaultAtlasDesc.GrowthFactor = 1.25f;
360402
ResMgrCI.DefaultAtlasDesc.MinAlignment = 64;
361403
}
362404

0 commit comments

Comments
 (0)