2016-10-19 22 views
1

VulkanのC++クラスライブラリを開発しています。私はクラスを使用して問題を横切って実行したunique_ptrは、同じクラスに対。私はVisual Studio 2015 Update 3を使ってこの作業を行ってきました。クラスvs unique_ptr <MyClass>がVulkanエラーの原因となる

私はいくつかのクラスのコードから始めて、どのように問題を説明するのかを示します。まずQueueクラスです:Queueunique_ptr<Queue>のいずれかを返す私のLogicalDeviceクラスから

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; 
}; 

、今のコードでは、私の窓のために

__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; 
} 

、私は以下のクラス変数を宣言している:

m_graphicsQ = m_logicalDevice->getQueue(indices.graphicsFamily, 0); 

と描画コードで:

私が持っているウィンドウの初期化コードで

Queue m_graphicsQ; 
std::unique_ptr<Queue> m_graphicsQueue; 

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は予想通り同じですが、このコードは再び= VK_ERROR_DEVICE_LOSTresultを与えます。私がqueueまたはqueue2を最初に設定するかどうかは関係ありません。

VkQueue queue2 = m_graphicsQueue->getHandle(); 

(そしてもちろんのアサート、)、その後、result == VK_SUCCESS:私は、行を削除した場合。そのため、問題はunique_ptr<Queue>からVkQueueの値を取得することです。この問題の原因となるのはなぜですか?unique_ptr

+0

"なぜ私のコードは機能しませんか?" StackOverflowの話題はありません。 – Krythic

+2

なぜ最初のクラスのクラスですか?それが本当にしているのは、正常なデフォルトのinitを提供することだけです。また、キューによってポインタを保持する必要はありません。 –

+1

@Krythicはそれ自体ではありません。必要な振る舞いは(暗黙的ではあるが) - VkQueueラッパーを働かせているようです。コードのデモンストレーションもあります。 – krOoze

答えて

1

私が検証を有効にし、報告されたすべてのエラーを解決すると、プログラムが機能しました。 Vulkanの検証問題が他の何かのものとして完全に現れるのは興味深いことです。

+0

疑わしい。 ;;それは面白いparticualryではありません。それは「未定義の行動」が意味するものです。そしてなぜバリデーションレイヤーが必要なのですか?実際にあなたは 'VK_ERROR_DEVICE_LOST'を手に入れてうれしいです。運転手が何も起こっていないふりをして、あなたは今年の誤りの年を発見するでしょう。 – krOoze

関連する問題