Предыстория:
Я присматривался к написанию приложения, для которого нужна очень простая, но быстрая графика (просто рисование линий и квадратов), и я, вероятно, собираюсь использовать такую библиотеку, как GLFW или Вулкано, если я собираюсь использовать Rust.
Я хочу понять конкретную и, как мне кажется, довольно практичную деталь API Vulkan. Я понимаю, что графические процессоры могут быть довольно сложной темой, но я хочу подчеркнуть, что у меня нет опыта работы с низкоуровневой графикой или Vulkan, поэтому я понимаю, что на мой вопрос нельзя ответить, или если мой вопрос даже не вызывает смысл. Я постараюсь использовать правильную терминологию. Должен признать, я не лучший специалист в том, чтобы бегло просматривать и просматривать большие объемы исходного кода, я не совсем понимаю и до сих пор понимаю общую концепцию, поэтому я надеюсь, что смогу найти здесь свой ответ. Я пробовал посмотреть исходный код драйверов Vulkan и Mesa, но это не принесло никаких результатов.
ОРИГИНАЛЬНЫЙ вопрос:
Я хочу понять, как вызов API распространяется на драйвер графического процессора.
Я искал, но не смог найти то, что ищу. Ближайшие сообщения, которые я нашел, - это два:
https://softwareengineering.stackexchange.com/questions/279069/how-does-a-program-talk-to-a-graphics-card
https://superuser.com/questions/461022/how-does-the-cpu-and-gpu-interact-in-displaying-computer-graphics
Оба они упоминают нечто похожее на: Чтобы заставить графический процессор что-то делать, вы должны выполнить вызов через поддерживаемый API. Я знаю это, но ни один из двоих не вдавался в подробности того, как выполняется этот вызов API. Надеюсь, приведенная ниже диаграмма иллюстрирует мой вопрос.
MyVulkanProgram.c with "#include <vulkan/vulkan.h>"
|
| (Makes call via Vulkan API)
v
This is the part I don't understand!
|
v
Driver (Mesa, for example) takes the request sent via the Vulkan API.
|
| (Driver asks GPU to perform task)
v
GPU does task
Меня не волнует, что и как GPU что-то делает. Как он вызывается через вызов API через Vulkan и как он распространяется по системе. В идеале я ищу фрагмент кода или ссылку на то, где в исходном коде Vulkan фактический запрос отправляется драйверу.
Или я все неправильно понял? Является ли Вулкан большей частью водителя, чем я думаю? Может быть, драйвер включает тот же заголовок Vulkan, что и мой MyVulkanProgram.c, и драйвер связан вместе с файлами библиотеки, такими как libvulkan.so и др.? Это больше похоже на схему ниже?
MyVulkanProgram.c with "#include <vulkan/vulkan.h>"
|
| (Makes call via Vulkan API)
v
Driver (Mesa, for example, which includes the vulkan headers and is linked with the Vulkan shared object-files) takes the request sent via the Vulkan API.
|
| (Driver asks GPU to perform task)
v
GPU does task
Может быть, это базовый вопрос, а может и нет, но я все равно в замешательстве. Очень благодарен за любые ответы!
ОБНОВЛЕННЫЙ вопрос:
Прочитав ответ от @krOoze (ответ от krOoze ), и учитывая обзорный рисунок загрузчика Vulkan в упомянутом документе, я могу более точно выразить свой вопрос.
Как приложение, выполняющее вызов через API Vulkan, достигает ICD через загрузчик Vulkan?