diff --git a/src/rendervulkan.cpp b/src/rendervulkan.cpp index 8983f7e..1a8e8d9 100644 --- a/src/rendervulkan.cpp +++ b/src/rendervulkan.cpp @@ -1104,7 +1104,7 @@ std::unique_ptr CVulkanDevice::commandBuffer() return nullptr; } - cmdBuffer = std::make_unique(this, rawCmdBuffer); + cmdBuffer = std::make_unique(this, rawCmdBuffer, queue(), queueFamily()); } else { @@ -1146,7 +1146,7 @@ uint64_t CVulkanDevice::submit( std::unique_ptr cmdBuffer) .pSignalSemaphores = &m_scratchTimelineSemaphore, }; - VkResult res = vk.QueueSubmit( queue(), 1, &submitInfo, VK_NULL_HANDLE ); + VkResult res = vk.QueueSubmit( cmdBuffer->queue(), 1, &submitInfo, VK_NULL_HANDLE ); if ( res != VK_SUCCESS ) { @@ -1206,8 +1206,8 @@ void CVulkanDevice::resetCmdBuffers(uint64_t sequence) m_pendingCmdBufs.erase(m_pendingCmdBufs.begin(), ++last); } -CVulkanCmdBuffer::CVulkanCmdBuffer(CVulkanDevice *parent, VkCommandBuffer cmdBuffer) - : m_cmdBuffer(cmdBuffer), m_device(parent) +CVulkanCmdBuffer::CVulkanCmdBuffer(CVulkanDevice *parent, VkCommandBuffer cmdBuffer, VkQueue queue, uint32_t queueFamily) + : m_cmdBuffer(cmdBuffer), m_device(parent), m_queue(queue), m_queueFamily(queueFamily) { } @@ -1572,7 +1572,7 @@ void CVulkanCmdBuffer::insertBarrier(bool flush) .oldLayout = (state.discarded || state.needsImport) ? VK_IMAGE_LAYOUT_UNDEFINED : VK_IMAGE_LAYOUT_GENERAL, .newLayout = isPresent ? presentLayout : VK_IMAGE_LAYOUT_GENERAL, .srcQueueFamilyIndex = isExport ? m_device->queueFamily() : state.needsImport ? externalQueue : VK_QUEUE_FAMILY_IGNORED, - .dstQueueFamilyIndex = isExport ? externalQueue : state.needsImport ? m_device->queueFamily() : VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = isExport ? externalQueue : state.needsImport ? m_queueFamily : m_queueFamily, .image = image->vkImage(), .subresourceRange = subResRange }; diff --git a/src/rendervulkan.hpp b/src/rendervulkan.hpp index ef049e1..9ff9e99 100644 --- a/src/rendervulkan.hpp +++ b/src/rendervulkan.hpp @@ -769,7 +769,7 @@ struct TextureState class CVulkanCmdBuffer { public: - CVulkanCmdBuffer(CVulkanDevice *parent, VkCommandBuffer cmdBuffer); + CVulkanCmdBuffer(CVulkanDevice *parent, VkCommandBuffer cmdBuffer, VkQueue queue, uint32_t queueFamily); ~CVulkanCmdBuffer(); CVulkanCmdBuffer(const CVulkanCmdBuffer& other) = delete; CVulkanCmdBuffer(CVulkanCmdBuffer&& other) = delete; @@ -802,9 +802,16 @@ private: void markDirty(CVulkanTexture *image); void insertBarrier(bool flush = false); + VkQueue queue() { return m_queue; } + uint32_t queueFamily() { return m_queueFamily; } + +private: VkCommandBuffer m_cmdBuffer; CVulkanDevice *m_device; + VkQueue m_queue; + uint32_t m_queueFamily; + // Per Use State std::unordered_map> m_textureRefs; std::unordered_map m_textureState;