suhyeokkim / RenderFromScratch

my directx example & practises
0 stars 0 forks source link

dx12 튜토리얼 2 코딩 #19

Open suhyeokkim opened 2 years ago

suhyeokkim commented 2 years ago
suhyeokkim commented 2 years ago

정리 중..

heaps

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.

resources

타입 크기 매핑 위치 매핑 편의 의미
commited 요구 크기 + alignment (64kb) 알아서 해줌 힙 제어를 안해서 편함 큰/정적 리소스
placed 요구 크기, 가상 공간 직접 제어 residancy 명시적 제어 필요, 코드 개복잡해질 듯 alignment 보다 매우 작은 리소스는 묶이용, 직접 GPU 메모리 제어 가능
reserved 요구 크기 알아서 해줌 (잘라서) 힙 제어는 안함, 잘라진 데이터 직접 올려야함 virtual texturing 의 구현? texture streaming?

root signature

설명들

요약

기준 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 쉐이더 컴파일 옵션 써야함

pipeline state object

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

상태 상속 : direct vs bundle

PSO 를 사용하는건 아무것도 상속 안함.

direct 는 아무것도 상속 안함. none-PSO 상태에선 ID3D12GraphicsCommandList::ClearState. 를 참조

번들은 PSO 제외, 토폴로지 제외하고 전부 상속함.

suhyeokkim commented 2 years ago

스벌 왜 버텍스 안나와!