Open suhyeokkim opened 2 years ago
정리 중..
https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_heap_type 정리 PC 는 NUMA 지만, 게임기는 가끔 UMA 가 있을 수 있음. 이때의 메모리 아키텍쳐에 대한 생각도 필요함 텍스쳐는 upload/readback 불가능;
타입 | CPU Read | CPU Write | GPU Read | GPU Write | 의미 |
---|---|---|---|---|---|
default | X | X | O | O | VRAM 용, 업로드/리드백으로 상호작용 |
upload | X | O | O | X | CPU 한번 쓰기, GPU 한번 읽기 |
readback | O | X | X | O | GPU 한번 쓰기, CPU 한번 읽기 |
custom | ? | ? | ? | ? | UMA, 멀티 엔진 or GPU 등 특수한 케이스 사용 |
alignment 거시기
alignment | 비고 |
---|---|
0 | An alias for 64KB |
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT | #defined as 64KB |
D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT | #defined as 4MB. An application must decide whether the heap will contain multi-sample anti-aliasing (MSAA), in which case, the application must choose D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT. |
타입 | 크기 매핑 | 위치 매핑 | 편의 | 의미 |
---|---|---|---|---|
commited | 요구 크기 + alignment (64kb) | 알아서 해줌 | 힙 제어를 안해서 편함 | 큰/정적 리소스 |
placed | 요구 크기, 가상 공간 | 직접 제어 | residancy 명시적 제어 필요, 코드 개복잡해질 듯 | alignment 보다 매우 작은 리소스는 묶이용, 직접 GPU 메모리 제어 가능 |
reserved | 요구 크기 | 알아서 해줌 (잘라서) | 힙 제어는 안함, 잘라진 데이터 직접 올려야함 | virtual texturing 의 구현? texture streaming? |
설명들
요약
기준 | Root Constants |
Root Descriptor |
Root Table (Ref) |
---|---|---|---|
접근 | 직접 매핑 | 1차 간접 매핑 | 2차 간접 매핑 |
데이터 | 레지스터 번호/공간 | 디스크립터 | 디스크립터 범위 |
비고 | 32bit aligned 데이터 직접 쓰기, dynamic indexing 안됨 | 64bit gpu vaddr (SRV, UAV, CBV), dynamic indexing 가능 | 32bit table ranged ref (SRV, UAV, CBV, sampler) |
D3D_ROOT_SIGNATURE_VERSION_1_0 |
D3D_ROOT_SIGNATURE_VERSION_1_1 |
---|---|
걍 ㄱ | 여유 공간이 있으면, 인라이닝 (간접 참조 횟수 줄이기) |
이름 | 대상 | 비고 | 디펄트 |
---|---|---|---|
Static Descriptors | 디스크립터 | RS 바인딩 이후, 안바뀜 | cbv, srv |
Volatile Descriptors | 디스크립터 | RS 바인딩 이후, 바뀜, 디스크립터 | uav |
Static Data | 리소스 | RS -> 디스크립터 참조 이후 안바뀜 가정 | relative descriptor? |
Static Data While Set At Execute | 리소스? | 실행하는 동안은 안바뀜; | relative descriptor? |
Volatile Data | 리소스? | 실행하는 동안 쥰내 바뀌기 가능 | 버젼 1.0 모든 디스크립터 |
용도 | table versioning | dynamic indexing | put RS |
---|---|---|---|
디스크립터 참조 | 별도의 디스크립터 사용 (재사용/만듦) | 정적 디스크립터에 다 박아놓고 사용 | 그냥 때려 박음 |
선행조건 | 재사용하려면 GPU 실행이 끝나야함. | 잔뜩 세팅해야되서 오버헤드 추정? | RS 크기가 남아야함 |
그래서, 많은 디스크립터 테이블을 저장해서 각각 따로 놀게 할 수 있음. 각각 재사용도 가능?
+ 같은 디스크립터 테이블 오프셋에 두개 이상의 디스크립터 사용 가능, aliased descriptor
, D3D10_SHADER_RESOURCES_MAY_ALIAS
쉐이더 컴파일 옵션 써야함
RS 는 리소스 설정 모음이라면, PSO 는 그래픽스 파이프라인의 상태 설정 모음. 더 큰 집합임. 설정 가능한건 아래와 같음.
DX11 에서는 ID3D11BlendState, ID3D11DeviceContext::OMSetBlendState 를 사용해서 블렌딩 스테이트를 미리 처리 가능햇음.
상태 설정이나, PSO 에 저장이 아닌 커맨드 리스트에서 설정 모음
State | Method |
---|---|
Resource bindings | IASetIndexBufferIASetVertexBuffers, SOSetTargets, OMSetRenderTargets, SetDescriptorHeapsAll, SetGraphicsRoot... methodsAll SetComputeRoot... methods |
Viewports | RSSetViewports |
Scissor rects | RSSetScissorRects |
Blend factor | OMSetBlendFactor |
The depth stencil reference value | OMSetStencilRef |
The input-assembler primitive topology order and adjacency type | IASetPrimitiveTopology |
PSO 를 사용하는건 아무것도 상속 안함.
direct 는 아무것도 상속 안함. none-PSO 상태에선 ID3D12GraphicsCommandList::ClearState. 를 참조
번들은 PSO 제외, 토폴로지 제외하고 전부 상속함.
스벌 왜 버텍스 안나와!