Vulkan® 内存分配器
VMA 是我们单文件头、MIT 许可的 C++ 库,用于轻松高效地为您的 Vulkan® 游戏和应用程序管理内存分配。
在我们关于解决密集几何问题的博客中,我们描述了AMD开发的块状几何压缩技术——密集几何格式 (DGF),它将直接支持未来的GPU架构。
我们现在正在发布一个临时的Vulkan®扩展VK_AMDX_dense_geometry_format,它允许DGF数据直接提供给加速结构构建,消除了单独解码步骤带来的性能和内存成本。在具有原生DGF支持的硬件上,该扩展将显著提高BLAS构建时间,并大幅降低BLAS内存占用。
该扩展非常简单。当应用程序想要使用预压缩的DGF数据构建加速结构时,它会将VkAccelerationStructureGeometryKHR结构体的geometryType成员设置为VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX。
typedef enum VkGeometryTypeKHR { VK_GEOMETRY_TYPE_TRIANGLES_KHR = 0, VK_GEOMETRY_TYPE_AABBS_KHR = 1, VK_GEOMETRY_TYPE_INSTANCES_KHR = 2, ...// Provided by VK_AMDX_dense_geometry_format VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX = 1000478000, ...} VkGeometryTypeKHR;然后,通过将其pNext链中附加一个VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX来扩展VkAccelerationStructureGeometryKHR结构体。
// Provided by VK_AMDX_dense_geometry_formattypedef struct VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX { VkStructureType sType; const void* pNext; VkDeviceOrHostAddressConstKHR compressedData; VkDeviceSize dataSize; uint32_t numTriangles; uint32_t numVertices; uint32_t maxPrimitiveIndex; uint32_t maxGeometryIndex; VkCompressedTriangleFormatAMDX format;} VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX;您可以通过使用DGF SDK中的示例编码器(DGFTester.exe)在压缩数据时保存值,
c:\DGFSDK\build\DGFSDK\DGFTester\Debug>DGFTester.exe teapot.obj --dump-bin teapot.dgfDGFBaker configuration: Cluster face limit: 128 Cluster vert limit: 256 Bit width : 16 Packer : SAHLoading obj file: teapot.objModel size: 4690 verts 9128 tris 0 materialsInput size: 0.16MBBaking DGF blocks...Conversion took: 47.50ms491 DGF blocks (0.00% palette)6.8852 B/tri (2.64:1)8953 block vertices, 9128 block triangles (0.98 V/Tri)18.59 Tris/Block18.23 Verts/BlockVertex duplication factor: 1.91Vertex duplication cost per byte: 0.47B/TriSAH is: 2.016384Blocks per cluster: Min: 2 Max: 9 Mean: 4.63Tris per cluster: Min: 50 Max: 127 Mean: 86.11Validating DGF blocks...Dumping...Wrote: teapot.dgfClean exit或者在运行时使用DGF SDK中的类似代码片段从DGF数据中提取值来填充VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX的成员。
{ m_sumBlockTris = 0; m_sumBlockVerts = 0; m_maxPrimIndex = 0; m_maxGeomIndex = 0;
const auto numBlocks = GetNumDGFBlocks(); for (size_t block = 0; block < numBlocks; block++) { const uint8_t* pBlock = m_blocks.data() + block * DGF::BLOCK_SIZE;
DGF::MetaData meta; DGF::DecodeMetaData(&meta, pBlock);
uint8_t opaqueFlags[DGF::MAX_TRIS]; uint32_t geomID[DGF::MAX_TRIS]; DGF::DecodeGeomIDs(geomID, opaqueFlags, pBlock);
for (size_t i=0; i<meta.numTris; i++) m_maxGeomIndex = std::max(m_maxGeomIndex, geomID[i]);
m_maxPrimIndex = std::max(m_maxPrimIndex, meta.primIDBase + (meta.numTris - 1));
m_sumBlockTris += meta.numTris; m_sumBlockVerts += meta.numVerts; }}此扩展的支持最初在AMD Software: Adrenalin Edition™ 25.10.25.02预览驱动程序中提供,之后将在即将推出的AMD Software: Adrenalin Edition驱动程序中提供。
还有一个简单的示例应用程序展示了该扩展的用法。

要开始使用该扩展,请查看以下资源:
加入AMD开发者社区Discord服务器,与开发者同行和AMD员工在“GAME DEV BOARDS_”版块交流本次发布内容。
第三方网站链接仅为方便用户提供,除非另有明确说明,AMD不对任何此类链接网站的内容负责,且不暗示任何认可。GD-98
Khronos和Vulkan是Khronos Group Inc.的注册商标。