DirectX 12 ๋ฆฌ์†Œ์Šค ์žฅ๋ฒฝ(Resource Barrier)

2020. 7. 29. 01:00ใ†PROGRAMMING/DirectX 12

 

 

 

 

 

[ ๋ฆฌ์†Œ์Šค ์žฅ๋ฒฝ(Resource Barrier ]

 

 

 

DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ์ดํ•ดํ•˜๊ธฐ (5) - part 1

[ DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ] 1 ๋‹จ๊ณ„ Device(๊ทธ๋ž˜ํ”ฝ ๋””๋ฐ”์ด์Šค) ์ƒ์„ฑ. 2 ๋‹จ๊ณ„ CommandQueue์™€ CommandList ์ƒ์„ฑ. 3 ๋‹จ๊ณ„ SwapChain ์ƒ์„ฑ. 4 ๋‹จ๊ณ„ FenceObject ์ƒ์„ฑ. 5 ๋‹จ๊ณ„ ๋ Œ๋”ํƒ€๊ฒŸ(RenderTarget)๊ณผ ๊นŠ์ด/..

ssinyoung.tistory.com

์œ„ ๊ธ€์—์„œ ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

๋ฆฌ์†Œ์Šค๊ฐ€ ํŠน์ •ํ•œ ์ƒํƒœ์— ์žˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ๋‹ค.

๋ฆฌ์†Œ์Šค๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋Š” ๊ต‰์žฅํžˆ ๋งŽ๊ณ , ์ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

๊ฐ ๊ทธ๋ž˜ํ”ฝ ๋ช…๋ น์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋Š” ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค ์žฅ๋ฒฝ(Resource Barrier)์€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ฐ์ฒด์ด๋‹ค.

๋ฒ ๋ฆฌ์–ด(Barrier)๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ •๋ง ์žฅ๋ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค.

์–ด๋–ค ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰์•„์ค€๋‹ค.

๋ฆฌ์†Œ์Šค ์žฅ๋ฒฝ์€ ID3D12GraphicsCommandList::ResourceBarrier() ํ•จ์ˆ˜์™€

D3D12_RESOURCE_BARRIER ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋“ค์€ ์–ด๋Š ํ•œ์ˆœ๊ฐ„์—๋Š” ํ•˜๋‚˜์˜ ์ƒํƒœ(STATE)๋ฅผ ๊ผญ ๊ฐ€์ง€๋„๋ก ๋˜์–ด์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ทธ๋ž˜ํ”ฝ ๋ช…๋ น์ด ๊ทธ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰์ด ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š”

๊ทธ ๋ช…๋ น์— ํ•„์š”ํ•œ ์ƒํƒœ๋กœ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ผ ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ READ์˜ ๋Œ€์ƒ์ธ์ง€, WRITE์˜ ๋Œ€์ƒ์ธ์ง€

๋“ฑ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ์— DEFAULT_HEAP์— ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•˜์ž.

๊ทธ๋ ‡๋‹ค๋ฉด CPU๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ํ•˜๋‹ค. GPU๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด, ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋Š” ๋ฆฌ์†Œ์Šค ์ƒํƒœ ์ค‘์— COPY_DEST์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์™œ COPY_DEST ์ผ๊นŒ?

๋ฐ”๋กœ CPU๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ UPLOAD_HEAP์œผ๋กœ COPY ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

๋”ฐ๋ผ์„œ DEFAULT_HEAP์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๋ฉด

๊ธฐ๋ณธ์ ์œผ๋กœ COPY_DEST์ƒํƒœ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

UPLOAD_HEAP์— ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฆฌ์†Œ์Šค๋Š”? GPU๊ฐ€ ์ฝ๊ธฐ ์œ„ํ•œ ์šฉ๋„์ด๋‹ค.

GPU ์ž…์žฅ์—์„œ GPU๊ฐ€ ์ด ๋‚ด์šฉ์„ ๋ฐ”๊ฟ€ ๊ฒƒ์ž„์„ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

์ด๋ฒˆ์—๋Š” ์Šค์™‘์ฒด์ธ์˜ ํ›„๋ฉด ๋ฒ„ํผ์ธ ๋ Œ๋”ํƒ€๊ฒŸ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์ž.

์ด ๋ฆฌ์†Œ์Šค๋Š” READ ์šฉ๋„์ผ๊นŒ? WRTIE ์šฉ๋„์ผ๊นŒ?

GPU ์ž…์žฅ์—์„œ๋Š” ๋ Œ๋”ํƒ€๊ฒŸ์— WRITE๋ฅผ ํ•œ๋‹ค.

์Šค์™‘ ์ฒด์ธ์˜ ํ›„๋ฉด๋ฒ„ํผ๊ฐ€ READ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋Š”?

๋ฐ”๋กœ Present๋ฅผ ํ•  ๋•Œ์ด๋‹ค. Present ํ•  ๋•Œ๋Š” ๋ Œ๋”ํƒ€๊ฒŸ์ด READ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

 

์ฆ‰, ๋ Œ๋”ํƒ€๊ฒŸ์˜ WRITE ์ƒํƒœ๋Š” D3D12_RESOURCE_STATE_RENDER_TARGET ์ด๊ณ 

๋ Œ๋”ํƒ€๊ฒŸ์˜ READ ์ƒํƒœ๋Š” D3D12_RESOURCE_STATE_PRESENT ์ด๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊นŠ์ด/์Šคํ…์‹ค์˜ ์ƒํƒœ๋Š”?

GPU๊ฐ€ ๊นŠ์ด์™€ ์Šคํ…์‹ค ๊ฐ’์„ WRTIE ํ•ด์•ผ ํ•˜๋ฏ€๋กœ

D3D12_RESOURCE_STATE_DEPTH_WRITE๋กœ ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค.

 

 

 

์ด์ „ ์ƒํƒœ๊ฐ€ READ๋„ ์•„๋‹ˆ๊ณ  WRITE๋„ ์•„๋‹Œ ์ƒํƒœ๋Š” D3D12_RESOURCE_STATE_COMMON ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ฒ˜์Œ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ช…ํ™•ํžˆ ์–ด๋–ค ์šฉ๋„์ธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค๋ฉด COMMON ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ดํ›„ ๋ฆฌ์†Œ์Šค ์žฅ๋ฒฝ(Resource Barrier)์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐ”๊ฟ”์ฃผ์ž.

 

๋ฆฌ์†Œ์Šค ์ƒํƒœ๊ฐ€ COMMON ์ƒํƒœ์—์„œ๋Š” ์–ด๋–ค GPU ๋ช…๋ น์„ ์“ฐ๋ฉด

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๊ทธ ๋ช…๋ น์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์•”์‹œ์ ์ธ ์ƒํƒœ ์ „์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์–ด๋–ค ์šฉ๋„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์ƒํƒœ ์ „์ด๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.