DirectX 12 기초 (1) AIP 자원 설명
- ID3D12Device
Direct3D 를 사용사기 위해서는 반드시 디바이스 생성을 해야 그래픽 작업이 가능해 진다
ID3D12Device는 하드웨어에 리소스 생성을 지기할수 있는 객체로써 아주 중요하다
밑에 나열한 함수 이름들이 다가 아니다 20가지가 넘는 자원을 생성 하는 함수들이 있다
ID3D12Device CreateCommandAllocator(); ID3D12Device.CreateCommandList(); ID3D12Device.CreateCommandSignature(); ID3D12Device.CreateCommandQueue(); ID3D12Device.CreateCommittedResource(); ID3D12Device.CreateComputePipelineState(); ID3D12Device.CreateConstantBufferView(); ID3D12Device.CreateDepthStencilView(); ID3D12Device.CreateDescriptorHeap(); ID3D12Device.CreateFence(); ID3D12Device.CreateGraphicsPipelineState(); ID3D12Device.CreateHeap(); ID3D12Device.CreatePlacedResource(); ID3D12Device.CreateRenderTargetView(); ............
ID3D12Device를 생성하는 방법은
D3D_FEATURE_LEVEL features[] = { D3D_FEATURE_LEVEL_12_1 , D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0 }; D3D_FEATURE_LEVEL featureLevel = features[0]; for (int i = 0; i < 4; i++) { featureLevel = features[i]; hr = D3D12CreateDevice(nullptr, featureLevel, IID_PPV_ARGS(&m_device)); if (hr == S_OK) break; }
- ID3D12CommandQueue
원문 : Provides methods for submitting command lists, synchronizing command list execution, instrumenting the command queue, and updating resource tile mappings.
Command List 실행을 동기화를 하고 Tile Mappings 리소스를 업데이트 합니다. 대부분 Command List들 을 관리하는 함수를 재공합니다.
ID3D12CommandQueue는 1개 이상의 그래픽 관련 명령(CommandList)들 을 저장하는 객체이다.
명령리스트(CommandList)는 그래픽스의 파이프라인에 설정되는 리소스 및 각종 상태등을 캡슐화한 객체이다
각 명령리스트들을 GPU 가 연속적으로 실행하게 되며 응용프로그램에서 명시적으로 명령큐에 제출해야한다
이미지 출처 https://software.intel.com/en-us/blogs/2014/08/22/direct3d-12-overview-part-6-command-lists
그림에서 보이듯이 명령 리스트들은 화면을 Clear -> Render 화면을 렌더링 하는 각각의 개별 명령들을 리스트로 담고 있다면
명령큐 는 각각의 개별 명령 리스트들을 담아서 보관하고 있는 것으로 보인다
멀티 쓰레드로 각각의 쓰레드당 명령 리스트가 있다면 그 명령 리스트들을 하나의 자료로 담아서 관리하는 객체가 명큐로 보인다
명령큐의 0번째 명령 리스트가 명령들을 다 끝내고나면 명령큐는 0번 명령 리스트를 없에고 1번 명령 리스트를 0번으로 만들고
다시 0번 리스트의 명령이 다 끝나고 나면 0번 리스트를 없에는 반복적인 흐름이로 보인다
ID3D12CommandQueue를 생성하는 방법은
D3D12_COMMAND_QUEUE_DESC queueDesc = {}; queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; queueDesc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL; queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; queueDesc.NodeMask = 0; RESULTISOK(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)));
Type : D3D12_COMMAND_LIST_TYPE {
D3D12_COMMAND_LIST_TYPE_DIRECT = 0,
D3D12_COMMAND_LIST_TYPE_BUNDLE = 1,
D3D12_COMMAND_LIST_TYPE_COMPUTE = 2,
D3D12_COMMAND_LIST_TYPE_COPY = 3
}
D3D12_COMMAND_LIST_TYPE_DIRECT
GPU가 실행할 수있는 명령어 버퍼를 지정합니다. 직접 명령 목록은 GPU의 상태를 상속하지 않습니다.
일반적인 사용에서 쓰이는것으로 보인다
D3D12_COMMAND_LIST_TYPE_BUNDLE
직접 명령 목록을 통해 만 직접 실행할 수있는 명령어 버퍼를 지정합니다.
번들 명령 목록 (현재 설정되어있는 파이프 라인 상태 개체 및 기본 토폴로지 제외) 모든 GPU 상태를 상속합니다.
유니티의 프리펩? 처럼 재사용에 용이하게 쓰일거라 생각함
D3D12_COMMAND_LIST_TYPE_COMPUTE
컴퓨팅 명령 버퍼를 지정한다.
D3D12_COMMAND_LIST_TYPE_COPY
복사 (도면)에 대한 명령 버퍼를 지정합니다.
Priority : D3D12_COMMAND_QUEUE_PRIORITY {
D3D12_COMMAND_QUEUE_PRIORITY_NORMAL = 0,
D3D12_COMMAND_QUEUE_PRIORITY_HIGH = 100
}
같은 명령 대기열에 대한 우선 순위, D3D12_COMMAND_QUEUE_PRIORITY의 열거 상수는
정상 또는 높은 우선 순위를 선택합니다.
D3D12_COMMAND_QUEUE_PRIORITY_NORMAL
보통 우선 순위.
D3D12_COMMAND_QUEUE_PRIORITY_HIGH
우선 순위가 높은.
Flags : D3D12_COMMAND_QUEUE_FLAGS {
D3D12_COMMAND_QUEUE_FLAG_NONE = 0,
D3D12_COMMAND_QUEUE_FLAG_DISABLE_GPU_TIMEOUT = 0x1
}
D3D12_COMMAND_QUEUE_FLAG_NONE
기본 명령 대기열을 나타냅니다.
D3D12_COMMAND_QUEUE_FLAG_DISABLE_GPU_TIMEOUT
GPU 시간 제한이 명령 큐 사용 중지해야 함을 나타냅니다.
NodeMask 멀티 어댑터에 관한 설정 값인거 같다 0 을 지정하면 하나의 GPU를 사용한다 자세한것은 추후에 알아본다
- IDXGISwapChain
'Programming > DirectX 12' 카테고리의 다른 글
DX12 리소스 기초 (상수버퍼 텍스쳐) (0) | 2019.12.24 |
---|---|
DX12 다중 스레드 렌더링 (0) | 2017.12.18 |