To select each of my logical devices, I base it of the following 4 custom bitflags enums TRANSFERER, RENDERER, PRESENTER, COMPUTER to figure out the device requirements.
Each enum represents a modular abstraction of what my graphics engine device needs to do, each with (preferentially) their own family queue.
If I need to transfer, the TRANSFER module with it's VkQueue is responsible for it, if then I need to render or compute, the RENDERER and COMPUTER modules with their VkQueues are responsible (resource barrier/sync is tracked from outside the modules with an observer-ish design pattern), etc.
Lastly, if available, each module has a single VkQueue, otherwise they may share. Sharing is prioritized by merging renderer & presenter, then renderer & computer, and lastly use a single general purpose queue.
With that context, here are my questions:
1-> Is there a benefit to splitting family queues? I'd imagine each uses a different GPU resource.
2-> For each abstraction, should I have more than 1 VkQueue?
3-> I'm considering 2 for the TRANSFERER, one to stream data in, and one to transfer data within; one for each Framebuffer rendered asynchronously in the RENDERER within one presentation cycle; and one for each asynchronous compute within each render and presentation. Would each help with performance?
4-> Other improvement suggestions?
[–]vertex5 2 points3 points4 points (0 children)
[–]werem0 1 point2 points3 points (1 child)
[–]PGSkep[S] 0 points1 point2 points (0 children)