Class vs unique_ptr <myclass>导致Vulkan错误

时间:2016-10-19 10:55:01

标签: c++ unique-ptr vulkan

我一直在为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课程中的代码返回Queueunique_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);

queuequeue2与预期相同,但此代码再次提供result = VK_ERROR_DEVICE_LOST。我是先设置queue还是queue2并不重要。如果我删除该行:

VkQueue queue2 = m_graphicsQueue->getHandle();

(当然是断言),然后是result == VK_SUCCESS。所以,问题在于从VkQueue检索unique_ptr<Queue>值。为什么使用导致此问题的unique_ptr

1 个答案:

答案 0 :(得分:1)

一旦我打开验证并清理了所有报告的错误,程序就可以运行了。有趣的是,Vulkan验证问题完全显示为其他内容。