Vulkan系列教程—VMA教程—用户数据

Posted 赵新政

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan系列教程—VMA教程—用户数据相关的知识,希望对你有一定的参考价值。

前言

本文为Vulkan® Memory Allocator系列系列教程,定时更新,请大家关注。如果需要深入学习Vulkan的同学,可以点击后文课程链接,学习链接

一、Allocation User Data(用户数据)

你可以在分配Allocation的时候,带上自己的数据,比如,为了Debugging的目的。为了达到这个目的,当创建Allocation的时候,我们需要填写 VmaAllocationCreateInfo::pUserData 。这是一个void的指针。你可以传一些数据进去,比如一个指针、一些handle、index、key、有序数据的序号或者其他的关联这个Allocation的数据。

代码如下(示例):

VkBufferCreateInfo bufferInfo =  VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO ;
// Fill bufferInfo...
 
MyBufferMetadata* pMetadata = CreateBufferMetadata();
 
VmaAllocationCreateInfo allocCreateInfo = ;
allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
allocCreateInfo.pUserData = pMetadata;
 
VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocCreateInfo, &buffer, &allocation, nullptr);

这个指针会在 创建完毕Allocation之后,从VmaAllocationInfo::pUserData中取出来:

代码如下(示例):

VmaAllocationInfo allocInfo;
vmaGetAllocationInfo(allocator, allocation, &allocInfo);
MyBufferMetadata* pMetadata = (MyBufferMetadata*)allocInfo.pUserData;

它也可以被vmaSetAllocationUserData给改变。
作为用户数据(非零或者非null),可以通过 vmaBuildStatsString被以JSON的形式打印出来。

二、Allocation Name

当使用pUserData传输用户数据的时候,给Allocation起名字这件事儿就可以做了,其实就是把名字传进去。
为了使用这个功能,给设置 VmaAllocationCreateInfo::flags设置VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT这个标识符。
VmaAllocationCreateInfo::pUserData或者 **vmaSetAllocationUserData()**传进来的参数,就是我们要用的字符串。这个字符串必须是以“\\0“结尾的字符串。VMA会在内部对字符串内容进行拷贝,所以你传进来的字符串没必要在整个生命周期都存在。传入完毕后,你大可以delete掉它。

代码如下(示例):

VkImageCreateInfo imageInfo =  VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO ;
// Fill imageInfo...
 
std::string imageName = "Texture: ";
imageName += fileName;
 
VmaAllocationCreateInfo allocCreateInfo = ;
allocCreateInfo.usage = VMA_MEMORY_USAGE_GPU_ONLY;
allocCreateInfo.flags = VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT;
allocCreateInfo.pUserData = imageName.c_str();
 
VkImage image;
VmaAllocation allocation;
vmaCreateImage(allocator, &imageInfo, &allocCreateInfo, &image, &allocation, nullptr);

注意:
分配完毕之后,拿出来的pUserData将会于你传入的string中的字符串指针不是同一个,因为已经在内部重新new了一个字符串了;

代码如下(示例):

VmaAllocationInfo allocInfo;
vmaGetAllocationInfo(allocator, allocation, &allocInfo);
const char* imageName = (const char*)allocInfo.pUserData;
printf("Image name: %s\\n", imageName);

这个名字也会在调用 vmaBuildStatsString的时候被打印出来。


总结

以上就是今天的内容,大家对于vulkan的学习,也可以参考我出品的vulkan系列教程,下面给大家贴出链接。
请大家移步CSDN站内进行学习:

CSDN课程链接《Vulkan原理与实战—铸造渲染核武器—基石篇》

以上是关于Vulkan系列教程—VMA教程—用户数据的主要内容,如果未能解决你的问题,请参考以下文章

Vulkan系列教程—VMA教程—用户数据

Vulkan系列教程—VMA教程—用户自定义内存池

Vulkan系列教程—VMA教程—用户自定义内存池

Vulkan系列教程—VMA教程—用户自定义内存池

Vulkan系列教程—VMA教程—Defragmentation(碎片整理)

Vulkan系列教程—VMA教程—Defragmentation(碎片整理)