VulkanのC++クラスライブラリを開発しています。私はクラスを使用して問題を横切って実行したunique_ptr
は、同じクラスに対。私はVisual Studio 2015 Update 3を使ってこの作業を行ってきました。クラスvs unique_ptr <MyClass>がVulkanエラーの原因となる
私はいくつかのクラスのコードから始めて、どのように問題を説明するのかを示します。まずQueue
クラスです:Queue
かunique_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);
queue
とqueue2
は予想通り同じですが、このコードは再び= VK_ERROR_DEVICE_LOST
result
を与えます。私がqueue
またはqueue2
を最初に設定するかどうかは関係ありません。
VkQueue queue2 = m_graphicsQueue->getHandle();
(そしてもちろんのアサート、)、その後、result == VK_SUCCESS
:私は、行を削除した場合。そのため、問題はunique_ptr<Queue>
からVkQueue
の値を取得することです。この問題の原因となるのはなぜですか?unique_ptr
"なぜ私のコードは機能しませんか?" StackOverflowの話題はありません。 – Krythic
なぜ最初のクラスのクラスですか?それが本当にしているのは、正常なデフォルトのinitを提供することだけです。また、キューによってポインタを保持する必要はありません。 –
@Krythicはそれ自体ではありません。必要な振る舞いは(暗黙的ではあるが) - VkQueueラッパーを働かせているようです。コードのデモンストレーションもあります。 – krOoze