์ด์ ์ค์์ฒด์ธ๊ณผ ์ปค๋งจ๋ ๋ฒํผ, ๊ทธ๋ฆฌ๊ณ Vulkan์ด ๋ชจ๋ ์ด๊ธฐํ๋์์ต๋๋ค. ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ ๋๋ง ๋ฃจํ๋ฅผ ์์ฑํ ์ฐจ๋ก์
๋๋ค. ์ฌ๊ธฐ์๋ VkCmdClearColorImage
๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์์ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ ๊ตฌํํ๊ฒ ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ๋ฉด์ ๊น๋นก์ด๋ ์์์ด ๋ํ๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ํด ์ค์์ฒด์ธ๊ณผ ์ํธ์์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ ๋ค, ์ง์ ํ ์์์ผ๋ก ์ด๊ธฐํํ๊ณ ํ๋ฉด์ ํ์ํ๊ฒ ์ต๋๋ค. ๋ํ, OS์ GPU๊ฐ ์ค์์ฒด์ธ ๋ฐ ์ด๊ธฐํ ๋ช
๋ น๊ณผ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋๋ก ๋๊ธฐํ ๊ตฌ์กฐ์ฒด๋ฅผ ์ค์ ํ๊ฒ ์ต๋๋ค.
๋๊ธฐํ
Vulkan์ CPU๊ฐ GPU์ ๋ช ๋ น ์คํ๊ณผ ๋๊ธฐํํ ์ ์๋๋ก ๋ช ์์ ์ธ ๋๊ธฐํ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ GPU์์ ์คํ๋๋ ๋ช ๋ น์ ์์๋ ์ ์ดํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ช ๋ น์ด ํ ํน์ ๋ค๋ฅธ ๋ช ๋ น์ ํตํด GPU๋ก ์ ๋ฌ๋๋ฉด ๋๋ผ์ด๋ฒ์ GPU๊ฐ ์ด๋ฅผ ์์ ๋กญ๊ฒ ์คํํฉ๋๋ค. ์ฌ๋ฌ ๋ช ๋ น์ ์ฃผ์ด์ง ์์์ ๋ฐ๋ผ ์คํํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ๋๊ธฐํ ์์คํ ์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด Vulkan์์๋ ํ์ค(Fence)์ ์ธ๋งํฌ์ด(Semaphore)๋ฅผ ์ ๊ณตํฉ๋๋ค.
VkFence
์ด๋ GPU์์ CPU๋ฐฉํฅ์ผ๋ก์ ๋๊ธฐํ์ ์ฌ์ฉ๋ฉ๋๋ค. vkQueueSubmit
๊ณผ ๊ฐ์ ์ฌ๋ฌ Vulkan ๋ช
๋ น์์๋ ์ ํ์ ์ผ๋ก ํ์ค ์ธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ค๋ฅผ ์ค์ ํ๋ฉด, CPU์์ GPU๊ฐ ํด๋น ์์
์ ์๋ฃํ๋ ์ง ํ์ธํ ์ ์์ต๋๋ค. ํ์ค๋ ๋ช
๋ น์ด ์ ์ถ๋๋ฉด ์ ํธ(signal)๊ฐ ์ค์ ๋๋ฉฐ, VkWaitForFences
๋ฅผ ์ฌ์ฉํ์ฌ CPU๊ฐ ํด๋น ๋ช
๋ น์ด ์คํ๋ ๋ ๊น์ง ๋๊ธฐํ๋๋ก ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 2๊ฐ์ ํ์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ณ ์ด์ค ํ๋๋ฅผ FrameData
๊ตฌ์กฐ์ฒด์ ์ถ๊ฐํฉ์๋ค.
์์ฌ ์ฝ๋ ์์ :
//we have a fence object created from somewhere
VkFence myFence;
//start some operation on the GPU
VkSomeOperation(whatever, myFence);
// block the CPU until the GPU operation finishes
VkWaitForFences(myFence);
//fences always have to be reset before they can be used again
VkResetFences(myFence);
VkSemaphore
์ด๋ GPU ๋ด๋ถ ์ฐ์ฐ ๊ฐ ๋๊ธฐํ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ธ๋งํฌ์ด๋ GPU ๋ช
๋ น์ ์คํ ์์๋ฅผ ์ ์ํ์ฌ ์์ฐจ์ ์ผ๋ก ์คํ๋๋๋ก ์ ์ดํฉ๋๋ค. VkQueueSubmit
๊ณผ ๊ฐ์ ๋ช๋ช Vulkan ๋ช
๋ น์ ์ ํธ(Signal) ํน์ ๋๊ธฐ(Wait) ์ธ๋งํฌ์ด๋ฅผ ์ง์ํฉ๋๋ค.
์ธ๋งํฌ์ด๋ ์ฌ๋ฌ GPU ํ ๋ช ๋ น ๊ฐ ์ฐ๊ฒฐ ์ญํ ์ ํฉ๋๋ค. ํ๋์ ๋ช ๋ น์ ์ค์ ํ ์ธ๋งํฌ์ด๋ฅผ ์ ํธํ๋ฉฐ, ๋ค๋ฅธ ๋ช ๋ น์ ์ด๋ฅผ ๋๊ธฐํฉ๋๋ค. ์ฌ๋ฌ GPU ๋ช ๋ น์ด ํ๋์ ์ธ๋งํฌ์ด๋ฅผ ๋๊ธฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ํ ๋ช ๋ น์ ํ๋์ ์ธ๋งํฌ์ด๋ง์ ์ ํธํ ์ ์์ต๋๋ค. ๋ช ๋ น์ด ์ธ๋งํฌ์ด๋ฅผ ๋๊ธฐํ๋ค๋ฉด ํด๋น ์ธ๋งํฌ์ด์ ์ ํธ๊ฐ ์ฌ ๋ ๊น์ง ์คํ๋์ง ์์ต๋๋ค.
3๊ฐ์ง ๋ช ๋ น์ ์ง๋ ฌํํ๋ ์์ฌ ์ฝ๋ ์์ :
VkSemaphore Task1Semaphore;
VkSemaphore Task2Semaphore;
VkOperationInfo OpAlphaInfo;
// Operation Alpha will signal the semaphore 1
OpAlphaInfo.signalSemaphore = Task1Semaphore;
VkDoSomething(OpAlphaInfo);
VkOperationInfo OpBetaInfo;
// Operation Beta signals semaphore 2, and waits on semaphore 1
OpBetaInfo.signalSemaphore = Task2Semaphore;
OpBetaInfo.waitSemaphore = Task1Semaphore;
VkDoSomething(OpBetaInfo);
VkOperationInfo OpGammaInfo;
//Operation gamma waits on semaphore 2
OpGammaInfo.waitSemaphore = Task2Semaphore;
VkDoSomething(OpGammaInfo);
์ด ์ฝ๋๋ 3๊ฐ์ DoSomething์ GPU์์ ์๊ฒฉํ ์์๋ก ์คํํฉ๋๋ค. GPU์์ ์คํ๋๋ ๋ช ๋ น์ ์์๋ Alpha->Beta->Gamma์ ๋๋ค. Alpha๊ฐ ์คํ๋๋ฉด Task1์ ์ ํธํ๊ณ , ์ด๋ Beta๋ฅผ ์คํ์์ผ Beta๊ฐ ์คํ์ ๋ง์น๋ฉด ๋ง์ง๋ง์ผ๋ก Gamma๋ฅผ ์ ํธํ ๊ฒ์ ๋๋ค.
์ด ๊ฒฝ์ฐ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด 3๊ฐ์ ๋ช ๋ น์ ๋ณ๋ ฌ๋ก ์คํ๋์ด ์๋ก ์ฝํ ์คํ๋ ์ ์์ต๋๋ค. ์๋ก ๋ค๋ฅธ ํ ๊ฐ ๋ช ๋ น์๋ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ์ธ ๊ทธ๋ํฝ์ค ํ๊ฐ ํน์ ํจ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ์ปดํจํธ ์ ฐ์ด๋๋ฅผ ์คํํ ์๋ ์์ต๋๋ค. ๋๋ ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ํ์(Present) ํ์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๊ทธ๋ํฝ์ค ํ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๋ ๋๋ง ๋ฃจํ
์ฐ๋ฆฌ์ ๋ ๋๋ง ๋ฃจํ์์๋ ๋๋ธ ๋ฒํผ๋ง ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด GPU๊ฐ ํ ํ๋ ์ ๋ถ๋์ ๋ช ๋ น์ ์ํํ๋ ๋์ CPU๊ฐ ๋ค์ ํ๋ ์์ ์ค๋นํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ค์ ํ๋ ์์ด ๊ณ์ฐ๋๋ฉด ์ฒซ ํ๋ ์์ด ์คํ ์๋ฃ๋์ด ์ปค๋งจ๋ ๋ฒํผ์ ๋ค์ ๊ธฐ๋กํ ์ ์์ ๋ ๊น์ง CPU๋ ๋๊ธฐํด์ผ ํฉ๋๋ค.
๋ ๋๋ง ์์ ์์๋ ์ค์์ฒด์ธ๊ณผ ๋๊ธฐํ๋ฅผ ํด์ผํฉ๋๋ค. ํ๋ฉด์ ํ์ํ ํ์๊ฐ ์๋ ํค๋๋ฆฌ์ค ๋ ๋๋ง์ด๋ผ๋ฉด, ์ด ๊ณผ์ ์ด ํ์ ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ฐฝ์ ๋ ๋๋งํด์ผ ํ๋ฏ๋ก OS์์ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ด๋ฏธ์ง์ ๋ ๋๋งํ ํ, ๊ทธ ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ํ์ํ๋๋ก OS์ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฏธ์ง ๋ ์ด์์
GPU๋ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฏธ์ง๋ฅผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅธ ํฌ๋งท์ผ๋ก ์ ์ฅํฉ๋๋ค. Vulkan์์๋ ์ด๋ฌํ ํฌ๋งท์ ์ด๋ฏธ์ง ๋ ์ด์์์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ถ์ํํฉ๋๋ค. ์ฝ๊ธฐ ์ ์ฉ ์ด๋ฏธ์ง๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์ด๋ฏธ์ง์ ๋ค๋ฅธ ๋ ์ด์์์ ๊ฐ์ต๋๋ค. ์ด๋ฏธ์ง์ ๋ ์ด์์์ ๋ณ๊ฒฝํ ๋ Vulkan์ ํ์ดํ๋ผ์ธ ๋ฐฐ๋ฆฌ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ดํ๋ผ์ธ ๋ฐฐ๋ฆฌ์ด๋ ๋จ์ผ ์ปค๋งจ๋ ๋ฒํผ ๋ด์์ ๋ช ๋ น์ ๋๊ธฐํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ, ์ด๋ฏธ์ง ๋ ์ด์์ ๋ณํ๋ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฏธ์ง ๋ ์ด์์์ด ํ๋์จ์ด๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํ๋๊ธฐ ๋๋ฌธ์, ์ผ๋ถ ๋ณํ์ ํน์ ํ๋์จ์ด์์ ์ค์ ๋ก ์๋ฌด๋ฐ ๋์๋ ํ์ง ์์ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ณํ์ ์ํํ๋ ค๋ฉด ๊ฒ์ฆ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ฌ GPU ๋ช ๋ น์ด ์ ์ ํ ๋ ์ด์์์์ ์คํ๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค.๊ฒ์ฆ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด, NVIDIA ํ๋์จ์ด์์๋ ์ ์์ ์ผ๋ก ์๋ํ๋๋ผ๋ AMD๋ ๋ค๋ฅธ ํ๋์จ์ด์์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
์ค์์ฒด์ธ์์ ๊ฐ์ ธ์ค๋ ์ด๋ฏธ์ง๋ ์ ํจํ์ง ์์ ์ํ์ผ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ํด๋น ์ด๋ฏธ์ง์ VkCmdDraw
ํน์ ๋ค๋ฅธ ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ ์ํํ๋ ค๋ฉด, ๋จผ์ ์ด๋ฏธ์ง์ ๋ ์ด์์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ ์ด์์์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ ์ํํ ํ์๋, ์ต์ข
์ ์ผ๋ก ํ๋ฉด ์ถ๋ ฅ์ ์ ํฉํ ๋ ์ด์์์ผ๋ก ๋ณํํด์ผ ํฉ๋๋ค.
๊ตฌ๋ฒ์ ์ Vulkan์์๋ ์ด๋ฌํ ๋ ์ด์์ ๋ณํ์ด ๋ ๋ํจ์ค์ ์ผ๋ถ๋ก ์ฒ๋ฆฌ๋์์ต๋๋ค. ํ์ง๋ง Vulkan 1.3์์๋ ๋์ ๋ ๋๋ง์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๋ณํ์ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๋ป์ ๋๋ค. ๋ฐ๋ฉด์, ์ ์ฒด ๋ ๋ํจ์ค ๊ตฌ์ฑํ ๋ ๋ณต์ก์ฑ๊ณผ ์์ ๋์ ์ค์ผ ์ ์์ต๋๋ค. ๋ ๋ํจ์ค์ ๋ํด ๋ ์๊ณ ์ถ๋ค๋ฉด ๊ตฌ๋ฒ์ ์ ํํ ๋ฆฌ์ผ์ ํ์ธํ์ธ์.
์ด์ ๋ ๋๋ง ๋ฃจํ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Next: Mainloop Code