Portability: what this build needs, and what each profile guarantees¶
From the SDK the build found: vk.xml at header version 357, and the profiles VP_LUNARG_minimum_requirements_1_0, VP_LUNARG_minimum_requirements_1_3, VP_KHR_roadmap_2022 (C:\VulkanSDK\1.4.357.0\Config\VK_LAYER_KHRONOS_profiles). The roadmap column is the roadmap merged over Vulkan 1.3's minimums, since a profile states only what it raises. The need column is the declared table (tools/lusine/portability.py): the engine's own rows today, the passes' when the generator fills them; a member the build does not constrain is blank. The engine compares a device against the need alone; these columns never refuse a run.
Needs a profile does not guarantee, so a device meeting that profile may still refuse this build:
VkPhysicalDeviceVulkan12Features.descriptorIndexing(needs yes): not guaranteed by 1.0VkPhysicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.descriptorBindingPartiallyBound(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.runtimeDescriptorArray(needs yes): not guaranteed by 1.0, 1.3VkPhysicalDeviceVulkan12Features.timelineSemaphore(needs yes): not guaranteed by 1.0VkPhysicalDeviceVulkan12Features.bufferDeviceAddress(needs yes): not guaranteed by 1.0VkPhysicalDeviceVulkan13Features.synchronization2(needs yes): not guaranteed by 1.0
Limits¶
| Member | Type | Limit type | Needs | 1.0 | 1.3 | roadmap 2022 |
|---|---|---|---|---|---|---|
maxImageDimension1D |
uint32_t | max | 4096 | 4096 | 8192 | |
maxImageDimension2D |
uint32_t | max | 4096 | 4096 | 8192 | |
maxImageDimension3D |
uint32_t | max | 256 | 256 | 256 | |
maxImageDimensionCube |
uint32_t | max | 4096 | 4096 | 8192 | |
maxImageArrayLayers |
uint32_t | max | 256 | 256 | 2048 | |
maxTexelBufferElements |
uint32_t | max | 65536 | 65536 | 65536 | |
maxUniformBufferRange |
uint32_t | max | 16384 | 16384 | 65536 | |
maxStorageBufferRange |
uint32_t | max | 134217728 | 134217728 | 134217728 | |
maxPushConstantsSize |
uint32_t | max | 128 | 128 | 128 | |
maxMemoryAllocationCount |
uint32_t | max | 4096 | 4096 | 4096 | |
maxSamplerAllocationCount |
uint32_t | max | 4000 | 4000 | 4000 | |
bufferImageGranularity |
VkDeviceSize | min,mul | 131072 | 131072 | 4096 | |
sparseAddressSpaceSize |
VkDeviceSize | max | 0 | 0 | 0 | |
maxBoundDescriptorSets |
uint32_t | max | 1 | 4 | 4 | 4 |
maxPerStageDescriptorSamplers |
uint32_t | max | 1 | 16 | 16 | 64 |
maxPerStageDescriptorUniformBuffers |
uint32_t | max | 12 | 12 | 15 | |
maxPerStageDescriptorStorageBuffers |
uint32_t | max | 4 | 4 | 30 | |
maxPerStageDescriptorSampledImages |
uint32_t | max | 1 | 16 | 16 | 200 |
maxPerStageDescriptorStorageImages |
uint32_t | max | 4 | 4 | 16 | |
maxPerStageDescriptorInputAttachments |
uint32_t | max | 4 | 4 | 4 | |
maxPerStageResources |
uint32_t | max | 128 | 128 | 200 | |
maxDescriptorSetSamplers |
uint32_t | max | 96 | 96 | 576 | |
maxDescriptorSetUniformBuffers |
uint32_t | max | 72 | 72 | 90 | |
maxDescriptorSetUniformBuffersDynamic |
uint32_t | max | 8 | 8 | 8 | |
maxDescriptorSetStorageBuffers |
uint32_t | max | 24 | 24 | 96 | |
maxDescriptorSetStorageBuffersDynamic |
uint32_t | max | 4 | 4 | 4 | |
maxDescriptorSetSampledImages |
uint32_t | max | 96 | 96 | 1800 | |
maxDescriptorSetStorageImages |
uint32_t | max | 24 | 24 | 144 | |
maxDescriptorSetInputAttachments |
uint32_t | max | 4 | 4 | 4 | |
maxVertexInputAttributes |
uint32_t | max | 3 | 16 | 16 | 16 |
maxVertexInputBindings |
uint32_t | max | 16 | 16 | 16 | |
maxVertexInputAttributeOffset |
uint32_t | max | 2047 | 2047 | 2047 | |
maxVertexInputBindingStride |
uint32_t | max | 2048 | 2048 | 2048 | |
maxVertexOutputComponents |
uint32_t | max | 64 | 64 | 64 | |
maxTessellationGenerationLevel |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationPatchSize |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationControlPerVertexInputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationControlPerVertexOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationControlPerPatchOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationControlTotalOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationEvaluationInputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxTessellationEvaluationOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxGeometryShaderInvocations |
uint32_t | max | 0 | 0 | 0 | |
maxGeometryInputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxGeometryOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxGeometryOutputVertices |
uint32_t | max | 0 | 0 | 0 | |
maxGeometryTotalOutputComponents |
uint32_t | max | 0 | 0 | 0 | |
maxFragmentInputComponents |
uint32_t | max | 64 | 64 | 64 | |
maxFragmentOutputAttachments |
uint32_t | max | 4 | 4 | 4 | |
maxFragmentDualSrcAttachments |
uint32_t | max | 0 | 0 | 0 | |
maxFragmentCombinedOutputResources |
uint32_t | max | 4 | 4 | 16 | |
maxComputeSharedMemorySize |
uint32_t | max | 16384 | 16384 | 16384 | |
maxComputeWorkGroupCount |
uint32_t | max | 65535, 65535, 65535 | 65535, 65535, 65535 | 65535, 65535, 65535 | |
maxComputeWorkGroupInvocations |
uint32_t | max | 128 | 128 | 256 | |
maxComputeWorkGroupSize |
uint32_t | max | 128, 128, 64 | 128, 128, 64 | 256, 256, 64 | |
subPixelPrecisionBits |
uint32_t | bits | 4 | 4 | 4 | |
subTexelPrecisionBits |
uint32_t | bits | 4 | 4 | 8 | |
mipmapPrecisionBits |
uint32_t | bits | 4 | 4 | 6 | |
maxDrawIndexedIndexValue |
uint32_t | max | 16777216 | 16777216 | 16777216 | |
maxDrawIndirectCount |
uint32_t | max | 1 | 1 | 1 | |
maxSamplerLodBias |
float | max | 2 | 2 | 14 | |
maxSamplerAnisotropy |
float | max | 1 | 1 | 1 | |
maxViewports |
uint32_t | max | 1 | 1 | 1 | |
maxViewportDimensions |
uint32_t | max | 4096, 4096 | 4096, 4096 | 4096, 4096 | |
viewportBoundsRange |
float | range | -8192, 8192 | -8192, 8192 | -8192, 8192 | |
viewportSubPixelBits |
uint32_t | bits | 0 | 0 | 0 | |
minMemoryMapAlignment |
size_t | max,pot | 64 | 64 | 64 | |
minTexelBufferOffsetAlignment |
VkDeviceSize | min,pot | 256 | 256 | 256 | |
minUniformBufferOffsetAlignment |
VkDeviceSize | min,pot | 256 | 256 | 256 | |
minStorageBufferOffsetAlignment |
VkDeviceSize | min,pot | 256 | 256 | 256 | |
minTexelOffset |
int32_t | min | -8 | -8 | -8 | |
maxTexelOffset |
uint32_t | max | 7 | 7 | 7 | |
minTexelGatherOffset |
int32_t | min | -8 | -8 | -8 | |
maxTexelGatherOffset |
uint32_t | max | 7 | 7 | 7 | |
minInterpolationOffset |
float | min | 0 | 0 | 0 | |
maxInterpolationOffset |
float | max | 0 | 0 | 0 | |
subPixelInterpolationOffsetBits |
uint32_t | bits | 0 | 0 | 0 | |
maxFramebufferWidth |
uint32_t | max | 4096 | 4096 | 4096 | |
maxFramebufferHeight |
uint32_t | max | 4096 | 4096 | 4096 | |
maxFramebufferLayers |
uint32_t | max | 256 | 256 | 256 | |
framebufferColorSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
framebufferDepthSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
framebufferStencilSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
framebufferNoAttachmentsSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
maxColorAttachments |
uint32_t | max | 4 | 4 | 7 | |
sampledImageColorSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
sampledImageIntegerSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
sampledImageDepthSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
sampledImageStencilSampleCounts |
VkSampleCountFlags | bitmask | 1, 4 | 1, 4 | 1, 4 | |
storageImageSampleCounts |
VkSampleCountFlags | bitmask | 1 | 1 | 1 | |
maxSampleMaskWords |
uint32_t | max | 1 | 1 | 1 | |
timestampComputeAndGraphics |
VkBool32 | max | ||||
timestampPeriod |
float | min,mul | ||||
maxClipDistances |
uint32_t | max | 0 | 0 | 0 | |
maxCullDistances |
uint32_t | max | 0 | 0 | 0 | |
maxCombinedClipAndCullDistances |
uint32_t | max | 0 | 0 | 0 | |
discreteQueuePriorities |
uint32_t | max | 2 | 2 | 2 | |
pointSizeRange |
float | range | 1.0, 1.0 | 1.0, 1.0 | 1.0, 1.0 | |
lineWidthRange |
float | range | 1.0, 1.0 | 1.0, 1.0 | 1.0, 1.0 | |
pointSizeGranularity |
float | min,mul | 1 | 1 | 1 | |
lineWidthGranularity |
float | min,mul | 1 | 1 | 1 | |
strictLines |
VkBool32 | max | ||||
standardSampleLocations |
VkBool32 | max | yes | |||
optimalBufferCopyOffsetAlignment |
VkDeviceSize | min,pot | ||||
optimalBufferCopyRowPitchAlignment |
VkDeviceSize | min,pot | ||||
nonCoherentAtomSize |
VkDeviceSize | min,pot | 256 | 256 | 256 |
Features¶
Every feature a column guarantees or the build needs.
| Struct | Feature | Needs | 1.0 | 1.3 | roadmap 2022 |
|---|---|---|---|---|---|
| VkPhysicalDeviceFeatures | robustBufferAccess |
yes | yes | yes | |
| VkPhysicalDeviceFeatures | fullDrawIndexUint32 |
yes | |||
| VkPhysicalDeviceFeatures | imageCubeArray |
yes | |||
| VkPhysicalDeviceFeatures | independentBlend |
yes | |||
| VkPhysicalDeviceFeatures | sampleRateShading |
yes | |||
| VkPhysicalDeviceFeatures | drawIndirectFirstInstance |
yes | |||
| VkPhysicalDeviceFeatures | depthClamp |
yes | |||
| VkPhysicalDeviceFeatures | depthBiasClamp |
yes | |||
| VkPhysicalDeviceFeatures | samplerAnisotropy |
yes | |||
| VkPhysicalDeviceFeatures | occlusionQueryPrecise |
yes | |||
| VkPhysicalDeviceFeatures | fragmentStoresAndAtomics |
yes | |||
| VkPhysicalDeviceFeatures | shaderStorageImageExtendedFormats |
yes | |||
| VkPhysicalDeviceFeatures | shaderUniformBufferArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceFeatures | shaderSampledImageArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceFeatures | shaderStorageBufferArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceFeatures | shaderStorageImageArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceFeatures | shaderInt64 |
yes | |||
| VkPhysicalDeviceGlobalPriorityQueryFeatures | globalPriorityQuery |
yes | |||
| VkPhysicalDeviceAccelerationStructureFeaturesKHR | accelerationStructure |
yes | |||
| VkPhysicalDeviceRayQueryFeaturesKHR | rayQuery |
yes | |||
| VkPhysicalDeviceVulkan11Features | multiview |
yes | yes | ||
| VkPhysicalDeviceVulkan11Features | samplerYcbcrConversion |
yes | |||
| VkPhysicalDeviceVulkan12Features | samplerMirrorClampToEdge |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | drawIndirectCount |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderBufferInt64Atomics |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorIndexing |
yes ⚠ | yes | yes | |
| VkPhysicalDeviceVulkan12Features | shaderUniformTexelBufferArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | shaderStorageTexelBufferArrayDynamicIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | shaderUniformBufferArrayNonUniformIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | shaderSampledImageArrayNonUniformIndexing |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderStorageBufferArrayNonUniformIndexing |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderStorageImageArrayNonUniformIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | shaderUniformTexelBufferArrayNonUniformIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | shaderStorageTexelBufferArrayNonUniformIndexing |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorBindingSampledImageUpdateAfterBind |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | descriptorBindingStorageImageUpdateAfterBind |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorBindingStorageBufferUpdateAfterBind |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | descriptorBindingUniformTexelBufferUpdateAfterBind |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorBindingStorageTexelBufferUpdateAfterBind |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorBindingUpdateUnusedWhilePending |
yes | |||
| VkPhysicalDeviceVulkan12Features | descriptorBindingPartiallyBound |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | descriptorBindingVariableDescriptorCount |
yes | |||
| VkPhysicalDeviceVulkan12Features | runtimeDescriptorArray |
yes ⚠ | yes | ||
| VkPhysicalDeviceVulkan12Features | samplerFilterMinmax |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | scalarBlockLayout |
yes | |||
| VkPhysicalDeviceVulkan12Features | imagelessFramebuffer |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | uniformBufferStandardLayout |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderSubgroupExtendedTypes |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | separateDepthStencilLayouts |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | hostQueryReset |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | timelineSemaphore |
yes ⚠ | yes | yes | |
| VkPhysicalDeviceVulkan12Features | bufferDeviceAddress |
yes ⚠ | yes | yes | |
| VkPhysicalDeviceVulkan12Features | vulkanMemoryModel |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | vulkanMemoryModelDeviceScope |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderOutputViewportIndex |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | shaderOutputLayer |
yes | yes | ||
| VkPhysicalDeviceVulkan12Features | subgroupBroadcastDynamicId |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | robustImageAccess |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | inlineUniformBlock |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | descriptorBindingInlineUniformBlockUpdateAfterBind |
yes | |||
| VkPhysicalDeviceVulkan13Features | pipelineCreationCacheControl |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | privateData |
yes | |||
| VkPhysicalDeviceVulkan13Features | shaderDemoteToHelperInvocation |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | shaderTerminateInvocation |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | subgroupSizeControl |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | computeFullSubgroups |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | synchronization2 |
yes ⚠ | yes | yes | |
| VkPhysicalDeviceVulkan13Features | shaderZeroInitializeWorkgroupMemory |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | dynamicRendering |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | shaderIntegerDotProduct |
yes | yes | ||
| VkPhysicalDeviceVulkan13Features | maintenance4 |
yes | yes |
Why the build needs what it needs¶
| Member | Needs | Why |
|---|---|---|
VkPhysicalDeviceVulkan12Features.timelineSemaphore |
yes | the step counter is a timeline value: the channel's as_of, the readout latency and run wait on it |
VkPhysicalDeviceVulkan12Features.descriptorIndexing |
yes | the game's one descriptor set (M4 item 4b) is indexed at runtime |
VkPhysicalDeviceVulkan12Features.runtimeDescriptorArray |
yes | the game's one set's arrays are runtime-sized in the shaders (M4 item 4b) |
VkPhysicalDeviceVulkan12Features.descriptorBindingPartiallyBound |
yes | an element of the game's set the game does not use is never written |
VkPhysicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind |
yes | the game's buffer array is written once, after the passes that bind it |
VkPhysicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind |
yes | the game's image array is written at load and on the asset store's reload |
VkPhysicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing |
yes | a dynamic index into the buffer array is nonuniformEXT |
VkPhysicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing |
yes | a dynamic index into the image array is nonuniformEXT |
VkPhysicalDeviceVulkan13Features.synchronization2 |
yes | the step's barriers, events and submissions are sync2's |
VkPhysicalDeviceVulkan12Features.bufferDeviceAddress |
yes | the allocator is created with buffer device addresses |
VkPhysicalDeviceVulkan12Features.shaderBufferInt64Atomics |
yes | 64-bit atomics on storage buffers, where a game's passes use them, until each pass declares its own features |
VkPhysicalDeviceFeatures.shaderInt64 |
yes | the 64-bit integers those atomics need, until each pass declares its own |
VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure |
yes | a bounded table's boxes are built into an acceleration structure, which a unit's ray_query arm traverses |
VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery |
yes | a unit's ray_query arm runs a variant shader whose rays query that structure |
VkPhysicalDeviceLimits.maxBoundDescriptorSets |
1 | ImGui binds one set |
VkPhysicalDeviceLimits.maxPerStageDescriptorSamplers |
1 | ImGui samples its font atlas with one sampler |
VkPhysicalDeviceLimits.maxPerStageDescriptorSampledImages |
1 | ImGui samples one image |
VkPhysicalDeviceLimits.maxVertexInputAttributes |
3 | ImGui's vertex: position, texture coordinate, colour |