2020. 7. 16. 20:10ใPROGRAMMING/DirectX 12
[ DirectX 12 ์ฅ์น ์ด๊ธฐํ ๋จ๊ณ ]
1 ๋จ๊ณ Device(๊ทธ๋ํฝ ๋๋ฐ์ด์ค) ์์ฑ.
2 ๋จ๊ณ CommandQueue์ CommandList ์์ฑ.
3 ๋จ๊ณ SwapChain ์์ฑ.
4 ๋จ๊ณ FenceObject ์์ฑ.
5 ๋จ๊ณ ๋ ๋ํ๊ฒ(RenderTarget)๊ณผ ๊น์ด/์คํ ์ค(Depth/Stencil) ๋ฒํผ ์์ฑ.
[ 4 ๋จ๊ณ FenceObject ์์ฑ ]
CPU์ GPU๊ฐ ๋ณ๋ ฌ์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด์๋ ๋๊ธฐํ(Synchronization)๊ฐ ํ์ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก CPU๋ ๋ฆฌ์์ค๋ฅผ ์์ฑ(Write)ํ๊ณ , GPU๋ ์ด ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉ(Read)ํ๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ์์ ๊ณต์ ๋๋ ๋ฆฌ์์ค์ ๋ํ ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
CPU๋ ๋ ๋๋ง์ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ID3D12Resource COM๊ฐ์ฒด์ ์ ์ฅํ๋ค.
(๋ฒํ ์ค ๋ฒํผ, ์ธ๋ฑ์ค ๋ฒํผ, ํ ์ค์ณ, ๋ ๋ ํ๊ฒ, ๊น์ด/์คํ ์ค ๋ฒํผ ๋ฑ๋ฑ ๋ ๋๋ง์ ํ์ํ ๋ชจ๋ ์์๋ค)
n๋ฒ์งธ ํ๋ ์์ ๋ํ ์ฅ๋ฉด์ ๋ ๋๋ง ํ๊ธฐ ์ํด CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ GPU๊ฐ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํ์.
n๋ฒ์งธ ๋ ๋๋ง ๋ฐ์ดํฐ๋ฅผ GPU๊ฐ ์์ง ์คํํ์ง ์์๋๋ฐ,
CPU๊ฐ n+1๋ฒ์งธ ํ๋ ์ ๋ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด GPU์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์๋ํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ์ ์ ๋๋ก ๊ทธ๋ ค์ง์ง ์๊ฒ ๋๋ค.
n๋ฒ์งธ ํ๋ ์์ ๋ํ์ฌ CPU๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , GPU๊ฐ ๋ ๋๋ง์ ์ฒ๋ฆฌํ ํ์
CPU๋ n+1๋ฒ์งธ ํ๋ ์ ๋ ๋๋ง ๋ฐ์ดํฐ๋ฅผ GPU์ ๋๊ฒจ์ค์ผ ํ๋ค.
์ฆ, CPU๋ GPU์ ๋ ๋๋ง ์์ ์ด ๋ชจ๋ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
[ ID3D12Fence ]
๋๊ธฐํ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ CPU์๋ค๊ฐ GPU๊ฐ ๋๋๊ธฐ ์ ์ ๋์ํ์ง ๋ชปํ๋๋ก ์ฅ๋ง์ ์ค์นํด์ฃผ๋ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก Direct3D๊ฐ ์ฌ์ฉํ๋ ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ก Fence ์ค๋ธ์ ํธ์ด๋ค.
Fence๋ COM ๊ฐ์ฒด ์ด๋ฏ๋ก ID3D12Fence*๋ฅผ ์ ์ธํ๊ณ ๋๋ฐ์ด์ค๋ฅผ ํตํด ์์ฑํ๋ค.
CreateFence()์ ์ฒซ ๋ฒ์งธ ์ธ์๋ FenceValue์ ์ด๊ธฐ ๊ฐ์ด๋ค.
FenceValue๋ ํ๋ ์ ๋ฒํธ๋ก ์ดํดํ๋ฉด ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฝ๋ค.
์ด๊ธฐ ๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ค. ์ด๋ 0๋ฒ์งธ ํ๋ ์๋ถํฐ ์์ํ๋ค๋ ์๋ฏธ์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์ ์๋ฃํ์ด UINT64 ์๋ฃํ์ด๋ค. (๊ฐ์ ๋ฒ์๊ฐ 0 ~ 2^64 - 1)
์ด๋ 1์ด์ 1,000์ฅ์ฉ ํ๋ ์์ ๊ฐฑ์ ํด๋ 100๋ ๋์ 2^64๊ฐ ์๋๋ค.
์ฆ, ์ด FenceValue๋ ๋งค ํ๋ ์๋ง๋ค ๊ฐ์ ์ฆ๊ฐ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์
์ค๋ฒํ๋ก์ฐ ๋ ์ผ์ด ์๋ ๊ต์ฅํ ํฐ ์ ์ํ ์๋ฃํ์ ์ฌ์ฉํ๋ค.
๋ ๋ฒ์งธ ์ธ์๋ D3D12_FENCE_FLAGS๊ฐ ์ด๋ค.
FENCE_FLAGS๋ ํน๋ณํ ๊ธฐ๋ฅ์ด ํ์ ์์ผ๋ฏ๋ก FLAG_NONE์ผ๋ก ์ค์ ํ๋ค.
(๋ฉํฐ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด D3D12_FENCE_FLAG_SHARED๋ก ์ค์ ํ ์ ๋ ์๋ค.)
Fence ์ค๋ธ์ ํธ ๊ฐ์ CommandQueue๋ ์๊ณ ์๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์์ฉํ๋ก๊ทธ๋จ๋ ์๊ณ ์๋ ๊ฐ์ด๋ค.
์ต์ด ์์ ์(0๋ฒ์งธ ํ๋ ์) FenceValue์ ๊ฐ์ด 1์ด ๋ ๋๊น์ง CPU๋ ๊ณ์ ๋๊ธฐํ๋ค๊ฐ
GPU๊ฐ ๋ชจ๋ ๋ ๋๋ง ์ฒ๋ฆฌ๋ฅผ ๋๋ด๋ฉด ๊ฐ์ ์ฆ๊ฐ์์ผ CPU๊ฐ ๋ค์ ํ๋ ์์ผ๋ก ๋์ํ ์ ์๋๋ก ํ๋ค.
Fence ์ค๋ธ์ ํธ๋ ๋ด๋ถ์ ์ผ๋ก 3๊ฐ์ ๋ฉค๋ฒ ํจ์๋ฅผ ๊ฐ๊ณ ์๋ค.
- GetCompleteValue() ํจ์๋ ํ์ฌ Fence ์ค๋ธ์ ํธ๊ฐ ๊ฐ๊ณ ์๋ UINT ๊ฐ์ ๋ฐํํด์ค๋ค.
- Signal() ํจ์๋ Fence์ ๊ฐ์ ๋ด๊ฐ ์ํ๋ ๊ฐ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ ํจ์์ด๋ค.
- SetEventOnCompletion() ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด์จ ๊ฐ์ผ๋ก Fence ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋๊ฒ ๋๋ฉด,
๋ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด์ค๋ HANDLE Event๋ฅผ TRUE๋ก ๋ง๋ค์ด์ฃผ๋ ํจ์์ด๋ค.
์ธ์๋ก ๋ค์ด๊ฐ๋ Event๋ WinAPI๊ฐ ์ ๊ณตํ๋ ๋๊ธฐํ ์ค๋ธ์ ํธ์ด๋ค.
ํฌ๋ฆฌํฐ์ปฌ์น์ , ์ธ๋งํฌ์ด, ์ด๋ฒคํธ, ๋ฎคํ ์ค.. ๋ฑ๋ฑ. Event๋ ๊ทธ์ค ๊ฐ์ฅ ๊ฐ๋จํ ํํ์ ๋๊ธฐํ ๊ธฐ๋ฒ์ด๋ค.
Event๋ BOOL ๋ณ์์ด๋ค. ์ด์์ฒด์ ๊ฐ ์ด ๊ฐ์ด TRUE์ธ์ง FALSE์ธ์ง ๊ด๋ฆฌํด์ค๋ค.
Event๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋๊ณ ์ด Event์ ๊ฐ์ด TRUE๋ FALSE์ด๋๋ฅผ ์ฝ์ด์ฌ ์ ์๋ ํํ๊ฐ ๋๊ณ ,
์ด Event๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํจ์๋ค์ WinAPI๊ฐ ๋ง๋ค์ด์ ์ ๊ณตํ๋ค.
Event๋ฅผ ๋ง๋ค๊ณ ์ ํ๋ค๋ฉด CreateEventEx๋ผ๋ WinAPIํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
Event๊ฐ ๋ง๋ค์ด์ง๋ฉด HANDLE๊ฐ์ ๋ฐํํด์ค๋ค.
HANDLE์ ์ฌ์ฉํด์ Event์ ๊ฐ์ด TRUE์ธ์ง FALSE์ธ์ง ์ ์ ์๋ค.
๋๋ถ๋ถ ์ด๊ธฐ ์ด๋ฒคํธ์ ๋ฐ์์ FALSE๋ก ๋ง๋ ๋ค.
[ ID3D12CommandQueue ]
์์์ Fence ์ค๋ธ์ ํธ๋ฅผ ์ค๋ช ํ ๋ Fence ์ค๋ธ์ ํธ ๊ฐ์ CommandQueue๋ ์๊ณ ์๊ณ ,
์ฐ๋ฆฌ๊ฐ ๋ง๋ ์์ฉํ๋ก๊ทธ๋จ๋ ์๊ณ ์๋ ๊ฐ์ด๋ผ๊ณ ์ค๋ช ํ๋ค.
CommandQueue์๋ Signal()๊ณผ Wait() ๋ ๊ฐ์ง ๋ฉค๋ฒ ํจ์๊ฐ ์๋ค.
1. Signal() : Fence๊ฐ์ด ์ํ๋ ๊ฐ์ผ๋ก ๋๋ฌ๋ ๋ ํต์ง๋ฅผ ๋ฐ๋ ํจ์์ด๋ค.
Signal() ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ Fence ์ค๋ธ์ ํธ, ๋ ๋ฒ์งธ ์ธ์๋ FenceValue์ด๋ค.
Fence๊ฐ์ด ์ํ๋ ๊ฐ์ผ๋ก ๋๋ฌ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ํด๋ง : ์ฃผ๊ธฐ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ํ์ธํ๋ค. ๊ฐ๋จํ์ง๋ง ๋นํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
- ์ด๋ฒคํธ ํต์ง : ์ด๋ฒคํธ๊ฐ ๋๋ฌ๋ค๊ณ ์๋ ค์ฃผ๋ ๋ฐฉ์์ด๋ค.
์ฆ, CommandQueue๊ฐ Fence๊ฐ์ด 0์์ 1๋ก ๊ณ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ค์ฌ๋ค๋ณด๋ ๋ฐฉ์๋ณด๋ค
์ด์์ฒด์ ๋ฅผ ํตํด์ Event ํต์ง๋ฅผ ๋ฐ์ ์ ์๋ ๋ฐฉ์์ด ๋ ํจ์จ์ ์ด๋ค.
๋น์ ๋ฅผ ํด์ ์ค๋ช ํ์๋ฉด
Signal() ํจ์๋ฅผ ํธ์ถํ๋ฉด, CommandQueue์ ๋ง์ง๋ง CommandList ๋์๋ค๊ฐ
Fence์ ๊ฐ์ 1 ์ฆ๊ฐ์ํค๋, ํน์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ฐ์ด ๋๋๋ก ํ๋ ์ฝ๋๋ฅผ ๋ฃ์๋ค๊ณ ๊ฐ์ ํ์.
๋ช ๋ น์ด ์ ๋ถ ๋๋๊ฒ ๋๋ฉด Fence๊ฐ์ด 0 -> 1๋ก ๋ฐ๋๊ฒ ๋ ๊ฒ์ด๋ค.
CommandQueue๋ Fence๊ฐ์ด 1์ด ๋๋ฉด ํต์ง๋ฅผ ํด๋ฌ๋ผ๊ณ Fence์๊ฒ ๊ฐ์ ์๋ ค์คฌ๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด CommandQueue๋ ํต์ง๋ฅผ ๋ฐ๊ฒ ๋๊ณ , ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ Fence์ ๊ฐ์ด 1์ด ๋์ผ๋
CPU๊ฐ ๋ค์ ํ๋ ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด์ Resource์ ๋ฃ์ ์ ์๋๋ก ๋ค์ ๋์ํ๊ฒ ํ๋ค.
์ด ์์ ์ ๋ฐ๋ณต ์ํํ์ฌ CPU์ GPU์ ๋๊ธฐํ๋ฅผ ํ๋ค.
2. Wait() : GPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ค.
GPU๋ ๋น์ผ ๋์์ด๋ฏ๋ก GPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์์ ์๋ฏธ๊ฐ ์๋ค.
๋๋ถ๋ถ Signal() ํจ์๋ง ์ฌ์ฉํ๋ฉด ๋๋ค.
WinAPI๊ฐ ์ ๊ณตํ๋ '๊ธฐ๋ค๋ฆฌ๋ ํจ์'๋ WaitForSingleObject() ํจ์์ด๋ค.
์ด๋ฅผ ํตํด Event๊ฐ TRUE๊ฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
์ผ์ด ๋ชจ๋ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ฏ๋ก INFINITE๋ฅผ ์ค์ ํ๋ค.
[ Fence ์ค๋ธ์ ํธ๋ฅผ ํตํ CPU/GPU ๋๊ธฐํ ]
0๋ฒ์งธ ํ๋ ์๋ถํฐ ์์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด,
ํ์ฌ CPU๋ 0๋ฒ์งธ ํ๋ ์์ ๋ํ ๋ ๋๋ง ๋ฐ์ดํฐ์ ์ ๋ ฅ์ ๋ชจ๋ ๋ง์น ์ํ์ด๋ค.
๋ฐ๋ผ์ CPU์ Fence๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค. (FenceValue CPU : 1 / GPU : 0)
CommandQueue์ Signal() ํจ์๋ฅผ ํตํด Fence๊ฐ์ด 1์ด ๋๋ฉด ํต์ง๋ฐ๊ฒ ๋ค๊ณ ์ค์ ์ ํ๋ค.
๊ทธ๋ค์ CreateEventExํจ์๋ฅผ ํตํด Event๋ฅผ ์์ฑํด์ค๋ค. ์ด๊ธฐ ๊ฐ์ FALSE์ด๋ค.
์์ฑํ Event HANDLE์ด TRUE๊ฐ ๋ ๋๊น์ง ๋ฌดํํ ๊ธฐ๋ค๋ฆฐ๋ค. (INFINITE)
GPU๊ฐ ๋ชจ๋ ๋ ๋๋ง ์์ ์ ๋ง์น๋ฉด Fence ๊ฐ์ 1 ์ฆ๊ฐ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ CPU๋ n+1๋ฒ์งธ ํ๋ ์์ ๋ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๊ฒ ๋๋ค.
์ด๋ฅผ ๋ฐ๋ณตํ๋ ์์ ์ ํตํด CPU์ GPU์ ๋๊ธฐํ๋ฅผ ํ๋ค.
'PROGRAMMING > DirectX 12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 2 (0) | 2020.07.27 |
---|---|
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (5) - part 1 (3) | 2020.07.25 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (3) (1) | 2020.07.15 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (2) (2) | 2020.07.14 |
DirectX 12 ์ฅ์น ์ด๊ธฐํ ์ดํดํ๊ธฐ (1) (0) | 2020.07.13 |