Skip to content
Snippets Groups Projects
Commit 532c53a9 authored by Katharina Krämer's avatar Katharina Krämer
Browse files

[#16] added queue handles as context members and context function to access...

[#16] added queue handles as context members and  context function to access the right queuefamily index
parent bf2673c2
No related branches found
No related tags found
4 merge requests!12Resolve "Swapchain Class",!7Resolve "Shader Program Class",!5Resolve "Pipeline State Object",!4Resolve "Renderpass Class"
...@@ -8,8 +8,8 @@ int main(int argc, const char** argv) { ...@@ -8,8 +8,8 @@ int main(int argc, const char** argv) {
vkcv::Context context = vkcv::Context::create( vkcv::Context context = vkcv::Context::create(
applicationName, applicationName,
VK_MAKE_VERSION(0, 0, 1), VK_MAKE_VERSION(0, 0, 1),
20, 2,
{vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eTransfer}, {vk::QueueFlagBits::eTransfer},
{}, {},
{"VK_KHR_swapchain"} {"VK_KHR_swapchain"}
); );
......
...@@ -10,8 +10,8 @@ ...@@ -10,8 +10,8 @@
namespace vkcv { namespace vkcv {
Context::Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::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_instance(instance), m_physicalDevice(physicalDevice), m_device(device), m_graphicsqueue(graphicsqueue), m_transferqueue(transferqueue), m_computequeue(computequeue)
{} {}
Context::~Context() { Context::~Context() {
...@@ -125,14 +125,24 @@ namespace vkcv { ...@@ -125,14 +125,24 @@ namespace vkcv {
vk::Device device = physicalDevice.createDevice(deviceCreateInfo); vk::Device device = physicalDevice.createDevice(deviceCreateInfo);
// TODO: implement device.getQueue() to access the queues, if neede uint32_t graphicsQueueFamilyIndex = findQueueFamilyIndex({vk::QueueFlagBits::eGraphics}, qCreateInfos, physicalDevice);
//std::vector<vk::QueueFamilyProperties> queueFamilyProperties = physicalDevice.getQueueFamilyProperties(); if(graphicsQueueFamilyIndex == -1){
//uint32_t graphicsQueueFamilyIndex = vkcv::findGraphicsQueueFamilyIndex( queueFamilyProperties ); throw std::runtime_error("It is not possible to access another queue as a graphics queue.");
// for(uint32_t i = 0; true; i++){ }
// vk::Queue graphicsQueue = device.getQueue( graphicsQueueFamilyIndex, i ); 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.");
return Context(instance, physicalDevice, device); }
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 { const vk::Instance& Context::getInstance() const {
...@@ -260,10 +270,16 @@ namespace vkcv { ...@@ -260,10 +270,16 @@ namespace vkcv {
return extensions; return extensions;
} }
uint32_t Context::findGraphicsQueueFamilyIndex(uint32_t queueCount, std::vector<vk::DeviceQueueCreateInfo> &createInfos){ int Context::findQueueFamilyIndex(vk::QueueFlagBits flag, std::vector<vk::DeviceQueueCreateInfo> &createInfos, vk::PhysicalDevice &device){
for(auto createInfo: createInfos){ std::vector<vk::QueueFamilyProperties> queueFamilyProperties = device.getQueueFamilyProperties();
std::cout << createInfo.queueCount << std::endl; 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;
} }
} }
...@@ -14,6 +14,9 @@ namespace vkcv { ...@@ -14,6 +14,9 @@ namespace vkcv {
vk::Instance m_instance; vk::Instance m_instance;
vk::PhysicalDevice m_physicalDevice; vk::PhysicalDevice m_physicalDevice;
vk::Device m_device; 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. * Constructor of #Context requires an @p instance, a @p physicalDevice and a @p device.
...@@ -22,7 +25,7 @@ namespace vkcv { ...@@ -22,7 +25,7 @@ namespace vkcv {
* @param physicalDevice Vulkan-PhysicalDevice * @param physicalDevice Vulkan-PhysicalDevice
* @param device Vulkan-Device * @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: public:
/** /**
...@@ -145,7 +148,15 @@ namespace vkcv { ...@@ -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 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);
}; };
} }
...@@ -138,4 +138,4 @@ namespace vkcv { ...@@ -138,4 +138,4 @@ namespace vkcv {
m_context->getInstance().destroySurfaceKHR( m_surface ); m_context->getInstance().destroySurfaceKHR( m_surface );
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment