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