Vulkan ์ด๊ธฐํ
OpenGL๊ณผ๋ ๋ฌ๋ฆฌ, Vulkan์ ๊ทธ๋ํฝ ๋ช
๋ น์ ์ฆ์ ์คํํ๋ ๋์ ๋งค์ฐ ๊ธด ์ด๊ธฐํ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. ์ด ์ด๊ธฐํ ๊ณผ์ ์ ๋จ์ถํ๊ธฐ ์ํด VkBootstrap
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ ์์ ์์
์ ๊ฐ์ํํด์ค๋๋ค.
Vulkan์ ๋งค์ฐ โ์ง์ ์ ์ธโ ์ ์ด๋ฅผ ์ ๊ณตํ๋ ๋งค์ฐ ๋ช
์์ ์ธ API์
๋๋ค. ํ์ฅ์ ๋ถ๋ฌ์ค๊ฑฐ๋, ์ฌ์ฉํ GPU(๋ค)์ ์ ํํ๊ฑฐ๋, Vulkan ๋ช
๋ น์ ์ฌ์ฉํ ์ด๊ธฐ VkInstance
์ VkDevice
๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
Vulkan์ OpenGL๊ณผ๋ ๋ฌ๋ฆฌ ์ ์ญ ์ํ(global state)๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ API ํธ์ถ์์ VkDevice
์ VkInstance
๋ฅผ ์ง์ ์ ๋ฌํด์ผํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ vulkan-1.dll
์ ์ง์ ๋งํฌํ์ง๋ง ์ด๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ํจ์ ํฌ์ธํฐ๋ฅผ โ์๋์ผ๋กโ ๋ถ๋ฌ์ฌ ์๋ ์์ต๋๋ค. vulkan-1.dll
์ ๋งํนํ๋ ๊ฒ์ ํ์ฅ ํจ์๋ ๋ถ๋ฌ์ค๋ ๊ฒ์ ์๋๋ฏ๋ก, ๋ณ๋๋ก ๋ถ๋ฌ์์ผ ํฉ๋๋ค. ํ๋ก์ ํธ ์ฝ๋์์๋ ์ด๋ฌํ ํ์ฅ ํจ์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋๋ก Volk
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํฉ๋๋ค. ์ฃผ์ ํํ ๋ฆฌ์ผ ์ฑํฐ์์๋ ์ด๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ด์ง๋ง ์ดํ ํ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ํฌํจ๋์ด ์์ต๋๋ค.
VkInstance
๋ชจ๋ ๊ฒ์ ํต์ฌ์ธ VkInstance
์
๋๋ค. ์ด๋ Vulkan API ๋ฌธ๋งฅ(Context)์ ๋ํ๋
๋๋ค. VkInstance
๋ฅผ ์์ฑํ ๋, ์ํ๋ค๋ฉด ๊ฒ์ฆ ๋ ์ด์ด๋ฅผ ํ์ฑํ ํ ์ ์์ผ๋ฉฐ, VK_KHR_surface
์ ๊ฐ์ ํ์ํ ํ์ฅ๋ ์ค์ ํ ์ ์์ต๋๋ค. ๋ํ, Vulkan ๋๋ผ์ด๋ฒ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ์ผ ํ ๋ ์ฌ์ฉํ ๋ก๊ฑฐ๋ฅผ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค. VkInstance
๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ฒ์ฆ ๋ ์ด์ด์ ํ์ฅ์ ํ์ฑํํ๋ ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฒด ์คํ ๋์ ๋จ ํ๋์ VkInstance
๋ง ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ญ Vulkan ๋ฌธ๋งฅ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
VkPhysicalDevice
VkInstance
๋ฅผ ์์ฑํ ํ, ์์คํ
์์ ์ฌ์ฉ๊ฐ๋ฅํ GPU๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
Vulkan์์๋ ์์คํ
์ ์กด์ฌํ๋ GPU์ ํด๋น GPU ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด ๋ชจ๋ ์ ๋ณด๋ค์ GPU๋ฅผ ๋ํ๋ด๋ VkPhysicalDevice
๋ฅผ ํตํด ๋ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์ด๋ฐ ์ ์ฉ GPU๊ฐ ์ฅ์ฐฉ๋ ๊ฒ์ด๋ฐ ์ ์ฉ PC์ ๊ฒฝ์ฐ ๋จ ํ๋์ VkPhysicalDevice
๋ง์ ์กด์ฌํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ๋ฌ GPU๋ค ์ค ๊ณ ๋ฅผ ํ์ ์์ด ํ๋๋ง ์ ํํ๋ฉด ๋ฉ๋๋ค.
๋ ํฅ๋ฏธ๋ก์ด ์ํฉ์ ๋ฉํ์์ ๋ฐ์ํฉ๋๋ค. ๋ฉํ์ ๋ณดํต 2๊ฐ์ GPU๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํ๋๋ ์ ์ ๋ ฅ์ CPU ๋ด์ฅ GPU์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ๊ณ ์ฑ๋ฅ์ ์ ์ฉ GPU์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋ง์ ์ฌ์ฉํ GPU๋ฅผ ์ ํํด์ผ ํ๋ฉฐ, ์ต์ ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์๊ฐ ์ง์ ์ ํํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ฌ์ฉ์๋ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ ์ ์งํ๊ธฐ ์ํด ์ ์ ๋ ฅ GPU๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
GPU๋ฅผ ์ ํํ๋ ๊ฒ ์ธ์๋, VkPhysicalDevice
๋ฅผ ํตํด GPU์ ๊ธฐ๋ฅ, ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ์ง์ํ๋ ํ์ฅ์ ์กฐํํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ VRAM์ ํฌ๊ธฐ์ GPU๊ฐ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ง์ํ๋ ์ง๋ฅผ ์ ํํ ์์์ผ ํ๋ ๊ณ ๊ธ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
VkDevice
VkPhysicalDevice
๋ก VkDevice
๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. VkDevice
๋ GPU ํ๋์จ์ด์ ์ค์ ๋๋ผ์ด๋ฒ์ด๋ฉฐ, GPU์๊ฒ ์ํตํ๋ ์๋จ์
๋๋ค. ๋๋ฒ๊น
๊ธฐ๋ฅ๊ณผ ์ด๊ธฐํ๋ฅผ ์ ์ธํ ๋๋ถ๋ถ์ Vulkan ๋ช
๋ น์ VkDevice
๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ฅ์น(device)๋ฅผ ์์ฑํ ๋๋ ํ์ฑํํ ํ์ฅ ๋ชฉ๋ก์ ์ง์ ํด์ผ ํฉ๋๋ค. ํ์ํ์ง ์์ ํ์ฅ์ ํ์ฑํํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ถํ์ํ ๊ธฐ๋ฅ์ ํ์ธํ๋ ๊ณผ์ ์์ ๋๋ผ์ด๋ฒ๊ฐ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์์ง์ด ์ฌ๋ฌ VkDevice
๋ฅผ ๋์์ ๋ค๋ฃฐ ์๋ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋์ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ GPU๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ ๋ค๋ฃจ์ง ์์ง๋ง, ์ฌ๋ฌ GPU๊ฐ ์ปดํจํธ ์
ฐ์ด๋๋ฅผ ์๋ํ ๋ ์์๋๋ฉด ์ ์ฉํ ๋ด์ฉ์
๋๋ค.
์ค์์ฒด์ธ(Swapchain)
GPU๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ธฐํํ์ง๋ง, ํ๋ฉด์ ์ค์ ๋ก ๋ ๋๋ง์ ์ํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ค์์ฒด์ธ(swapchain)์ ์ฌ์ฉํฉ๋๋ค. ์ค์์ฒด์ธ์ OS ๋๋ ์ฐฝ ์์คํ ์ด ์ ๊ณตํ๋ ๊ตฌ์กฐ๋ก, ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฐ ํ ํ๋ฉด์ ํ์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ค์์ฒด์ธ์ Vulkan์ ํต์ฌ ์ฌ์์ ์๋๋๋ค. ์ ํ์ ๊ธฐ๋ฅ์ด๋ฉฐ ํ๋ซํผ๋ง๋ค ์ฐจ์ด๊ฐ ์์ ์ ์์ต๋๋ค. ๋ง์ฝ Vulkan์ ์ปดํจํธ ์ ฐ์ด๋ ๊ณ์ฐ ํน์ ์คํ๋ผ์ธ ๋ ๋๋ง์ ์ฌ์ฉํ๋ค๋ฉด, ์ค์์ฒด์ธ์ ์ค์ ํ ํ์๋ ์์ต๋๋ค.
์ค์์ฒด์ธ์ ์ฃผ์ด์ง ํฌ๊ธฐ๋ก ์์ฑ๋๋ฉฐ, ์ฐฝ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด ์ค์์ฒด์ธ์ ๋ค์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์ค์์ฒด์ธ ์ด๋ฏธ์ง์ ํฌ๋งท์ ํ๋ซํผ๊ณผ GPU์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์์ฒด์ธ์์ ์๊ตฌํ๋ ํฌ๋งท์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํฌ๋งท์ ์ด๋ฏธ์ง๋ฅผ ๋ ๋๋งํ๋ฉด ๊ทธ๋ํฝ ์ด์์ด๋ ํฌ๋์๊ฐ ์ผ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค์์ฒด์ธ์ ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ์ด์์ฒด์ ์์ ์ ๊ทผํ ์ ์๋ ์ด๋ฏธ์ง์ ์ด๋ฏธ์ง๋ทฐ(image-view)์ ๋ชฉ๋ก์ ํฌํจํฉ๋๋ค. ์ค์์ฒด์ธ์ ๋ ์ ๊ฑฐ๋ ๋ ๋ง์ ์ด๋ฏธ์ง๋ก ์์ฑํ ์๋ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋๋ธ ๋ฒํผ๋ง ํน์ ํธ๋ฆฌํ ๋ฒํผ๋ง์ ์ํํ๊ธฐ ์ํด 2,3๊ฐ์ ์ด๋ฏธ์ง๋ง์ ์ฌ์ฉํฉ๋๋ค.
์ค์์ฒด์ธ์ ๋ง๋ค ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ํ์ ๋ชจ๋(Present Mode)๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ค์์ฒด์ธ์ด ํ๋ฉด ํ์์ ์ด๋ป๊ฒ ๋๊ธฐํํ ์ง๋ฅผ ์ ์ดํฉ๋๋ค.
๋ชจ๋ ํ์ ๋ชจ๋์ ์์ธํ ์ค๋ช ์ ์๋ Vulkan ์ฌ์ ํ์ด์ง์์ ํ์ธํ ์ ์์ต๋๋ค. Vulkan Spec: VkPresentModeKHR
VK_PRESENT_MODE_IMMEDIATE_KHR
์ค์์ฒด์ธ์ ์๋ฌด๊ฒ๋ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ด๋ฏธ์ง๋ฅผ ๋ฐ๋ ์ฆ์ ํ์ํ๋๋ก ํฉ๋๋ค. ์ด๋ ํ๋ฉด ์ฐข์ด์ง(tearing)์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.VK_PRESENT_MODE_FIFO_KHR
์๋ก๊ณ ์นจ ์ฃผ๊ธฐ์ ๋ฐ๋ผ ํ์ํ ์ด๋ฏธ์ง ํ(queue)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์ด๋ฏธ์ง๊ฐ ํ์๋์ด ๋น ๊ณต๊ฐ์ด ์๊ธธ ๋ ๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๊ธฐํฉ๋๋ค. ์ด๋ โ๊ฐํ VSyncโ ํ์ ๋ชจ๋์ด๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ FPS๊ฐ ํ๋ฉด์ ์ฃผ์ฌ์จ์ ๊ณ ์ ๋ฉ๋๋ค.VK_PRESENT_MODE_FIFO_RELAXED_KHR
. Fifo VSync๊ณผ ๊ฑฐ์ ๊ฐ์ง๋ง VSync VSync๊ฐ ์ ์ฐํ๊ฒ ์๋ํฉ๋๋ค. ๋ง์ฝ ์ ํ๋ฆฌ์ผ์ด์ ์ FPS๊ฐ ํ๋ฉด์ ์ต์ FPS๋ณด๋ค ๋ฎ๋ค๋ฉด, ์ด๋ฏธ์ง๋ฅผ ์ฆ์ ํ์ํ์ฌ ์ฐข์ด์ง(tearing) ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฉด์ด 60Hz๋ฅผ ์ง์ํ๋๋ฐ ๋ ๋๋ง์ด 55Hz๋ก ์ด๋ฃจ์ด์ง๋ค๋ฉด, ์ผ๋ฐ์ ์ธ Fifo์์๋ ๋ค์ VSync์ฃผ๊ธฐ ๊น์ง ๋๊ธฐํด์ผ ํ๋ฏ๋ก 30FPS๊น์ง ๋จ์ด์ง ์ ์์ง๋ง, ์ด ๋ชจ๋๋ ๊ทธ๋๋ก 55FPS๋ก ํ์ํฉ๋๋ค. ๋ค๋ง ์ด ๊ณผ์ ์์ ํ๋ฉด ์ฐข์ด์ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.VK_PRESENT_MODE_MAILBOX_KHR
. ์ด ๋ชจ๋๋ ์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ ์งํ๋ฉฐ, ํ ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์ ํ์๋๋ ๋์ ๋๋จธ์ง ์ด๋ฏธ์ง์ ๊ณ์ํด์ ๋ ๋๋งํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง๋ฅผ ํ์ํ ์์ ์ด ๋๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ๋ ๋๋ง ๋ ์ด๋ฏธ์ง๋ฅผ ์ ํํฉ๋๋ค. ์๊ฒฉํ VSync ์์ด ํธ๋ฆฌํ ๋ฒํผ๋ง์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ ํฉํ ๋ฐฉ์์ ๋๋ค.
VK_PRESENT_MODE_IMMEDIATE_KHR
์ ์ฐข์ด์ง ํ์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ทน๋๋ก ๋ฎ์ ์ง์ฐ์ด ํ์ํ ๊ฒฝ์ฐ, ์ฐข์ด์ง ํ์์ ๊ฐ์ํ๊ณ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ MAILBOX ํน์ FIFO์ค ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์๊ฒฉํ VSync๋ฅผ ์ํ๋ ์ง, ํน์ ํธ๋ฆฌํ ๋ฒํผ๋ง์ ์ ํธํ๋ ์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ด ๊ฐ์ด๋์์๋ FIFO_RELAXED
๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ๋ ๋๋ง ์๋์ ์ํ์ ์ค์ ํด์ฃผ๋ฉฐ, ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ์ง ์์ผ๋ฏ๋ก ํ๋ ์ ์๋๊ฐ 5000FPS๊น์ง ์ฌ๋ผ๊ฐ ๊ณผ์ด ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. ํ์ง๋ง ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์์
๋ถํ๊ฐ ์๋ค๋ฉด MAILBOX
๊ฐ ๋ ์ ์ ํ ์ ์์ต๋๋ค.
Next: Vulkan Initialization Code