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原理与实战—铸造渲染核武器—基石篇》

猜你喜欢

转载自blog.csdn.net/weixin_50523841/article/details/122482508