@@ -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+
301325static 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