创建VkCommandPool。
在vulkan中,绘制图元并不是通过调用函数的接口来实现的,而是通过提交绘制命令来实现绘制。
将绘制命令记录在指令缓冲区,然后提交给队列,在绘制时直接提交执行就可以了。
先在SceneWidget.h中添加创建VkCommandPool的函数:bool CreateCommandPool();再添加一个成员变量,保存生成的commandPool:VkCommandPool m_commandPool = VK_NULL_HANDLE;
在SceneWidget.cpp中添加bool CreateCommandPool();函数的实现。还是先写实现函数,然后补齐参数:
VkResult result = vkCreateCommandPool();
第一个参数:VkDevice device的值为m_device。
第二个参数:const VkCommandPoolCreateInfo* pCreateInfo,这里需要补一个结构的定义:VkCommandPoolCreateInfo createInfo = {};传入createInfo的引用。
第三个参数:const VkAllocationCallbacks* pAllocator还是不指定,赋值为nullptr。
第四个参数:VkCommandPool* pCommandPool 传入刚添的成员变量m_commandPool的引用。
补齐createInfo的属性值:
createInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;这个数据结构的枚举值。
createInfo.pNext = nullptr;不用扩展,所以还是nullptr。
createInfo.flags;保持默认就行。
createInfo.queueFamilyIndex = m_index;使用之前已经找到的值:m_index。
具体函数实现如下:
分别在SceneWidget::Init中调用,和在SceneWidget::UnInit中清理资源:
清理函数:
vkDestroyCommandPool(m_device, m_commandPool, nullptr)
运行代码:
没有报错误信息:)。