- Graphics pipeline states установленные через PSO (Pipeline state object) не наследуюся ни Direct Command List-ми, ни Bundle-ми. Начальное состояние для них указывается при создании (ID3D12Device::CreateCommandList( ) ). Если PSO не был указан, то используется default-ный. Текущий PSO можно заменить методом ID3D12GraphicsCommandList::SetPipelineState( )
- Bundle-ы наследуют все состояния (state-ы), которые не устанавливаются PSO (за исключением типа топологии примитивов). Топология примитивов всегда устанавливается в значение D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED в начале выполнения Bundle-а. Все не PSO state-ы устновленные в Bundle влияют на состояние родительского Command List-а. Например, если Bundle меняет вьюпорт (RSSetViewport), то измененный вьюпорт будет использоваться Command List-ом при последующем рендеринге, в том числе и в последующих Bundle-ах.
- Ресурсы, забинденные в Command List-e или в Bundle, так и остаются забинденными после Command List-а. Т.о. ими могут пользоваться последующие Command List-ы и Bundle-ы.
- Bundle-ы наследуют Root Signature от Command List-а. Если Bundle-у нужно поменять биндинги в Root Signature, то он должен снова назначить тот же Root Signature (все биндинги остаются действующими). Если Bundle меняет Root Signature, то биндинги становятся недействительными. Согласно MSDN, если Bundle не меняет биндинги, то и Root Signature может не назначать, но на практике на момент 12.10.2015 XBox One перезагружается или зависает, если Bundle не назначает Root Signature.
gfxsearcher_public
Мой личный "технический" блокнот. Точнее та часть, которая не покрывается NDA. Пишу статьи в первую очередь для себя.
понедельник, 12 октября 2015 г.
Про "наследование" состояний в Draw bundles
четверг, 8 октября 2015 г.
D3D12. Немного про Descriptors Tables.
Детали, собранные из разных мест MSDN
![]() |
| картинка из MSDN |
Code Snippet
- typedef enum D3D12_DESCRIPTOR_HEAP_TYPE
- {
- D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
- D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER,
- D3D12_DESCRIPTOR_HEAP_TYPE_RTV,
- D3D12_DESCRIPTOR_HEAP_TYPE_DSV,
- D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES
- } D3D12_DESCRIPTOR_HEAP_TYPE;
Constant Buffer View, Shader Resource View и Unordered Access View можно комбинировать в одной куче.
Создается куча методом:
Code Snippet
- HRESULT ID3D12Device::CreateDescriptorHeap(...)
Code Snippet
- HRESULT ID3D12Device::GetDescriptorHandleIncrementSize(...)
Code Snippet
- D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptorHandle = m_DescriptorHeap->GetCPUDescriptorHandleForHeapStart();
- D3D12_GPU_DESCRIPTOR_HANDLE gpuDescriptorHandle = m_DescriptorHeap->GetGPUDescriptorHandleForHeapStart();
Code Snippet
- descriptorHandle.ptr += idx * descriptorHandleIncrementSize;
Code Snippet
- HRESULT ID3D12Device::CreateConstantBufferView(...)
Code Snippet
- HRESULT ID3D12GraphicsCommandList::ClearRenderTargetView(...)
Code Snippet
- HRESULT ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable(...)
Шейдеры "видят" HEAP_TYPE_CBV_SRV_UAV и HEAP_TYPE_SAMPLER. Одновременно "активными" могут быть только по одной куче каждого из этих двух типов:
Code Snippet
- HRESULT ID3D12GraphicsCommandList::SetDescriptorHeaps(...)
Code Snippet
- const int ranges_num = 2;
- const int parameters_num = 2;
- CD3DX12_DESCRIPTOR_RANGE ranges[ranges_num];
- ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0);
- ranges[1].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
- CD3DX12_ROOT_PARAMETER rootParameters[parameters_num];
- rootParameters[0].InitAsDescriptorTable(1, &ranges[0], D3D12_SHADER_VISIBILITY_PIXEL);
- rootParameters[1].InitAsDescriptorTable(1, &ranges[1], D3D12_SHADER_VISIBILITY_VERTEX);
Code Snippet
- m_commandList->SetGraphicsRootDescriptorTable(0, m_SRV_CBR_DescriptorsHeap.GetGPUDescriptorHandleForHeapStart());
Code Snippet
- D3D12_GPU_DESCRIPTOR_HANDLE gpuCBVdescriptor = m_SRV_CBR_DescriptorsHeap.GetGPUDescriptorHandleForHeapStart();
- gpuCBVdescriptor.ptr += 2 * m_SRV_CBR_DescriptorsHeap.GetDescriptorIncrementSize();
- m_commandList->SetGraphicsRootDescriptorTable(1, gpuCBVdescriptor);
И в шейдере можно получить доступ к ресурсам указав нужные регистры:
Code Snippet
- Texture2D g_texture : register(t0);
- cbuffer g_constants: register(b0)
- {
- float4 offset;
- }
Про наследование состояния:
- Descriptor Table State неопределен в начале записи Command List-а и после того, как меняется Descriptors Heaps в Command List-е.
- Повторное назначение того же самого Descriptors Heap-а не приводит к неопределенному состоянию Descriptors Table State.
- В Draw Bundle назначать Descriptors Heaps можно только 1 раз. (Повторное назначение тех же самых куч не приводит к ошибке).
Подписаться на:
Сообщения (Atom)
