Skip to content

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.0
  • VkPhysicalDeviceVulkan12Features.shaderSampledImageArrayNonUniformIndexing (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.shaderStorageBufferArrayNonUniformIndexing (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.descriptorBindingSampledImageUpdateAfterBind (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.descriptorBindingStorageBufferUpdateAfterBind (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.descriptorBindingPartiallyBound (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.runtimeDescriptorArray (needs yes): not guaranteed by 1.0, 1.3
  • VkPhysicalDeviceVulkan12Features.timelineSemaphore (needs yes): not guaranteed by 1.0
  • VkPhysicalDeviceVulkan12Features.bufferDeviceAddress (needs yes): not guaranteed by 1.0
  • VkPhysicalDeviceVulkan13Features.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