From 73905a51276ebd5082d5f7bbbeb77648a9adf717 Mon Sep 17 00:00:00 2001 From: n0F4x <ggabor2002@gmail.com> Date: Mon, 17 Jun 2024 16:40:39 +0200 Subject: [PATCH] Update lecture 1 to account for lecture 2 fixes --- docs/lectures/01/index.md | 45 ++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/docs/lectures/01/index.md b/docs/lectures/01/index.md index 5cbe6ad..3f0da51 100644 --- a/docs/lectures/01/index.md +++ b/docs/lectures/01/index.md @@ -9,7 +9,7 @@ A példák kiinduló kódja megtalálható [ezen a linken](https://git.sch.bme.h A példák Vulkan mellett [glm](https://github.com/g-truc/glm), [GLFW](https://www.glfw.org/) és [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator?tab=readme-ov-file) könyvtárakat használnak. -Érdemes még a [bevezető előadás](https://git.sch.bme.hu/kszk/devteam/vulkan-workshop/-/blob/master/docs/Vulkan%20Bevezet%C5%91.pptx?ref_type=heads) áttanulmányozása. +Érdemes még a [bevezető](../Bevezető.pptx) és a [mostani leckéhez tartozó](./Inicializálás.pptx) előadások áttanulmányozása. ## Általános @@ -184,29 +184,50 @@ Ez a parancs feldolgozás *Queue*-kon keresztül történik, amelyek képesek p Egy `vk::Queue` többféle feladat végrehajtására is képes lehet - legyen az grafikai, általános feldolgozás, adat-átvitel, vagy valami más. A GPU tervezők számunkra a hasonló tulajdonságokkal rendelkező *Queue*-kat úgynevezett *Queue family*-kbe csoportosítják. -Válasszunk ki egy grafikai munkát támogató családot (ebből már következik, hogy adat-átvitelt is támogat), és abból is **egy** *Queue*-t. +Válasszunk ki egy grafikai munkát támogató családot (ebből már következik, hogy adat-átvitelt is támogat), és majd abból is **egy** *queue*-t. A mi céljainkhoz ez az egy elég lesz mindenre. !!! example "" ```cpp [[nodiscard]] - static auto find_graphics_queue_family( - vk::PhysicalDevice t_physical_device - ) -> uint32_t - { + static auto find_queue_family_index( + const vk::PhysicalDevice physical_device + ) -> std::optional<uint32_t> { uint32_t index{}; - for (const auto& properties : t_physical_device.getQueueFamilyProperties()) - { + for (const auto &properties : physical_device.getQueueFamilyProperties()) { if (properties.queueFlags & vk::QueueFlagBits::eGraphics) { return index; } index++; } - throw std::runtime_error{ "Could not find graphics queue family" }; + return std::nullopt; } ``` +!!! info "`vk::PhysicalDevice` kiválasztása" + + Az előző pontban nem beszéltem róla, de `physical_device` választáskor egy fontos feltétel, hogy legyen abban *graphics queue* a továbbiakra nézve. + Így ezt a feltételt is hozzáadtam: + + ??? example "*Filter physical devices*" + + ```cpp + [[nodiscard]] + auto choose_physical_device(const vk::Instance instance) -> vk::PhysicalDevice { + std::vector<vk::PhysicalDevice> physical_devices{}; + std::ranges::remove_copy_if( + instance.enumeratePhysicalDevices(), + std::back_inserter(physical_devices), + [](vk::PhysicalDevice physical_device) { + return !( + find_queue_family_index(physical_device).has_value() + ); + } + ); + // ... + ``` + Adott minden, hogy a *Device*-t is létrehozzuk. !!! example "" @@ -219,7 +240,7 @@ Adott minden, hogy a *Device*-t is létrehozzuk. constexpr static std::array queue_priorities{ 1.f }; const vk::DeviceQueueCreateInfo queue_create_info{ - .queueFamilyIndex = find_graphics_queue_family(t_physical_device), + .queueFamilyIndex = find_queue_family_index(t_physical_device), .queueCount = 1, .pQueuePriorities = queue_priorities.data(), }; @@ -233,7 +254,7 @@ Adott minden, hogy a *Device*-t is létrehozzuk. } ``` -!!! note "" +!!! info "" Queue-k kérésekor meg kell adni egy köztük kialakított prioritási sorrendet, ami queue-k közti ütemezéshez hasznos. Sajnos ha csak egy queue-t kérünk, annak a prioritását is specifikálni kell [0.0, 1.0] között. @@ -258,7 +279,7 @@ private: Renderer::Renderer() : m_instance{ create_instance() }, m_physical_device{ choose_physical_device(*m_instance) }, - m_queue_family_index{ find_graphics_queue_family(m_physical_device) }, + m_queue_family_index{ find_queue_family_index(m_physical_device) }, m_device{ create_device(m_physical_device) }, m_queue{ m_device->getQueue(m_queue_family_index, 0) } {} -- GitLab