๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒ‰ Metal

Command Organization and Execution Model

by HOENDEV 2023. 11. 27.

MTLDevice

MTLDevice ํ”„๋กœํ† ์ฝœ์€ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ GPU๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

MTLDevice ํ”„๋กœํ† ์ฝœ์€ ์žฅ์น˜ ์†์„ฑ์„ ์กฐ์‚ฌ,

 

๋ฒ„ํผ ๋ฐ ํ…์Šค์ฒ˜์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์žฅ์น˜๋ณ„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ,

 

์‹คํ–‰์„ ์œ„ํ•ด GPU์— ์ œ์ถœํ•  ๋ Œ๋”๋ง ๋ฐ ์ปดํ“จํŒ… ๋ช…๋ น์„ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ƒˆ๋กœ์šด command queue๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฒ„ํผ๋ฅผ ํ• ๋‹นํ•˜๊ณ ,

 

ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์žฅ์น˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ฟผ๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹œ์Šคํ…œ์—์„œ ๊ธฐ๋ณธ ์žฅ์น˜๋ฅผ ์–ป์œผ๋ ค๋ฉด MTLCreateSystemDefaultDevice ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์‹ญ์‹œ์˜ค.

 

Command Queue

command queue๋Š” command buffer์˜ ํ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, command queue๋Š” ์ด๋Ÿฌํ•œ command buffer์˜ ์‹คํ–‰์ˆœ์„œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ command queue๋Š” ์Šค๋ ˆ๋“œ ์„ธ์ดํ”„ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํ™œ์„ฑ command buffer๋ฅผ ๋™์‹œ์— ์ธ์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Command Buffer

command buffer๋Š” ํŠน์ • ์žฅ์น˜์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฝ”๋”ฉ๋œ ๋ช…๋ น์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

command encoder๋Š” command buffer์— ๋ Œ๋”๋ง, ์ปดํ“จํŒ… ๋ฐ ๋ธ”๋ฆฌํŒ… ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜๊ณ 

 

์ด๋Ÿฌํ•œ command buffer๋“ค์€ ์žฅ์น˜์—์„œ ์‹คํ–‰๋˜๋„๋ก ์ปค๋ฐ‹๋ฉ๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ์•ฑ์—์„œ๋Š” ๋ Œ๋”๋ง์˜ ์ „์ฒด ํ”„๋ ˆ์ž„์ด ๋‹จ์ผ command buffer๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ํ”„๋ ˆ์ž„์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์—ฌ๋Ÿฌ ๋ Œ๋”๋ง ํŒจ์Šค, ์ปดํ“จํŒ… ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๋˜๋Š” ๋ธ”๋ฆฟ ์ž‘์—…์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

 

 

command buffer๋Š” transient ํ•˜๊ณ  ์ผํšŒ์šฉ ๊ฐ์ฒด์ด๋ฉฐ ์žฌ์‚ฌ์šฉ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

command buffer๊ฐ€ ์‹คํ–‰์„ ์œ„ํ•ด ์ปค๋ฐ‹๋˜๋ฉด ์œ ์ผํ•œ ์œ ํšจํ•œ ์ž‘์—…์€

 

command buffer๊ฐ€ ์Šค์ผ€์ค„ ๋˜๊ฑฐ๋‚˜ ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , command buffer ์‹คํ–‰์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

command buffer๋Š” ๋˜ํ•œ ์•ฑ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋‚˜ํƒœ๋ƒ…๋‹ˆ๋‹ค.

 

Metal ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์— ์˜ํ•ด ์„ค์ •๋œ ์ผ๊ด€์„ฑ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

Creating a Command Buffer

MTLCommandBuffer ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด, MTLCommandQueue์˜ commandBuffer ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

 

MTLCommandBuffer๋Š” ๋งŒ๋“ค์–ด์ง„ MTLCommandQueue์—๋งŒ ์ปค๋ฐ‹๋  ์ˆ˜ ์žˆ๋‹ค.

 

command Buffer ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ command buffer๋Š” ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

Executing Commands

MTLCommandBuffer๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ command queue์—์„œ command buffer์˜ ์‹คํ–‰์ˆœ์„œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

command buffer๋Š” ์ปค๋ฐ‹๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ปค๋ฐ‹๋˜๋ฉด command buffer๋Š” ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

- enqueue

command queue์— command buffer๋ฅผ ์œ„ํ•œ ์ž๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ commitํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์ปค๋ฐ‹๋˜๊ฒŒ ๋˜๋ฉด ์ด์ „์— enqueue๋œ command buffer ํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

- commit

์ด์ „์— enqueue๋œ buffer๊ฐ€ ์ปค๋ฐ‹๋œ ํ›„ command buffer๊ฐ€ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ buffer๊ฐ€ enqueue๋˜์ง€ ์•Š์•˜์—ˆ๋‹ค๋ฉด ์•”์‹œ์ ์œผ๋กœ enqueue๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

Registering Handler Blocks for Command Buffer Execution

์•„๋ž˜ ๋‚˜์—ด๋œ MTLCommandBuffer ๋ฉ”์„œ๋“œ๋Š” ๋ช…๋ น ์‹คํ–‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

 

Scheduled ์™€ Completed ํ•ธ๋“ค๋Ÿฌ๋Š” ์ •์˜ ๋˜์ง€ ์•Š์€ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ผ์–ด๋‚˜๋Š” ์ž‘์—…์€ ๋น ๋ฅด๊ฒŒ ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

- addScheduledHandler

Scheduled ๋  ๋•Œ ํ˜ธ์ถœ๋  ๋ธ”๋ก ๋“ฑ๋ก.

๋‹ค๋ฅธ MTLCommandBuffer ๊ฐ์ฒด๋‚˜ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ API์— ์˜ํ•ด ์ œ์ถœ๋œ ์ž‘์—… ๊ฐ„์˜ ์ข…์†์„ฑ์ด ์ถฉ์กฑ๋˜๋ฉด Scheduled๋กœ ๊ฐ„์ฃผ

์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก ๊ฐ€๋Šฅ

 

- waitUntilScheduled

command buffer๊ฐ€ Schedule ๋˜๊ณ  addScheduledHandler์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋™๊ธฐ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋ฐ˜ํ™˜.

 

- addCompletedHandler

device๊ฐ€ command buffer์— ๋Œ€ํ•œ ์‹คํ–‰์„ ์™„๋ฃŒํ•œ ์งํ›„ ๋ฐ”๋กœ ํ˜ธ์ถœ.

์—ฌ๋Ÿฌ๊ฐœ ๋“ฑ๋ก ๊ฐ€๋Šฅ

 

- waitUntilCompleted

device๊ฐ€ command buffer์˜ ์‹คํ–‰์„ ์™„๋ฃŒํ•˜๊ณ  addCompletedHandler์— ์˜ํ•ด ๋“ฑ๋ก๋œ ๋ชจ๋“  ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜๋œ ํ›„ ๋™๊ธฐ์ ์œผ๋กœ ๋Œ€๊ธฐํ•˜๊ณ  ๋ฐ˜ํ™˜

 

- presentDrawable

command buffer๊ฐ€ schedule ๋  ๋•Œ ํ‘œ์‹œ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค(CAMetalDrawable)์˜ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

Command Encoder

command encoder๋Š” GPU๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ transient object๋กœ commands์™€ state๋ฅผ

 

์“ฐ๊ธฐ์œ„ํ•ด ๋‹จ์ผ command buffer์— ํ•œ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

 

๋งŽ์€ command encoder ๊ฐ์ฒด๋Š” command buffer์— command๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

command encoder๊ฐ€ ํ™œ์„ฑํ™” ๋˜์—ˆ์„ ๋•Œ, command buffer์— ๋Œ€ํ•œ ๋…์  ๊ถŒํ•œ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

 

์ธ์ฝ”๋”ฉ์ด ๋๋‚˜๋ฉด endEncoding์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

Creating a Command Encoder Object

command encoder๋Š” ํŠน์ • command buffer์— ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋Š” MTLCommandBuffer๊ฐ์ฒด์—์„œ

 

command encoder๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์œ ํ˜•์˜ command encoder๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

- renderCommandEncoderWithDescriptor

MTLRenderPassDescriptor์˜ attachment์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์„ ์œ„ํ•œ MTLRenderCommandEcoder ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

- computeCommandEncoder

๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ์„ ์œ„ํ•œ MTLComputeCommandEncoder ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

- blitCommandEncoder

๋ฉ”๋ชจ๋ฆฌ ์ž‘์—…์„ ์œ„ํ•œ MTLBlitCommandEncoder ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

- parallelRenderCommandEncoderWithDescriptor

๊ณต์œ  MTLRenderPassDescriptor์— ์ง€์ •๋œ attachment๋กœ ๊ณ„์† ๋ Œ๋”๋งํ•˜๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ

MTLRenerCommandEncoder ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” MTLParallelRenderCommandEncoder๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

Render Command Encoder

๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์€ ๋ Œ๋”๋ง ํŒจ์Šค๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

MTLRenderCommandEncoder ๊ฐ์ฒด๋Š” ๋‹จ์ผ ๋ Œ๋”๋ง ํŒจ์Šค์™€ ๊ด€๋ จ๋œ ๋ Œ๋”๋ง ์ƒํƒœ ๋ฐ drawing command๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

MTLRenderCommandEncoder์—๋Š” ๋ Œ๋”๋ง ๋ช…๋ น์˜ destination ์—ญํ• ์„ ํ•˜๋Š” MTLRenderPassDescriptor๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

MTLRenderPassDescriptor๋Š” ์ƒ‰์ƒ, depth ๋ฐ stencil attachment๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

- vertex, fragment ํ˜น์€ texture image๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๋ฒ„ํผ ๋ฐ ํ…์Šค์ฒ˜ ๊ฐ์ฒด์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

- vertex, fragment ์‰์ด๋”๋ฅผ ํฌํ•จํ•˜๋Š” ์ปดํŒŒ์ผ๋œ ๋ Œ๋”๋ง ์ƒํƒœ๊ฐ€ ๋“ค์–ด์žˆ๋Š” MTLRenderPipelineState ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

- viewport, triangle fill mode, scissor rectangle, depth and stencil tests, ๊ธฐํƒ€ ๊ฐ’ ๋“ฑ์„ ํฌํ•จํ•œ fixed-function ์ƒํƒœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

- 3D primitive ๊ทธ๋ฆฌ๊ธฐ

 

Compute Command Encoder

data-parallel ์ปดํ“จํŒ…์˜ ๊ฒฝ์šฐ MTLComputeCommandEncoder ํ”„๋กœํ† ์ฝœ์€

 

compute function๊ณผ function์˜ ์ธ์ˆ˜(ํ…์Šค์ฒ˜, ๋ฒ„ํผ ๋ฐ ์ƒ˜ํ”Œ๋Ÿฌ ์ƒํƒœ)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” command buffer์—์„œ

 

๋ช…๋ น์„ ์ธ์ฝ”๋”ฉํ•˜๊ณ  ์‹คํ–‰์„ ์œ„ํ•ด ์ปดํ“จํŒ… ํ•จ์ˆ˜๋ฅผ ๋””์ŠคํŒจ์น˜ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

Compute command encoder ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด MTLCommandBuffer์˜

 

computeCommandEncoder ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Blit Command Encoder

MTLBlitCommandEncoder ํ”„๋กœํ† ์ฝœ์—๋Š” ๋ฒ„ํผ(MTLBuffer)์™€ ํ…์Šค์ฒ˜(MTLTexture) ๊ฐ„์˜

 

๋ฉ”๋กœ๋ฆฌ ๋ณต์‚ฌ ์ž‘์—…์— ๋Œ€ํ•œ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

MTLBlitCommandEncoder ํ”„๋กœํ† ์ฝœ์€ ํ…์Šค์ฒ˜๋ฅผ ๋‹จ์ƒ‰์œผ๋กœ ์ฑ„์šฐ๊ณ  ๋ฐ‰๋งต์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

Blit ๋ช…๋ น ์ธ์ฝ”๋” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด MTLCommandBuffer์˜ blitCommandEncoder ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

 

MTLCommandQueue

command queue์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

 

์ฃผ๋กœ command buffer ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

MTLCommandBuffer

์ด ํ”„๋กœํ† ์ฝœ์€ command buffer์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ ,

 

command encoder ์ƒ์„ฑ,

 

์‹คํ–‰์„ ์œ„ํ•ด command buffer ๋Œ€๊ธฐ์—ด ์ถ”๊ฐ€, ์ƒํƒœํ™•์ธ ๋ฐ ๊ธฐํƒ€ ์ž‘์—…์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์ด ํ”„๋กœํ† ์ฝœ์€ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ GPU ์›Œํฌ๋กœ๋“œ๋ฅผ command buffer๋กœ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

 

MTLRenderCommandEncoder - ๋‹จ์ผ ๋ Œ๋”๋ง ํŒจ์Šค์— ๋Œ€ํ•œ ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง ๋ช…๋ น ์ธ์ฝ”๋”ฉ

 

MTLComputeCommandEncoder - ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์ธ์ฝ”๋”ฉ

 

MTLBlitCommandEncoder - ๋ฒ„ํผ์™€ ํ…์Šค์ฒ˜ ๊ฐ„์˜ ๊ฐ„๋‹จํ•œ ๋ณต์‚ฌ ์ž‘์—…๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ‰๋งต ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ž‘์—…๋„ ์ธ์ฝ”๋”ฉ

 

 

๋‹จ์ผ command encoder๋งŒ ํ™œ์„ฑํ™”๋˜์–ด command buffer์— ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ command encoder๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ๊ธฐ์กด command encoder๊ฐ€ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜๋‚˜์˜ ์˜ˆ์™ธ๋กœ MTLParellelRenderCommandEncoder ํ”„๋กœํ† ์ฝœ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ชจ๋“  ์ธ์ฝ”๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด MTLCommandBuffer ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์ปค๋ฐ‹ํ•˜์—ฌ

 

command buffer๋ฅผ GPU์—์„œ ์‹คํ–‰ํ•  ์ค€๋น„๊ฐ€ ๋œ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

 

MTLCommandQueue ๋Š” ์ด๋ฏธ command queue์— ์žˆ๋Š” ๋‹ค๋ฅธ MTLCommandBuffer๊ฐ์ฒด์™€ ๊ด€๋ จํ•˜์—ฌ

 

์ปค๋ฐ‹๋œ MTLCommandBuffer ๊ฐ์ฒด์˜ ๋ช…๋ น์ด ์‹คํ–‰๋˜๋Š” ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‹ค์Œ ๊ทธ๋ฆผ์€ command queue, command buffer ๋ฐ command encoder ๊ฐ์ฒด๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

๊ฐ ์—ด(๋ฒ„ํผ, ํ…์Šค์ฒ˜, ์ƒ˜ํ”Œ๋Ÿฌ, depth, stencil, ํŒŒ์ดํ”„๋ผ์ธ ์ƒํƒœ)๋Š” command encoder์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค์™€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

 

 

 

Transient and Non-transient Objects in Metal

Metal์˜ ์ผ๋ถ€๊ฐ์ฒด๋Š” ์ผ์‹œ์ ์ด๊ณ  ๋งค์šฐ ๊ฐ€๋ณ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ, ์–ด๋–ค ๊ฐ์ฒด๋Š” ๋” ๋น„์‹ธ๊ณ  ์˜ค๋žซ๋™์•ˆ ์ง€์†๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

 

์•ฑ ์ˆ˜๋ช… ๋™์•ˆ ์ง€์†๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

command buffer์™€ command encoder๋Š” ์ผ์‹œ์ ์ด๋ฉฐ ์ผํšŒ์šฉ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํ• ๋‹น ๋ฐ ๋น„ํ• ๋‹น ๋น„์šฉ์ด ์ €๋ ดํ•˜๋ฏ€๋กœ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋Š” autoreleased ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ฐ์ฒด๋Š” transientํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต์ƒ์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

 

- Command queues

- Data buffers

- Textures

- Sampler states

- Libraries

- Compute states

- Rendere pipeline states

- Depth/stencil states