Vulkan λͺ λ Ή μ€ν
OpenGLμ΄λ DirectX11 μ΄μ λ²μ κ³Όλ λ¬λ¦¬ Vulkanμμλ λͺ¨λ GPU λͺ λ Ήμ΄ μ»€λ§¨λ λ²νΌ(Command buffer)λ₯Ό ν΅ν΄ μ λ¬λλ©°, ν(Queue)λ₯Ό ν΅ν΄ μ€νλ©λλ€.
λͺ λ Ήμ μ€ννλ μΌλ°μ μΈ νλ¦μ λ€μκ³Ό κ°μ΅λλ€.:
VkCommandPool
λ‘λΆν°VkCommandBuffer
λ₯Ό ν λΉν©λλ€.VkCmdXXXXX
ν¨μλ₯Ό μ¬μ©νμ¬ λͺ λ Ήμ 컀맨λ λ²νΌμ κΈ°λ‘ν©λλ€.VkQueue
λ‘ μ»€λ§¨λ λ²νΌλ₯Ό μ μΆν΄ λͺ λ Ήμ μ€νμ μμν©λλ€.
κ°μ 컀맨λ λ²νΌλ₯Ό μ¬λ¬ λ² μ μΆνλ κ²λ κ°λ₯ν©λλ€. λ§μ νν 리μΌκ³Ό μμ μμλ νν 컀맨λ λ²νΌλ₯Ό νλ²λ§ μμ±νμ¬ λ λλ§ λ£¨νμμ λ§€ νλ μλ§λ€ μ μΆνλ λ°©μμ μ¬μ©ν©λλ€. νμ§λ§ μ΄ νν 리μΌμμλ λ§€ νλ μλ§λ€ λͺ λ Ήμ μμ±ν κ²μ΄λ©°, μ΄λ μ€μ λ λλ§ μμ§μ λμ λ°©μκ³Ό λ μ μ¬νκΈ° λλ¬Έμ λλ€.
Vulkanμμ λͺ λ Ήμ κΈ°λ‘νλ κ²μ μλμ μΌλ‘ λΉμ©μ΄ μ κ² λλλ€. μΌλ°μ μΌλ‘ λΉμ©μ΄ λ§μ΄ λλ μμ μ VkQueueSubmit νΈμΆλ‘, μ΄ κ³Όμ μμ λλΌμ΄λ²κ° 컀맨λ λ²νΌμ μ ν¨μ±μ κ²μ¬νκ³ GPUμμ μ€ννκΈ° λλ¬Έμ λλ€.
컀맨λ λ²νΌμμ λ§€μ° μ€μν μ μ λ³λ ¬λ‘ κΈ°λ‘ν μ μλ€λ κ²μ
λλ€. μ¬λ¬ μ°λ λμμ μλ‘ λ€λ₯Έ 컀맨λ λ²νΌλ₯Ό μμ νκ² κΈ°λ‘ν μ μμ΅λλ€. μ΄λ₯Ό μν΄ κ° μ°λ λλ μ΅μν νλμ VkCommandPool
κ³Ό νλμ VkCommandBuffer
λ₯Ό κ°μ ΈμΌ νλ©°, κ° μ°λ λκ° μμ λ§μ κ³ μ ν 컀맨λ λ²νΌμ 컀맨λ ν(Command Pool)μ μ¬μ©ν΄μΌ ν©λλ€. μ¬λ°λ₯΄κ² μ€μ νλ©΄ κ° μ°λ λμμ 컀맨λ λ²νΌλ₯Ό μ μΆν μ μμ΅λλ€. vkQueueSubmit
μ΄ μ°λ λ μμ (thread-safe)νμ§ μκΈ° λλ¬Έμ, νλμ νμλ νλ²μ νλμ μ°λ λλ§ λͺ
λ Ήμ μ μΆν μ μμ΅λλ€. λκ·λͺ¨ μμ§μμλ νν λ°±κ·ΈλΌμ΄λ μ°λ λμμ μ μΆμ μ²λ¦¬νλ©°, λ©μΈ λ λλ§ λ£¨ν μ°λ λκ° μ€νλ μ μλλ‘ ν©λλ€.
VkQueue
Vulkanμμμ νλ GPUμ μ€ν ν¬νΈμ
λλ€. λͺ¨λ GPUλ μ¬μ©κ°λ₯ν μ¬λ¬ νλ₯Ό κ°μ§λ©°, μλ‘ λ€λ₯Έ λͺ
λ Ήμ λμμ μ€νν μλ μμ΅λλ€. μλ‘ λ€λ₯Έ νμ μ μΆλ λͺ
λ Ήλ€μ λμμ μ€νλ μ μμ΅λλ€. μ΄λ λ©μΈ νλ μ 루νμ μ§μ μ μΌλ‘ μ°κ΄λμ§ μλ λ°±κ·ΈλΌμ΄λ μμ
μ μνν λ λ§€μ° μ μ©ν©λλ€. μ΄λ₯Ό μν΄ λ°±κ·ΈλΌμ΄λ μμ
μ μ© VkQueue
λ₯Ό μμ±νμ¬ μΌλ°μ μΈ λ λλ§ μμ
κ³Ό λΆλ¦¬ν μ μμ΅λλ€.
Vulkanμ λͺ¨λ νλ ν ν¨λ°λ¦¬λ‘λΆν° νμλ©λλ€. ν ν¨λ°λ¦¬λ νΉμ μ νμ ν κ·Έλ£Ήμ΄λ©°, μ§μνλ λͺ λ Ήμ μ’ λ₯κ° κ°κΈ° λ€λ¦ λλ€.
GPUλ κ°κΈ° λ€λ₯Έ ν ν¨λ°λ¦¬λ₯Ό μ§μν©λλ€. μλ₯Ό λ€μ΄ NVIDIA GT 750TIμ κ²½μ°, μ΄ λ§ν¬μμ νμΈν μ μμ΅λλ€. μ΄ GPUμλ 2κ°μ ν ν¨λ°λ¦¬κ° μμΌλ©°, νλλ λͺ¨λ κΈ°λ₯μ μ§μνλ 16κ°μ νλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, λ€λ₯Έ νλλ μ μ‘(Transfer)λ§μ μ§μνλ 1κ°μ νλ‘ μ΄λ£¨μ΄μ§ ν ν¨λ°λ¦¬κ° μμ΅λλ€. λ°λ©΄, κ³ μ±λ₯ AMD GPUλ μ¬κΈ°λ₯Ό μ°Έκ³ ν μ μμ΅λλ€.μ΄ GPUμλ 5κ°μ ν ν¨λ°λ¦¬κ° μμΌλ©°, κ° μ νλ³λ‘ μ΅λ 2κ°μ νλ§ μ‘΄μ¬ν©λλ€. 1κ°μ νλ λͺ¨λ κΈ°λ₯μ μ§μνκ³ , κ³μ°(Compute) λ° μ μ‘(Transfer) μμ μ μ§μνλ 2κ°μ ν, 2κ°μ μ μ‘ μ μ© ν, 2κ°μ νμ(Present) μ μ© νκ° μμ΅λλ€. μ΄μ²λΌ, κ° GPUκ° μ§μνλ ν ν¨λ°λ¦¬λ μλΉν λ€λ₯Ό μ μμ΅λλ€.
λλΆλΆμ μμ§μμλ 3κ°μ ν ν¨λ°λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ λλ€. νλλ νλ μμ 그리λ λ° μ¬μ©νκ³ , λ€λ₯Έ νλλ λΉλκΈ° κ³μ°(compute), κ·Έλ¦¬κ³ λ€λ₯Έ νλλ λ°μ΄ν° μ μ‘μ λλ€. μ΄ νν 리μΌμμλ λ¨μνλ₯Ό μν΄ νλμ νμμ λͺ¨λ λͺ λ Ήμ μ€ννκ² μ΅λλ€.
VkCommandPool
VkCommandPool
μ VkDevice
λ₯Ό κΈ°λ°μΌλ‘ μμ±λλ©°, ν΄λΉ 컀맨λ νμ΄ λͺ
λ Ήμ μμ±ν ν ν¨λ°λ¦¬μ μΈλ±μ€κ° νμν©λλ€.
VkCommandPool
μ VkCommandBuffer
μ ν λΉκΈ°λΌκ³ μκ°ν μ μμ΅λλ€. νλμ νμμ μνλ λ§νΌ VkCommandBuffer
λ₯Ό ν λΉν μ μμ§λ§, ν λ²μ νλμ μ°λ λλ§ λͺ
λ Ήμ κΈ°λ‘ν μ μμ΅λλ€. λ§μ½ λ©ν°μ°λ λ νκ²½μμ λͺ
λ Ήμ κΈ°λ‘νκ³ μ νλ€λ©΄ μΆκ°μ μΈ VkCommandPool
κ°μ²΄κ° νμν©λλ€. μ΄λ¬ν μ΄μ λ‘, ν΄λΉ 컀맨λ νκ³Ό μμΌλ‘ ꡬμ±ν κ²μ
λλ€.
VkCommandBuffer
GPUμ λͺ¨λ λͺ
λ Ήμ VkCommandBuffer
μ κΈ°λ‘λ©λλ€. GPUμ μμ
μ μννλ λͺ¨λ ν¨μλ 컀맨λ λ²νΌκ° VkQueueSubmit
μ ν΅ν΄ GPUλ‘ μ μΆλ λκΉμ§ μ€νλμ§ μμ΅λλ€.
컀맨λ λ²νΌλ μ€λΉ(Ready) μνμμλΆν° μμν©λλ€. μ€λΉ μνμμλ vkBeginCommandBuffer()
λ₯Ό νΈμΆν΄ κΈ°λ‘(Recording) μνλ‘ λ³κ²½ν μ μμ΅λλ€. μ΄ μνμμ vkCmdXXXXX
ν¨μλ₯Ό νΈμΆν΄ λͺ
λ Ήμ κΈ°λ‘ν μ μμ΅λλ€. λͺ¨λ λͺ
λ Ήμ κΈ°λ‘νκ³ λλ©΄ vkEndCommandBuffer()
λ₯Ό νΈμΆνμ¬ μ€νκ°λ₯ν(Executable) μνλ‘ λ³κ²½νλ©΄ ν΄λΉ 컀맨λ λ²νΌλ₯Ό GPUμ μ μΆν μ μμ΅λλ€.
컀맨λ λ²νΌλ₯Ό μ μΆνλ €λ©΄ μ μΆν λͺ
λ Ήκ³Ό νλ₯Ό μ§μ νμ¬ vkQueueSubmit()
λ₯Ό νΈμΆν©λλ€. λν, vkQueueSubmit
μ μ¬λ¬ κ°μ 컀맨λ λ²νΌλ₯Ό ν λ²μ μ μΆν μλ μμ΅λλ€. μ μΆν λͺ¨λ 컀맨λ λ²νΌλ 보λ₯(Pending) μνλ‘ λ³νλ©λλ€.
컀맨λ λ²νΌκ° μ μΆλλ©΄ μ¬μ ν βμ ν¨(alive)βνλ©° GPUμμ μ²λ¦¬λκ³ μμ΅λλ€. μ΄ μμ μμλ 컀맨λ λ²νΌλ₯Ό 리μ νλ κ²μ΄ μμ νμ§ μμ΅λλ€. 컀맨λ λ²νΌλ₯Ό μ¬μ€μ νκ³ μ¬μ¬μ© νκΈ° μ μ, GPUκ° ν΄λΉ 컀맨λ λ²νΌμ λͺ¨λ λͺ λ Ήμ μλ£νλ μ§ νμΈν΄μΌ ν©λλ€.
컀맨λ λ²νΌλ₯Ό 리μ
νκΈ° μν΄μ vkResetCommandBuffer()
λ₯Ό μ¬μ©ν©λλ€.
컀맨λ λ²νΌκ° μ€νμ€μΈ λμ λ€μ νλ μμ κ³μ 그릴 μ μλλ‘ λλΈ λ²νΌλ§μ μνν κ²μ λλ€. μ΄λ κ² νλ©΄ GPUκ° ν λ²νΌμμ λ λλ§ λ° μ²λ¦¬λ₯Ό μννλ λμ, λ€λ₯Έ λ²νΌμμ λͺ λ Ήμ κΈ°λ‘ν μ μμ΅λλ€.
컀맨λ λ²νΌμ μλͺ μ£ΌκΈ°μ λν λ μμΈν μ 보λ λ€μ Vulkan μ¬μμ κ΄λ ¨ κΈμ μ°Έκ³ νμΈμ.
Next: Setting up Vulkan commands