Skip to content
Snippets Groups Projects
Commit 73905a51 authored by n0F4x's avatar n0F4x
Browse files

Update lecture 1 to account for lecture 2 fixes

parent 717f922f
No related branches found
No related tags found
No related merge requests found
...@@ -9,7 +9,7 @@ A példák kiinduló kódja megtalálható [ezen a linken](https://git.sch.bme.h ...@@ -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. 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 ## Általános
...@@ -184,29 +184,50 @@ Ez a parancs feldolgozás *Queue*-kon keresztül történik, amelyek képesek p ...@@ -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. 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. 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. A mi céljainkhoz ez az egy elég lesz mindenre.
!!! example "" !!! example ""
```cpp ```cpp
[[nodiscard]] [[nodiscard]]
static auto find_graphics_queue_family( static auto find_queue_family_index(
vk::PhysicalDevice t_physical_device const vk::PhysicalDevice physical_device
) -> uint32_t ) -> std::optional<uint32_t> {
{
uint32_t index{}; uint32_t index{};
for (const auto& properties : t_physical_device.getQueueFamilyProperties()) for (const auto &properties : physical_device.getQueueFamilyProperties()) {
{
if (properties.queueFlags & vk::QueueFlagBits::eGraphics) { if (properties.queueFlags & vk::QueueFlagBits::eGraphics) {
return index; return index;
} }
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. Adott minden, hogy a *Device*-t is létrehozzuk.
!!! example "" !!! example ""
...@@ -219,7 +240,7 @@ Adott minden, hogy a *Device*-t is létrehozzuk. ...@@ -219,7 +240,7 @@ Adott minden, hogy a *Device*-t is létrehozzuk.
constexpr static std::array queue_priorities{ 1.f }; constexpr static std::array queue_priorities{ 1.f };
const vk::DeviceQueueCreateInfo queue_create_info{ const vk::DeviceQueueCreateInfo queue_create_info{
.queueFamilyIndex = find_graphics_queue_family(t_physical_device), .queueFamilyIndex = find_queue_family_index(t_physical_device),
.queueCount = 1, .queueCount = 1,
.pQueuePriorities = queue_priorities.data(), .pQueuePriorities = queue_priorities.data(),
}; };
...@@ -233,7 +254,7 @@ Adott minden, hogy a *Device*-t is létrehozzuk. ...@@ -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. 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. 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: ...@@ -258,7 +279,7 @@ private:
Renderer::Renderer() Renderer::Renderer()
: m_instance{ create_instance() }, : m_instance{ create_instance() },
m_physical_device{ choose_physical_device(*m_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_device{ create_device(m_physical_device) },
m_queue{ m_device->getQueue(m_queue_family_index, 0) } m_queue{ m_device->getQueue(m_queue_family_index, 0) }
{} {}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment