The Direct3D 12 Core 1.0 Feature Level
The Core 1.0 Feature Level is a subset of the full Direct3D 12 feature set. Core 1.0 Feature Level can be exposed by a category of devices known as compute-only devices. The overall driver model for compute-only devices is the Microsoft Compute Driver Model (MCDM). MCDM is a scaled-down peer of the Windows Device Driver Model (WDDM), which has a larger scope.
A device that supports only the features within a Core Feature Level is known as a Core device.
Note
Compute-only device, MCDM device, Core Feature Level device, and Core device all mean the same thing. We'll prefer Core device for simplicity.
Creating a Core device
In general, to create a Direct3D 12 device, you call the D3D12CreateDevice function, and specify a minimum feature level.
If you specify a feature level of 9 through 12, then the device that's returned is a feature-rich device, such as a traditional GPU (which supports a superset of the functionality of a Core device). A Core device is never returned for that range of feature levels.
On the other hand, if you specify a Core feature level (for example, D3D_FEATURE_LEVEL::D3D_FEATURE_LEVEL_1_0_CORE), then the device that's returned could be feature-rich, or it could be a Core device.
// d3dcommon.h
D3D_FEATURE_LEVEL_1_0_CORE = 0x1000
If you specify a _CORE
feature level, then the runtime/debug layer validates that the features your application uses are allowed by that _CORE
feature level. That set of features is defined later in this topic.
Shader model for Core devices
A Core device supports Shader Model 5.0+.
The runtime performs conversion of 5.x non DXIL shader models to 6.0 DXIL. So the driver need only support 6.x.
Resource management model for Core devices
- Supported resource dimensions: raw and structured buffers only (no typed buffers, texture1d/2D, etc.)
- No support for reserved (tiled) resources
- No support for custom heaps
- No support for any of these heap flags:
- D3D12_HEAP_FLAG_HARDWARE_PROTECTED
- D3D12_HEAP_FLAG_ALLOW_WRITE_WATCH
- D3D12_HEAP_FLAG_ALLOW_DISPLAY
- D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS (note shader atomics are required, this flag is for another feature, cross adapter atomics)
Resource binding model for Core devices
- Support for resource binding tier 1 only
- Exceptions:
- No support for texture samplers
- Support for 64 UAVs like Feature Level 11.1+ (as opposed to only 8)
- Implementations do not have to implement bounds checking on shader accesses to resources through descriptors, out of bounds accesses produce undefined behavior.
- As a byproduct, the descriptor range flag D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS in root signatures is not supported.
- UAV/CBV descriptors can only be made on resources from default heaps (so no upload/readback heaps). This forces your application to do copies to get data across CPU<->GPU.
- Despite being the lowest binding capability tier, there are still some features required even in this tier worth calling out:
- Descriptor heaps can be updated after command lists are recorded (see D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE in the resource binding spec)
- Root descriptors are basically GPUVA pointers
- Even though there is no MMU / VA support, buffer VAs that are used in root descriptors can be emulated by implementations by doing address patching.
Structured buffer restrictions
Structured buffers must have a base address that is 4 byte aligned, and stride must be 2 or a multiple of 4. The case for a stride of 2 is for apps with 16 bit data, particularly given there is no support for typed buffers in D3D_FEATURE_LEVEL_1_0_CORE.
Stride specified in descriptors must match the stride specified in HLSL.
Command queue support for Core devices
Compute and copy queues only (no 3D, video, etc. queues).
Shader support for Core devices
Compute shaders only, no graphics shaders (Vertex, Pixel Shaders, etc.) nor any related functionality such as render targets, swap chains, input assembler.
Arithmetic precision
Core devices do not have to support denorms for 16 bit floating point operations.
Supported APIs for Core devices
The list below represents the supported subset of the full application programming interface (APIs that are not supported in Core 1.0 Feature Level are not listed).
ID3D12Device methods
- 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
ID3D12Device1 methods
- ID3D12Device1::CreatePipelineLibrary
- ID3D12Device1::SetEventOnMultipleFenceCompletion
- ID3D12Device1::SetResidencySetEventOnMultipleFenceCompletionPriority
ID3D12Device2 methods
ID3D12Device3 methods
- ID3D12Device3::OpenExistingHeapFromAddress
- ID3D12Device3::OpenExistingHeapFromFileMapping
- ID3D12Device3::EnqueueMakeResident
ID3D12Device4 methods
ID3D12Device5 methods
- ID3D12Device5::CreateMetaCommand
- ID3D12Device5::CreateStateObject
- ID3D12Device5::EnumerateMetaCommandParameters
- ID3D12Device5::EnumerateMetaCommands
- ID3D12Device5::RemoveDevice
ID3D12CommandQueue methods
- ID3D12CommandQueue::BeginEvent
- ID3D12CommandQueue::EndEvent
- ID3D12CommandQueue::ExecuteCommandLists
- ID3D12CommandQueue::GetClockCalibration
- ID3D12CommandQueue::GetDesc
- ID3D12CommandQueue::GetTimestampFrequency
- ID3D12CommandQueue::SetMarker
- ID3D12CommandQueue::Signal
- ID3D12CommandQueue::Wait
ID3D12CommandList methods
ID3D12GraphicsCommandList methods
- 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