diff --git a/src/emulator.h b/src/emulator.h index e1519ab3..6dadc684 100644 --- a/src/emulator.h +++ b/src/emulator.h @@ -37,6 +37,9 @@ struct VulkanQueues { u32 family_count = 0; std::vector available; std::vector graphics; + std::vector compute; + std::vector transfer; + std::vector present; std::vector family_used; }; diff --git a/src/vulkan_util.cpp b/src/vulkan_util.cpp index 18ef6b4e..dcfac166 100644 --- a/src/vulkan_util.cpp +++ b/src/vulkan_util.cpp @@ -158,7 +158,56 @@ Emulator::VulkanQueues Graphics::Vulkan::vulkanFindQueues(VkPhysicalDevice devic family++; } - // TODO finish it + u32 index = 0; + for (u32 i = 0; i < VULKAN_QUEUE_GRAPHICS_NUM; i++) { + + for (const auto& idx : qs.available) { + if (idx.is_graphics) + { + qs.family_used[qs.available.at(index).family]++; + qs.graphics.push_back(qs.available.at(index)); + qs.available.erase(qs.available.begin()+index); + break; + } + index++; + } + } + index = 0; + for (u32 i = 0; i < VULKAN_QUEUE_COMPUTE_NUM; i++) { + for (const auto& idx : qs.available) { + if (idx.is_graphics) { + qs.family_used[qs.available.at(index).family]++; + qs.compute.push_back(qs.available.at(index)); + qs.available.erase(qs.available.begin() + index); + break; + } + index++; + } + } + index = 0; + for (uint32_t i = 0; i < VULKAN_QUEUE_TRANSFER_NUM; i++) { + for (const auto& idx : qs.available) { + if (idx.is_graphics) { + qs.family_used[qs.available.at(index).family]++; + qs.transfer.push_back(qs.available.at(index)); + qs.available.erase(qs.available.begin() + index); + break; + } + index++; + } + } + index = 0; + for (uint32_t i = 0; i < VULKAN_QUEUE_PRESENT_NUM; i++) { + for (const auto& idx : qs.available) { + if (idx.is_graphics) { + qs.family_used[qs.available.at(index).family]++; + qs.present.push_back(qs.available.at(index)); + qs.available.erase(qs.available.begin() + index); + break; + } + index++; + } + } return qs; }