Quick Comparison
D3D11의 Usage와 CPU access flags는 resource를 누가, 얼마나 자주 갱신하고 어떻게 binding할지 정합니다. IMMUTABLE은 초기 데이터만, DEFAULT는 GPU 중심, DYNAMIC은 CPU write, STAGING은 CPU read/write와 copy용으로 선택합니다.
| Usage | 먼저 고르는 상황 | CPU 접근 |
|---|---|---|
IMMUTABLE | 생성 뒤 바뀌지 않는 mesh·texture | 없음, 초기 데이터 필수 |
DEFAULT | GPU가 주로 사용, 가끔 copy/update | 직접 map하지 않는 기본값 |
DYNAMIC | CPU가 자주 새 데이터를 써서 GPU가 읽음 | CPU_ACCESS_WRITE |
STAGING | GPU와 CPU 사이 readback/upload 중간 | READ·WRITE 가능, pipeline bind 없음 |
선택 기준
Static mesh는 IMMUTABLE, render target과 일반 GPU resource는 DEFAULT, 매 frame 쓰는 작은 vertex·constant data는 DYNAMIC 후보입니다. Screenshot readback은 render target을 staging texture로 copy한 뒤 CPU read를 수행합니다.
STAGING resource는 BindFlags = 0이어야 하며 shader나 render target에 직접 bind하지 않습니다. GPU resource와 CopyResource 또는 CopySubresourceRegion으로 이동합니다.
실패 증상
Invalid Usage와 CPUAccessFlags 조합은 resource 생성 실패 또는 Debug Layer 오류를 만듭니다. DEFAULT resource를 CPU read로 map하거나 IMMUTABLE resource를 갱신하려는 설계를 바꿔야 합니다.
자주 틀리는 점
- 자주 읽는다는 이유로 CPU read flag를 render resource에 붙이지 않습니다.
- Dynamic resource를 GPU가 쓰는 render target 용도로 사용하지 않습니다.
- Readback 직후 GPU 완료를 기다리면 stall이 생길 수 있으므로 비동기 frame 지연을 설계합니다.
- Usage 이름만으로 physical memory 위치를 확정하지 않습니다.
참고 링크
2 sources