Question
What is actually a Queue family in Vulkan?
I am currently learning Vulkan, right now I am just taking apart each command and inspecting the structures to try to understand what they mean.
Right now I am analyzing QueueFamilies, for which I have the following code:
vector<vk::QueueFamilyProperties> queue_families = device.getQueueFamilyProperties();
for(auto &q_family : queue_families)
{
cout << "Queue number: " + to_string(q_family.queueCount) << endl;
cout << "Queue flags: " + to_string(q_family.queueFlags) << endl;
}
This produces this output:
Queue number: 16
Queue flags: {Graphics | Compute | Transfer | SparseBinding}
Queue number: 1
Queue flags: {Transfer}
Queue number: 8
Queue flags: {Compute}
So, naively I understand it like this:
There are 3 Queue families, one queue family has 16 queues, all capable of graphics, compute, transfer, and sparse binding operations (no idea what the last 2 are)
Another has 1 queue, capable only of transfer (whatever that is)
The final one has 8 queues capable of compute operations.
What is each queue family? I understand it's where we send execution commands like drawing and swapping buffers, but this is a somewhat broad explanation, I would like a more knowledgeable answer with more details.
What are the 2 extra flags? Transfer and SparseBidning?
And finally, why do we have/need multiple command queues?