diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp index 5b014bbda8a4aea0c765088766fb6c734222ea6f..29ac45938cdd2a32a0344b877fcf2b7bbc9f762e 100644 --- a/projects/first_triangle/src/main.cpp +++ b/projects/first_triangle/src/main.cpp @@ -8,8 +8,8 @@ int main(int argc, const char** argv) { vkcv::Context context = vkcv::Context::create( applicationName, VK_MAKE_VERSION(0, 0, 1), - 20, - {vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eTransfer}, + 2, + {vk::QueueFlagBits::eTransfer}, {}, {"VK_KHR_swapchain"} ); diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp index ce94145aebf605ea108f7e96cac7cccd0b9fd480..0e1ad06c9c2abb1b9e9ccef42985a9adf5dd7c1c 100644 --- a/src/vkcv/Context.cpp +++ b/src/vkcv/Context.cpp @@ -10,8 +10,8 @@ namespace vkcv { - Context::Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device) - : m_instance(instance), m_physicalDevice(physicalDevice), m_device(device) + Context::Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device, vk::Queue graphicsqueue, vk::Queue computequeue, vk::Queue transferqueue) + : m_instance(instance), m_physicalDevice(physicalDevice), m_device(device), m_graphicsqueue(graphicsqueue), m_transferqueue(transferqueue), m_computequeue(computequeue) {} Context::~Context() { @@ -125,14 +125,24 @@ namespace vkcv { vk::Device device = physicalDevice.createDevice(deviceCreateInfo); - // TODO: implement device.getQueue() to access the queues, if neede - //std::vector<vk::QueueFamilyProperties> queueFamilyProperties = physicalDevice.getQueueFamilyProperties(); - //uint32_t graphicsQueueFamilyIndex = vkcv::findGraphicsQueueFamilyIndex( queueFamilyProperties ); - // for(uint32_t i = 0; true; i++){ - // vk::Queue graphicsQueue = device.getQueue( graphicsQueueFamilyIndex, i ); - // } - - return Context(instance, physicalDevice, device); + uint32_t graphicsQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eGraphics}, qCreateInfos, physicalDevice); + if(graphicsQueueFamilyIndex == -1){ + throw std::runtime_error("It is not possible to access another queue as a graphics queue."); + } + uint32_t computeQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eCompute}, qCreateInfos, physicalDevice); + if(computeQueueFamilyIndex == -1){ + throw std::runtime_error("It is not possible to access another queue as a compute queue."); + } + uint32_t transferQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eTransfer}, qCreateInfos, physicalDevice); + if(transferQueueFamilyIndex == -1){ + throw std::runtime_error("It is not possible to access another queue as a transfer queue."); + } + vk::Queue graphicsQueue = device.getQueue( graphicsQueueFamilyIndex, 0 ); + vk::Queue computeQueue = device.getQueue(computeQueueFamilyIndex,1); + vk::Queue transferQueue = device.getQueue(transferQueueFamilyIndex, 2); + + + return Context(instance, physicalDevice, device, graphicsQueue, transferQueue, computeQueue); } const vk::Instance& Context::getInstance() const { @@ -260,10 +270,16 @@ namespace vkcv { return extensions; } - uint32_t Context::findGraphicsQueueFamilyIndex(uint32_t queueCount, std::vector<vk::DeviceQueueCreateInfo> &createInfos){ - for(auto createInfo: createInfos){ - std::cout << createInfo.queueCount << std::endl; + int Context::findQueueFamilyIndex(vk::QueueFlagBits flag, std::vector<vk::DeviceQueueCreateInfo> &createInfos, vk::PhysicalDevice &device){ + std::vector<vk::QueueFamilyProperties> queueFamilyProperties = device.getQueueFamilyProperties(); + for (auto i = createInfos.rbegin(); i != createInfos.rend(); ++i ) { + auto createInfo = *i; + int index = createInfo.queueFamilyIndex; + if(static_cast<uint32_t>(queueFamilyProperties[index].queueFlags & flag) != 0){ + std::cout << "Queue count: " << index << std::endl; + return index; + } } - return 0; + return -1; } } diff --git a/src/vkcv/Context.hpp b/src/vkcv/Context.hpp index bcfb648bbc2e2840551c8d1fe1c014389fef6e47..0237684a9af5dbbab7f393ecc40a312e7bc06ac5 100644 --- a/src/vkcv/Context.hpp +++ b/src/vkcv/Context.hpp @@ -14,6 +14,9 @@ namespace vkcv { vk::Instance m_instance; vk::PhysicalDevice m_physicalDevice; vk::Device m_device; + vk::Queue m_graphicsqueue; + vk::Queue m_computequeue; + vk::Queue m_transferqueue; /** * Constructor of #Context requires an @p instance, a @p physicalDevice and a @p device. @@ -22,7 +25,7 @@ namespace vkcv { * @param physicalDevice Vulkan-PhysicalDevice * @param device Vulkan-Device */ - Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device); + Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device, vk::Queue graphicsqueue, vk::Queue computequeue, vk::Queue transferqueue); public: /** @@ -145,7 +148,15 @@ namespace vkcv { */ static std::vector<vk::DeviceQueueCreateInfo> getQueueCreateInfos(vk::PhysicalDevice& physicalDevice, uint32_t queueCount, std::vector<float>& qPriorities, std::vector<vk::QueueFlagBits> &queueFlags); - static uint32_t findGraphicsQueueFamilyIndex(uint32_t queueCount, std::vector<vk::DeviceQueueCreateInfo> &createInfos); + /** + * @brief finds an queue family index that fits with the given queue flags to create a queue handle + * @param flag The given flag that specifies as which queue type the accessed queue should be treated + * @param createInfos The createInfos of the created queues depending on the logical device + * @param device The physical with which the queue families can be accessed + * @return a fitting queue family index + */ + static int findQueueFamilyIndex(vk::QueueFlagBits flag, std::vector<vk::DeviceQueueCreateInfo> &createInfos, vk::PhysicalDevice &device); + }; } diff --git a/src/vkcv/SwapChain.cpp b/src/vkcv/SwapChain.cpp index ceee227ef0748538d4ea731ac7487447aa69a340..e05c672e052918b8043ceec8efbe241b08594190 100644 --- a/src/vkcv/SwapChain.cpp +++ b/src/vkcv/SwapChain.cpp @@ -138,4 +138,4 @@ namespace vkcv { m_context->getInstance().destroySurfaceKHR( m_surface ); } -} \ No newline at end of file +}