cuda와 같은 GPGPU API처럼 D3D12에선 GPU의 Virtual Address를 직접 노출하고 있다. offset조작을 통해서 할당받은 Virtual Address범위 안에서는 자유롭게 사용하도록 하고 있다. 기존 API에서 ConstantBuffer,Texture등의 그래픽스 용어로 감추었던 추상화를 크게 제거했다.
[ID3D12Resource]
GPU와 메모리와 시스템메모리가 짝으로 이루어진 연속된 Memory Block. cuda로 치면 cudaMalloc()과 cudaMallocHost()를 짝으로 할당해서 객체화시킨것이다.
GPU와 메모리와 시스템메모리가 짝으로 이루어진 연속된 Memory Block. cuda로 치면 cudaMalloc()과 cudaMallocHost()를 짝으로 할당해서 객체화시킨것이다.
[Descriptor]
해당 메모리가 어떤 타입의 리소스로 사용될것인지, 시스템메모리 어드레스와 GPU메모리 어드레스를 기록해둔 작은 블럭. CreateShaderResouceView(), CreateConstantBufferView()을 사용해서 생성-이 아니고 디스크립터에 기록한다.
해당 메모리가 어떤 타입의 리소스로 사용될것인지, 시스템메모리 어드레스와 GPU메모리 어드레스를 기록해둔 작은 블럭. CreateShaderResouceView(), CreateConstantBufferView()을 사용해서 생성-이 아니고 디스크립터에 기록한다.
[Descriptor Heap]
디스크립터 또한 시스템 메모리와 GPU메모리의 짝으로 이루어진 메모리이므로 이것을 덩어리로 할당해서 그 안에서 어플리케이션이 쪼개 쓰도록 함. 그래서 할당할때부터 아예 Descriptor Heap이라는 연속된 메모리 블럭으로 주는 것이다.
디스크립터 또한 시스템 메모리와 GPU메모리의 짝으로 이루어진 메모리이므로 이것을 덩어리로 할당해서 그 안에서 어플리케이션이 쪼개 쓰도록 함. 그래서 할당할때부터 아예 Descriptor Heap이라는 연속된 메모리 블럭으로 주는 것이다.
이러한 변화에 따라 ConstantBuffer를 다루는 방법이 크게 바뀌었다.
D3D11에선 ID3D11Buffer하나당 VSSetConstantBuffer()하나씩 대응했다. 하나의 ConsantBuffer는 하나의 메모리 블럭을 의미했다.
D3D12에선 ID3D12Resource버퍼로 메모리 블럭 하나를 크게 잡고 그 안에서 여러개의 ContantBufferView를 만들어서 사용하는게 가능.
D3D12에선 ID3D12Resource버퍼로 메모리 블럭 하나를 크게 잡고 그 안에서 여러개의 ContantBufferView를 만들어서 사용하는게 가능.
그래서 CreateConstantBufferView()를 호출할때 파라미터로 ID3D12Resource가 아닌 ID3D12Resource가 가진 메모리 범위안에서의 어드레스 즉 GPU Virtual Address를 받는 것이다.