O nível de recurso do Direct3D 12 Core 1.0
O nível de recursos Core 1.0 é um subconjunto do conjunto completo de recursos do Direct3D 12. O nível de recurso do Core 1.0 pode ser exposto por uma categoria de dispositivos conhecidos como dispositivos somente de computação. O modelo geral de driver para dispositivos somente de computação é o Microsoft Compute Driver Model (MCDM). O MCDM é uma versão reduzida do Windows Device Driver Model (WDDM), que tem um escopo maior.
Um dispositivo que oferece suporte apenas aos recursos em um nível de recurso Core é conhecido como dispositivo Core.
Observação
Dispositivo somente de computação, dispositivo MCDM, dispositivo de nível de recurso Core e dispositivo Core significam todos a mesma coisa. Preferimos dispositivo Core para simplificar.
Criar um dispositivo Core
Em geral, para criar um dispositivo Direct3D 12, chame a função D3D12CreateDevice e especifique um nível mínimo de recurso.
Se você especificar um nível de recurso de 9 a 12, o dispositivo retornado será rico em recursos, como uma GPU tradicional (que suporta um superconjunto da funcionalidade de um dispositivo Core). Um dispositivo Core nunca é retornado para esse intervalo de níveis de recursos.
Por outro lado, se você especificar um nível de recurso Core (por exemplo, D3D_FEATURE_LEVEL::D 3D_FEATURE_LEVEL_1_0_CORE), o dispositivo retornado poderá ser rico em recursos ou poderá ser um dispositivo Core.
// d3dcommon.h
D3D_FEATURE_LEVEL_1_0_CORE = 0x1000
Se você especificar um _CORE
nível de recurso, a camada de tempo de execução/depuração validará se os recursos que o aplicativo usa são permitidos por esse _CORE
nível de recurso. Esse conjunto de recursos será definido posteriormente neste tópico.
Modelo de sombreador para dispositivos Core
Um dispositivo Core dá suporte ao Shader Model 5.0+.
O runtime realiza a conversão de modelos de sombreadores 5.x não DXIL para 6.0 DXIL. Portanto, o driver só precisa ser compatível com a versão 6.x.
Modelo de gerenciamento de recursos para dispositivos Core
- Dimensões de recursos compatíveis: somente buffers brutos e estruturados (sem buffers digitados, texture1d/2D, etc.)
- Não há suporte para recursos reservados (lado a lado)
- Não há suporte para heaps personalizados
- Não há suporte para nenhum desses sinalizadores de heap:
- D3D12_HEAP_FLAG_HARDWARE_PROTECTED
- D3D12_HEAP_FLAG_ALLOW_WRITE_WATCH
- D3D12_HEAP_FLAG_ALLOW_DISPLAY
- D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS (observe que os atômicos do sombreador são necessários, esse sinalizador é para outro recurso, atômicos de adaptador cruzado)
Modelo de associação de recursos para dispositivos Core
- Suporte apenas para associação de recursos camada 1
- Exceções:
- Não há suporte para amostras de textura
- Suporte para 64 UAVs como o nível de recurso 11.1+ (em vez de apenas 8)
- As implementações não precisam realizar a verificação de limites nos acessos do sombreador aos recursos por meio de descritores, pois os acessos fora dos limites produzem um comportamento indefinido.
- Como subproduto, não há suporte para o sinalizador de intervalo de descritor D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS em assinaturas raiz.
- Os descritores UAV/CBV só podem ser feitos em recursos de heaps padrão (portanto, não há heaps de upload e readback). Isso força seu aplicativo a fazer cópias para obter dados entre a CPU<->e GPU.
- Apesar de ser o nível mais baixo de capacidade de associação, ainda há alguns recursos necessários, mesmo nesse nível, que vale a pena destacar:
- Os heaps do descritor podem ser atualizados depois que as listas de comandos são registradas (consulte D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE na especificação de associação de recursos)
- Os descritores raiz são basicamente ponteiros GPUVA
- Embora não haja suporte a MMU/VA, os VAs de buffer usados nos descritores raiz podem ser emulados pelas implementações por meio de patches de endereço.
Restrições de buffer estruturado
Os buffers estruturados devem ter um endereço base alinhado a 4 bytes, e o stride deve ser 2 ou um múltiplo de 4. O caso de um stride de 2 é para aplicativos com dados de 16 bits, principalmente porque não há suporte para buffers digitados no D3D_FEATURE_LEVEL_1_0_CORE.
O stride especificado nos descritores deve corresponder ao stride especificado em HLSL.
Suporte à fila de comandos para dispositivos Core
Somente filas de computação e cópia (sem filas de 3D, vídeo etc.).
Suporte de sombreador para dispositivos Core
Somente sombreadores de computação, sem sombreadores gráficos (Vertex, Pixel Shaders etc.) nem qualquer funcionalidade relacionada, como destinos de renderização, cadeias de troca, montador de entrada.
Precisão aritmética
Os dispositivos Core não precisam suportar desnormas para operações de ponto flutuante de 16 bits.
APIs suportadas para dispositivos Core
A lista abaixo representa o subconjunto com suporte da interface de programação de aplicativo completa (as APIs que não são suportadas no nível de recurso do Core 1.0 não são listadas).
Métodos ID3D12Device
- ID3D12Device::CheckFeatureSupport
- ID3D12Device::CopyDescriptors
- ID3D12Device::CopyDescriptorsSimple
- ID3D12Device::CreateCommandAllocator
- ID3D12Device::CreateCommandList
- ID3D12Device::CreateCommandQueue
- ID3D12Device::CreateCommandSignature
- ID3D12Device::CreateCommittedResource
- ID3D12Device::CreateComputePipelineState
- ID3D12Device::CreateConstantBufferView
- ID3D12Device::CreateDescriptorHeap
- ID3D12Device::CreateFence
- ID3D12Device::CreateHeap
- ID3D12Device::CreatePlacedResource
- ID3D12Device::CreateQueryHeap
- ID3D12Device::CreateRootSignature
- ID3D12Device::CreateShaderResourceView
- ID3D12Device::CreateSharedHandle
- ID3D12Device::CreateUnorderedAccessView
- ID3D12Device::Evict
- ID3D12Device::GetAdapterLuid
- ID3D12Device::GetCopyableFootprints
- ID3D12Device::GetCustomHeapProperties
- ID3D12Device::GetDescriptorHandleIncrementSize
- ID3D12Device::GetDeviceRemovedReason
- ID3D12Device::GetNodeCount
- ID3D12Device::GetResourceAllocationInfo
- ID3D12Device::MakeResident
- ID3D12Device::OpenSharedHandle
- ID3D12Device::OpenSharedHandleByName
- ID3D12Device::SetStablePowerState
Métodos ID3D12Device1
- ID3D12Device1::CreatePipelineLibrary
- ID3D12Device1::SetEventOnMultipleFenceCompletion
- ID3D12Device1::SetResidencySetEventOnMultipleFenceCompletionPriority
Métodos ID3D12Device2
Métodos ID3D12Device3
- ID3D12Device3::OpenExistingHeapFromAddress
- ID3D12Device3::OpenExistingHeapFromFileMapping
- ID3D12Device3::EnqueueMakeResident
Métodos ID3D12Device4
Métodos ID3D12Device5
- ID3D12Device5::CreateMetaCommand
- ID3D12Device5::CreateStateObject
- ID3D12Device5::EnumerateMetaCommandParameters
- ID3D12Device5::EnumerateMetaCommands
- ID3D12Device5::RemoveDevice
Métodos ID3D12CommandQueue
- ID3D12CommandQueue::BeginEvent
- ID3D12CommandQueue::EndEvent
- ID3D12CommandQueue::ExecuteCommandLists
- ID3D12CommandQueue::GetClockCalibration
- ID3D12CommandQueue::GetDesc
- ID3D12CommandQueue::GetTimestampFrequency
- ID3D12CommandQueue::SetMarker
- ID3D12CommandQueue::Signal
- ID3D12CommandQueue::Wait
Métodos ID3D12CommandList
Métodos ID3D12GraphicsCommandList
- ID3D12GraphicsCommandList::BeginEvent
- ID3D12GraphicsCommandList::BeginQuery
- ID3D12GraphicsCommandList::ClearState
- ID3D12GraphicsCommandList::ClearUnorderedAccessViewFloat
- ID3D12GraphicsCommandList::ClearUnorderedAccessViewUint
- ID3D12GraphicsCommandList::Close
- ID3D12GraphicsCommandList::CopyBufferRegion
- ID3D12GraphicsCommandList::CopyResource
- ID3D12GraphicsCommandList::CopyTextureRegion
- ID3D12GraphicsCommandList::Dispatch
- ID3D12GraphicsCommandList::EndEvent
- ID3D12GraphicsCommandList::EndQuery
- ID3D12GraphicsCommandList::Reset
- ID3D12GraphicsCommandList::ResolveQueryData
- ID3D12GraphicsCommandList::ResourceBarrier
- ID3D12GraphicsCommandList::SetComputeRoot32BitConstant
- ID3D12GraphicsCommandList::SetComputeRoot32BitConstants
- ID3D12GraphicsCommandList::SetComputeRootConstantBufferView
- ID3D12GraphicsCommandList::SetComputeRootDescriptorTable
- ID3D12GraphicsCommandList::SetComputeRootShaderResourceView
- ID3D12GraphicsCommandList::SetComputeRootSignature
- ID3D12GraphicsCommandList::SetComputeRootUnorderedAccessView
- ID3D12GraphicsCommandList::SetDescriptorHeaps
- ID3D12GraphicsCommandList::SetMarker
- ID3D12GraphicsCommandList::SetPipelineState
- ID3D12GraphicsCommandList::SetPredication