diff --git a/README.md b/README.md index 1caf7e5d8227badedcc9eb985d984a0eabd9efd6..6636cc9a386aa2ec29598d00a788609c7b3764b6 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,11 @@ Minden írásos anyag megtalálható a [docs](./docs) mappában. Ezek effektív Ajánlott tanulós menetrend: -1. Szedd le a `starter` *branch*-en lévő kódot, és addig kupáld, amíg nem fordul. Kell hozzá CMake, C++20-as fordító, és Vulkan SDK. +1. Szedd le a `lecture_01-starter` *branch*-en lévő kódot, és addig kupáld, amíg nem fordul. + Kell hozzá CMake, C++20-as fordító, és Vulkan SDK. 2. Olvasd át a [bevezető előadás diái](./docs/lectures/Bevezető.pptx)t. -3. Menj végig a [lectures](./docs/lectures) mappában található olvasmányokon. (Ehhez ajánlott az mkdocs használata.) +3. Menj végig a [lectures](./docs/lectures) mappában található olvasmányokon. + (Ehhez ajánlott az mkdocs használata.) A `master` *branch*-en csak dokumentáció van. Az egyes leckékhez tartozó kódok külön branch-eken vannak. diff --git a/docs/lectures/01/index.md b/docs/lectures/01/index.md index 1ae41838a2ff230af106418f5a55423c0995dbaf..5cbe6adc335fef862ebd6f0a83fbdbcdef8f3551 100644 --- a/docs/lectures/01/index.md +++ b/docs/lectures/01/index.md @@ -4,7 +4,8 @@ # Inicializálás -Mielőtt nekilátnál a kódolásnak, hozz létre egy kiinduló projektet. A példák kiinduló kódja megtalálható [ezen a linken](https://git.sch.bme.hu/kszk/devteam/vulkan-workshop/-/tree/starter). +Mielőtt nekilátnál a kódolásnak, hozz létre egy kiinduló projektet. +A példák kiinduló kódja megtalálható [ezen a linken](https://git.sch.bme.hu/kszk/devteam/vulkan-workshop/-/tree/lecture_01-starter). 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. @@ -16,13 +17,16 @@ A leckék során a [Vulkan hivatalos C++ binding-ja](https://github.com/KhronosG ## Instance -Bármilyen Vulkan kód kiinduló eleme egy `vk::Instance` (C-ben `VkInstance`) objektum. Ez mondja meg, hogy milyen Vulkan verziót kívánunk használni, és milyen konfigurációkkal. +Bármilyen Vulkan kód kiinduló eleme egy `vk::Instance` (C-ben `VkInstance`) objektum. +Ez mondja meg, hogy milyen Vulkan verziót kívánunk használni, és milyen konfigurációkkal. !!! info inline end "" - A C++ binding-ban [RAII támogatás](https://github.com/KhronosGroup/Vulkan-Hpp/blob/main/vk_raii_ProgrammingGuide.md) is adott. De ez tapasztalat alapján nekünk inkább csak a fordítást fogja lassítani, minthogy a kódolásban könnyedséget okozna. + A C++ binding-ban [RAII támogatás](https://github.com/KhronosGroup/Vulkan-Hpp/blob/main/vk_raii_ProgrammingGuide.md) is adott. + De ez tapasztalat alapján nekünk inkább csak a fordítást fogja lassítani, minthogy a kódolásban könnyedséget okozna. -Mivel ez egy általunk létrehozott erőforrás, ezért használat után is nekünk kell "felszabadítani". Habár nem feltétlen *best practice*, de mi minden ilyen *handle*-t egy C++ `unique_ptr`-hez hasonló struktúrába csomagolva fogunk használni, amit a Vulkan binding biztosít. +Mivel ez egy általunk létrehozott erőforrás, ezért használat után is nekünk kell "felszabadítani". +Habár nem feltétlen *best practice*, de mi minden ilyen *handle*-t egy C++ `unique_ptr`-hez hasonló struktúrába csomagolva fogunk használni, amit a Vulkan binding biztosít. ??? example "Hozzuk létre a `Renderer` osztályt!" @@ -40,7 +44,8 @@ Mivel ez egy általunk létrehozott erőforrás, ezért használat után is nek }; ``` - Mint minden, Vulkan-ban, az Instance létrehozása is explicit. Így ezt a kódot kiszervezzük egy külön függvénybe. + Mint minden, Vulkan-ban, az Instance létrehozása is explicit. + Így ezt a kódot kiszervezzük egy külön függvénybe. ```cpp title="Renderer.cpp" #include "Renderer.hpp" @@ -83,7 +88,8 @@ Debug-oláshoz beállítünk [egy layer](https://vulkan-tutorial.com/Drawing_a_t !!! info "" - A debug üzenetek megformázásához szokás [DebugUtilsMessenger](https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Validation_layers#page_Message-callback)-t használni. Mi ezzel most nem foglalkozunk. + A debug üzenetek megformázásához szokás [DebugUtilsMessenger](https://vulkan-tutorial.com/Drawing_a_triangle/Setup/Validation_layers#page_Message-callback)-t használni. + Mi ezzel most nem foglalkozunk. Ezeknél több mindent is beállíthatnánk még az Instance létrehozásához, de egyelőre megelégszünk ennyivel. @@ -115,9 +121,11 @@ Ezeknél több mindent is beállíthatnánk még az Instance létrehozásához, ## Physical Device -Minden a gépen jelen levő Vulkan-képes processzort egy `vk::PhysicalDevice`-al reprezentál a könyvtár. Ezeket a `vk::Instance::enumeratePhysicalDevices` függvénnyel le is kérhetjük. +Minden a gépen jelen levő Vulkan-képes processzort egy `vk::PhysicalDevice`-al reprezentál a könyvtár. +Ezeket a `vk::Instance::enumeratePhysicalDevices` függvénnyel le is kérhetjük. -Érdemes egy diszkrét GPU-val dolgozni, ha az jelen van, rosszabb esetben integrálttal. Így válasszuk ki a számunkra legmegfelelőbb egységet. +Érdemes egy diszkrét GPU-val dolgozni, ha az jelen van, rosszabb esetben integrálttal. +Így válasszuk ki a számunkra legmegfelelőbb egységet. !!! example "" @@ -159,19 +167,25 @@ Minden a gépen jelen levő Vulkan-képes processzort egy `vk::PhysicalDevice`-a ## (Logical) Device -Mielőtt elkezdünk a GPU-n dolgozni, azelőtt elengedhetetlen a használni tervezett extra funkciók megadása. Egyelőre ezzel mi még nem élünk. +Mielőtt elkezdünk a GPU-n dolgozni, azelőtt elengedhetetlen a használni tervezett extra funkciók megadása. +Egyelőre ezzel mi még nem élünk. -A (Logical) Device szintaktikailag nagyon hasonlít az Instance-hez. Itt is lesz olyan, amit majd csak később állítunk be. A mostani alkalommal egyedül a `vk::Queue`-kra koncentrálunk. +A (Logical) Device szintaktikailag nagyon hasonlít az Instance-hez. +Itt is lesz olyan, amit majd csak később állítunk be. +A mostani alkalommal egyedül a `vk::Queue`-kra koncentrálunk. -A grafikus kártya egy hihetetlenül parallelizált eszköz - ám ennek a kihasználásához adatot kell neki küldeni, és megmondani hogy mit csináljon. Ez a parancs feldolgozás *Queue*-kon keresztül történik, amelyek képesek párhuzamosan több "command" végrehajtására. +A grafikus kártya egy hihetetlenül parallelizált eszköz - ám ennek a kihasználásához adatot kell neki küldeni, és megmondani hogy mit csináljon. +Ez a parancs feldolgozás *Queue*-kon keresztül történik, amelyek képesek párhuzamosan több "command" végrehajtására. !!! tip "" Habár egy `vk::Queue` egyszerre több `vk::CommandBuffer` végrehajtására is képes, `vk::CommandBuffer`-eket feldolgozásra küldeni egy `vk::Queue`-nak továbbra is csak egy szálon lehetséges. -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. +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. A mi céljainkhoz ez az egy elég lesz mindenre. +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. +A mi céljainkhoz ez az egy elég lesz mindenre. !!! example ""