我一直在为Vulkan开发一个C ++类库。我遇到了将类vs unique_ptr
用于同一个类的问题。我一直在使用Visual Studio 2015 Update 3进行这项工作。
我将从几个类的代码开始,然后展示如何使用它们来说明问题。首先是Queue
类:
class Queue
{
public:
inline Queue() : Queue(VK_NULL_HANDLE) {}
inline explicit Queue(const VkQueue queue) : m_queue(queue) {}
inline Queue(const Queue& queue) = default;
inline Queue& operator=(const Queue& queue) = default;
inline Queue(Queue&&) = default;
inline Queue& operator=(Queue&&) = default;
inline ~Queue() = default;
inline VkQueue getHandle() const noexcept { return m_queue; }
private:
VkQueue m_queue;
};
现在我的LogicalDevice
课程中的代码返回Queue
或unique_ptr<Queue>
;
__declspec(dllexport) Queue LogicalDevice::getQueue(
const uint32_t queueFamilyIndex,
const uint32_t queueIndex) {
VkQueue queue = VK_NULL_HANDLE;
vkGetDeviceQueue(m_device, queueFamilyIndex, queueIndex, &queue);
Queue q(queue);
return q;
}
__declspec(dllexport) std::unique_ptr<Queue> LogicalDevice::getQueuePtr(
const uint32_t queueFamilyIndex,
const uint32_t queueIndex) {
VkQueue queue = VK_NULL_HANDLE;
vkGetDeviceQueue(m_device, queueFamilyIndex, queueIndex, &queue);
auto q = std::make_unique<Queue>(queue);
return q;
}
对于我的窗口,我已经声明了以下类变量:
Queue m_graphicsQ;
std::unique_ptr<Queue> m_graphicsQueue;
在窗口的初始化代码中我有:
m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0);
并在图纸代码中:
VkQueue queue = m_graphicsQ.getHandle();
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
此代码有效(结果为VK_SUCCESS
)。现在,如果我尝试使用unique_ptr
代替Queue
:
m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);
和
VkQueue queue2 = m_graphicsQueue->getHandle();
result = vkQueueSubmit(queue2, 1, &submitInfo, VK_NULL_HANDLE);
结果为VK_ERROR_DEVICE_LOST
。
在尝试调试时,我使用了以下代码:
m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0);
m_graphicsQueue = m_logicalDevice->getQueuePtr(indices.graphicsFamily, 0);
VkQueue queue2 = m_graphicsQueue->getHandle();
VkQueue queue = m_graphicsQ.getHandle();
assert(queue == queue2);
result = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
queue
和queue2
与预期相同,但此代码再次提供result
= VK_ERROR_DEVICE_LOST
。我是先设置queue
还是queue2
并不重要。如果我删除该行:
VkQueue queue2 = m_graphicsQueue->getHandle();
(当然是断言),然后是result == VK_SUCCESS
。所以,问题在于从VkQueue
检索unique_ptr<Queue>
值。为什么使用导致此问题的unique_ptr
?
答案 0 :(得分:1)
一旦我打开验证并清理了所有报告的错误,程序就可以运行了。有趣的是,Vulkan验证问题完全显示为其他内容。