2020. 7. 14. 01:00ใPROGRAMMING/DirectX 12
[ DirectX 12 ์ฅ์น ์ด๊ธฐํ ๋จ๊ณ ]
1 ๋จ๊ณ Device(๊ทธ๋ํฝ ๋๋ฐ์ด์ค) ์์ฑ.
2 ๋จ๊ณ CommandQueue์ CommandList ์์ฑ.
3 ๋จ๊ณ SwapChain ์์ฑ.
4 ๋จ๊ณ FenceObject ์์ฑ.
5 ๋จ๊ณ ๋ ๋ํ๊ฒ(RenderTarget)๊ณผ ๊น์ด/์คํ ์ค(Depth/Stencil) ๋ฒํผ ์์ฑ.
[ 2 ๋จ๊ณ CommandQueue์ CommandList์์ฑ ]
CommandQueue์ CommandList๋ DirectX 12 ๊ทธ๋ํฝ ๋ ๋๋ง์์ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ COM๊ฐ์ฒด์ด๋ค.
CommandList๋ ๋ช ๋ น(Command)๋ค์ ๋ด๊ณ ์๋ ๋ฆฌ์คํธ์ด๋ค. (์ฃผ๋ก ๊ทธ๋ํฝ ๋ ๋๋ง ๋ช ๋ น๋ค์ ๋ด๋๋ค.)
CommandQueue๋ ์ด๋ฆ ๊ทธ๋๋ก ํ ํํ์ ๋์์ ํ๋ COM๊ฐ์ฒด์ด๋ค.
์ฌ๋ฌ ๊ฐ์ CommandList๋ค์ ๋ด์ ์ ์๊ณ , CommandList์ ๋ด๊ธด ๋ช ๋ น์ GPU์ ์ ์ถํ๋ ์ญํ ์ ํ๋ค.
GPU๋ ๋ช ๋ น ํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํ์ GPU ๋ช ๋ น๋ค์ ์์๋๋ก ์คํํ๋ค.
CommandQueue์ ExcuteCommandList()๋ฅผ ํตํด์ GPU์ ๋ช ๋ น(Command)๋ค์ ์ ์ถํ ์ ์๋ค.
์ฃผ์ํ ์ ์ CommandQueue๋ฅผ ํตํด ExcuteCommandList()๋ฅผ ํธ์ถํ๋ค๊ณ ํด์
์ ์ถํ ๋ช ๋ น๋ค์ด ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ ์๋๋ค. GPU์์ ๋๊ฐ ๋๋ฉด ๋ช ๋ น๋ค์ ์คํํ๊ฒ ๋๋ค.
[ 1. CommandQueue ์์ฑ ]
CommandQueue์ ์์ฑ์ ID3D12CommandQueue* ์ปด๊ฐ์ฒด๋ฅผ ์ ์ธํ๊ณ ,
ID3D12Device(๋๋ฐ์ด์ค)์ CreateCommandQueue()๋ฅผ ํตํด์ ํ ์ ์๋ค.
CreateCommandQueue()์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก D3D12_COMMAND_QUEUE_DESC๊ฐ ํ์ํ๋ค.
- ์ฒซ ๋ฒ์งธ D3D12_COMMAND_LIST_TYPE
CommandQueue์ ํ์ ์ ์ค์ ํ๋ ์ด๊ฑฐ์ฒด์ด๋ค.
D3D12_COMMAND_LIST_TYPE_DIRECT : GPU๊ฐ ์ง์ ์คํํ ์ ์๋ ๋ช ๋ น ๋ฒํผ(๋ฆฌ์คํธ).
D3D12_COMMAND_LIST_TYPE_BUNDLE : GPU๊ฐ ์ง์ ์คํํ ์ ์์. (Direct ๋ช ๋ น ๋ฆฌ์คํธ๊ฐ ํ์).
D3D12_COMMAND_LIST_TYPE_COMPUTE : Compute Shader๋ฅผ ์ํ ๋ช ๋ น ๋ฒํผ(๋ฆฌ์คํธ).
D3D12_COMMAND_LIST_TYPE_COPY : ๋ณต์ฌ (Copy)๋ฅผ ์ํ ๋ช ๋ น ๋ฒํผ(๋ฆฌ์คํธ).
์ฐ๋ฆฌ๋ GPU๊ฐ ์ง์ ์คํํ ์ ์๋ CommandList๋ฅผ ๋ด์ CommandQueue๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ ์ธ์๋
D3D12_COMMAND_LIST_TYPE_DIRECT๋ก ์ค์ ํ๋ค.
- ๋ ๋ฒ์งธ Priority๋ ๋ช ๋ น ํ์ ์ฐ์ ์์๋ฅผ ์๋ฏธํ๋ค. ์ฐ์ ์์๋ ๊ฐ์ด ์์์๋ก ๋๋ค.
D3D12_COMMAND_QUEUE_PRIORITY_NORMAL : ๋ณดํต ์ฐ์ ์์๋ฅผ ์๋ฏธ.
D3D12_COMMAND_QUEUE_PRIORITY_HIGH : ๋์ ์ฐ์ ์์๋ฅผ ์๋ฏธ.
๋ฐ๋ก ์ค์ ํ์ง ์๊ฑฐ๋, ๋ณดํต ์ฐ์ ์์๋ก ์ง์ ํ์ฌ ์ค์ ํ๋ค.
- ์ธ ๋ฒ์งธ D3D12_COMMAND_QUEUE_FLAGS
CommandQueue์ ํ๋๊ทธ๋ฅผ ์ค์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
D3D12_COMMAND_QUEUE_FLAG_NONE : ๊ธฐ๋ณธ ๋ช ๋ น ํ
D3D12_COMMAND_QUEUE_FLAG_DISABLE_GPU_TIMEOUT : ๋ช ๋ น ํ์ ๋ํ์ฌ GPU ํ์์์์ ๋นํ์ฑํ.
๊ธฐ๋ณธ ๋ช ๋ น ํ์ธ FLAG_NONE์ ์ค์ ํ๋ค.
- ๋ค ๋ฒ์งธ NodeMask.
๋ง์ฝ ์ด๋ค ๊ทธ๋ํฝ ์นด๋์ GPU๊ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ์์ผ๋ฉด, ๊ฐ๊ฐ์ GPU๋ค์ ๊ตฌ๋ถํ๊ธฐ ์ํ ๊ฐ์ด๋ค.
๋ฐ๋ก ์ค์ ํ์ง ์๊ฑฐ๋, ํ ๊ฐ๋ง ์๋ ๋จ์ผ GPU์ ๋ํด์๋ ํญ์ 0์ ์ด๋ค.
[ 2. CommandAllocator์ CommandList ์์ฑ ]
๋ช ๋ น ํ ๋น์(CommandAllocator)๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
(GPU ๋ช ๋ น์ ์ ์ฅํ๊ธฐ ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.)
๊ทธ๋ํฝ ๋ช ๋ น๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ฃผ๋ COM๊ฐ์ฒด์ด๋ค. ์ค์ ๋ช ๋ น์ด๋ค์ ๋ด์ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
CommandList๋ ์ด ๋ฉ๋ชจ๋ฆฌ๋ค์ ์ฌ์ฉํ๋ค. ๋ช ๋ น ๋ฆฌ์คํธ๋ ๋ช ๋ น ํ ๋น์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ด ๋๋ค.
๊ฐ์ CommandAllocator์์ ๋์์ ๋ ๊ฐ ์ด์์ CommandList๋ Open์ํ๊ฐ ๋ ์ ์๋ค.
์ฆ, 1 CommandAllocator : 1 CommandList ์ด๋ค.
CommandList๋ ๋ ๋๋ง ๋ช ๋ น๋ค์ ์ ์ฅํ๋ ๋ฆฌ์คํธ์ด๋ค.
CommandList์ ์๋ ๋ชจ๋ ํจ์๋ค์ Set(์ํ๋ณ๊ฒฝ) & Draw(๊ทธ๋ฆฌ๊ธฐ ํธ์ถ)์ด๋ค.
CommandList๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ CommandAllocator ์ธํฐํ์ด์ค ํฌ์ธํฐ๊ฐ ํ์ํ๋ค.
(์ด CommandList๊ฐ ์ด๋์ ์๋ ๋ช ๋ น์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ธ ๊ฑด์ง ์๊ธฐ ์ํด์).
CommandList๋ ์์ฑ๋๋ฉด Open(๋ช ๋ น์ ์ถ๊ฐํ ์ ์๋) ์ํ์ด๋ค.
CommandList๋ฅผ Close ํ๋ฉด ๋ ์ด์ ๋ช ๋ น์ ์ถ๊ฐํ ์ ์๋ค.
CommandAllocator์ CommandList์ ์ ํ์ ์ผ์นํด์ผ ํ๋ค.
ID3D12GraphicsCommandList๋ ๋ ๋๋ง์ ์ํ ๊ทธ๋ํฝ ๋ช ๋ น๋ค์ ๋ฆฌ์คํธ์ด๋ค.
ClearDepthStencilView, Close, Reset... ๋ฑ๋ฑ ๋ชจ๋ ๋ช ๋ น๋ค์ด Command์ด๋ค.
Setํจ์๋ค์ ์ ์ ํ ํธ์ถํ๊ณ , Draw๋ฅผ ํธ์ถํ๋ฉด ๋ ๋๋ง์ด ์ผ์ด๋๋ค.
์ด ํจ์๋ค์ ํธ์ถํ๋ ๊ฒ์ด ์ ๋ถ ๋ค Command๋ค์ด ๋๋ค.
Command๋ค์ ํธ์ถํ๊ฒ ๋๋ฉด ํด๋น CommandList์ ๋งค์นญ๋ CommandAllocator์ ๋ช ๋ น๋ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
GPU๋ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ์ฌ Command๋ค์ ์คํํ๊ฒ ๋๋ค.
์ถ๊ฐํ ๋ช ๋ น๋ค์ ์คํํ๋ ค๋ฉด CommandList๋ฅผ Close() ํ ํ,
CommandQueue์ ExcuteCommandList() ํธ์ถ์ ํตํด ํ์ ๋ช ๋ น๋ค์ ๋ด์์ค๋ค.
์์์๋ ๋งํ์ง๋ง, Excute๋ฅผ ํธ์ถํ๋ค๊ณ ํด์ Command๋ค์ด GPU์์ ์ฆ์ ์คํ๋๋ ๊ฒ์ด ์๋๋ค.
GPU ํ์ ๋ช ๋ น๋ค์ ์ง์ด๋ฃ๋ ๊ฒ๋ฟ์ด๋ค. ๋ช ๋ น๋ค์ ์คํ๊ณผ๋ ๋ณ๊ฐ์ด๋ค.
ํนํ CopyResource() ๋ช ๋ น์ ์๋ก ๋ค๋ฉด, ์ด ๋ช ๋ น์ ๋ด์๋ค๊ณ ํด์ GPU๊ฐ Resource๋ฅผ ์ฆ์ Copy ํ๋ ๊ฒ์ด ์๋๋ค. (์ด ๋ถ๋ถ์์ ๋ง์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.)
CommandAllocator๋ ID3D12CommandAllocator*๋ฅผ ์ ์ธํ๊ณ
Device์ ๋ด์ฅ๋ CreateCommandAllocator() ํจ์๋ฅผ ํตํด ๋ง๋ค ์ ์๊ณ ,
CommandList๋ CreateCommandList() ํจ์๋ฅผ ํตํด ๋ง๋ค ์ ์๋ค.
๋ ๋๋ง ๋ช ๋ น์ ๋ด๊ธฐ ์ํด ID3D12GraphicsCommandList*๋ฅผ ์ ์ธ ํ CommandList๋ฅผ ์์ฑํ๋ค.
๊ฐ๊ฐ์ ํ์ ์ CommandQueue์ ๋ง์ฐฌ๊ฐ์ง๋ก
GPU๊ฐ ์ง์ ์คํํ ์ ์๋ D3D12_COMMAND_LIST_TYPE_DIRECT์ผ๋ก ์ค์ ํ ํ ์์ฑํ๋ค.
CommandList๋ ๋ฐ๋์ CommandAllocator์ 1:1 ๋งค์นญ์ด ๋ ์ํ๋ก ๋ง๋ค๊ณ ์ฌ์ฉํด์ผ ํ๋ค.
CommandList๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ ์ ์์ง๋ง,
๋ฉํฐ ์ฐ๋ ๋ ๋ ๋๋ง์ ์ฌ์ฉํ์ง ์๋ ์ด์ CommandList๋ ํ๋๋ฉด ์ถฉ๋ถํ๋ค.
๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ฃผ์ํด์ผ ํ ์ ์
์ฌ๋ฌ ์ฐ๋ ๋์์ ํ๋์ CommandList๋ฅผ ๋์์ ์ฐธ์กฐํ ์ ์๋ค๋ ์ ์ด๋ค.
์๋ฅผ ๋ค์ด CommandList ํ๋๋ฅผ ์ฐ๋ ๋0, ์ฐ๋ ๋1์์ ๋์์ ์ฌ์ฉํ๋ ค๊ณ ํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ์ถ๋ ฅ๋๋ค.
์ฆ, 1์ฐ๋ ๋ : 1CommandList๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
CommandList์ ๋ ๋๋ง Command๋ค์ ๋ด๊ธฐ ์ ์
๋ฐ๋์ Reset()์ ํธ์ถํ์ฌ CommandList๋ฅผ Open ์ํ๋ก ๋ง๋ค์ด์ผํ๋ค.
Open ์ํ๊ฐ ๋์ด์ผ๋ง Command๋ค์ ๋ด์ ์ ์๋ค.
์คํํ Command๋ค์ ๋ด์๋ค๋ฉด, Command๋ค์ GPU์ ์ ์ถํ๊ธฐ ์ ์ ๋ฐ๋์ CommandList๋ฅผ Closeํด์ค์ผ ํ๋ค.
Closeํ์ง ์์ผ๋ฉด ExcuteCommandList๋ฅผ ์คํํ ์ ์๋ค.
์ฌ๋ฌ ๊ฐ์ CommandList๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ CommandList์ ์คํ ์์์ด๋ค.
์ผ๋จ CommandList์ ๋ด๊ธด Command๋ค์ ๋ด์ ์์๋๋ก ์คํ๋๋ค.
ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ CommandList๋ฅผ ๋ด์์ ํ ๋ฒ์ ExcuteCommandList๋ฅผ ํ ๊ฒฝ์ฐ
CommandList๋ค ๊ฐ์ ์คํ ์์๋ ์ง์ผ์ง์ง ์๋๋ค.
GPU์ ํ๋จํ์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์์ ๋ค์ด ๋จผ์ ์คํ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด CommandList๋ฅผ Excute์ํค๊ณ ์ ํ ๊ฒฝ์ฐ๋ฅผ ์๋ฅผ ๋ค์ด๋ณด์.
ID3D12CommandList* ppCommandLists[] = { CommandListA, CommandListB };
m_pCommandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);
ppCommandLists[0]์๋ CommandListA๊ฐ ๋ค์ด์๊ณ , [1]์๋ CommandListB๊ฐ ๋ค์ด์๋ค.
CommandList A์ (1, 2, 3) ๋ช ๋ น์ด ๋ค์ด์๊ณ CommandList B์ (4, 5, 6)๋ช ๋ น์ด ๋ค์ด์์ ๋
1, 2, 3, 4, 5, 6 ์์๋ก ์คํ๋ ์๋ ์๊ณ , 4, 5, 6, 1, 2, 3 ์์๋ก ์คํ๋ ์๋ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ์ด ExcuteCommandList ํจ์ ํธ์ถ์ด ์๋นํ ๋ฌด๊ฒ๊ธฐ ๋๋ฌธ์ ๋ณดํต ํ๋์ CommandList๋ฅผ ์ฌ์ฉํ๋ค.
'PROGRAMMING > DirectX 12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 2 (0) | 2020.07.27 |
---|---|
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 1 (3) | 2020.07.25 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (4) (0) | 2020.07.16 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (3) (1) | 2020.07.15 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (1) (0) | 2020.07.13 |