// Copyright 2015-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

// This text fragment is used many times in the Devices and Queues, and
// Limits chapters for different behavior, property, and limit queries.
ifdef::hidden[]
// tag::limits_desc[]
If the sname:{refpage} structure is included in the pname:pNext chain of the
slink:VkPhysicalDeviceProperties2 structure passed to
flink:vkGetPhysicalDeviceProperties2, it is filled in with each
corresponding implementation-dependent property.
// end::limits_desc[]
endif::hidden[]


[[limits]]
= Limits

_Limits_ are implementation-dependent minimums, maximums, and other device
characteristics that an application may: need to be aware of.

ifdef::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]
[NOTE]
.Note
====
Limits are reported via the basic slink:VkPhysicalDeviceLimits structure as
well as the extensible structure sname:VkPhysicalDeviceProperties2, which
was added in `<<VK_KHR_get_physical_device_properties2>>` and included in
Vulkan 1.1.
When limits are added in future Vulkan versions or extensions, each
extension should: introduce one new limit structure, if needed.
This structure can: be added to the pname:pNext chain of the
sname:VkPhysicalDeviceProperties2 structure.
====
endif::VK_VERSION_1_1,VK_KHR_get_physical_device_properties2[]

[open,refpage='VkPhysicalDeviceLimits',desc='Structure reporting implementation-dependent physical device limits',type='structs']
--
The sname:VkPhysicalDeviceLimits structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceLimits.txt[]

The sname:VkPhysicalDeviceLimits are properties of the physical device.
These are available in the pname:limits member of the
slink:VkPhysicalDeviceProperties structure which is returned from
flink:vkGetPhysicalDeviceProperties.

  * [[limits-maxImageDimension1D]] pname:maxImageDimension1D is the largest
    dimension (pname:width) that is guaranteed to be supported for all
    images created with an pname:imageType of ename:VK_IMAGE_TYPE_1D.
    Some combinations of image parameters (format, usage, etc.) may: allow
    support for larger dimensions, which can: be queried using
    flink:vkGetPhysicalDeviceImageFormatProperties.
  * [[limits-maxImageDimension2D]] pname:maxImageDimension2D is the largest
    dimension (pname:width or pname:height) that is guaranteed to be
    supported for all images created with an pname:imageType of
    ename:VK_IMAGE_TYPE_2D and without
    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT set in pname:flags.
    Some combinations of image parameters (format, usage, etc.) may: allow
    support for larger dimensions, which can: be queried using
    flink:vkGetPhysicalDeviceImageFormatProperties.
  * [[limits-maxImageDimension3D]] pname:maxImageDimension3D is the largest
    dimension (pname:width, pname:height, or pname:depth) that is guaranteed
    to be supported for all images created with an pname:imageType of
    ename:VK_IMAGE_TYPE_3D.
    Some combinations of image parameters (format, usage, etc.) may: allow
    support for larger dimensions, which can: be queried using
    flink:vkGetPhysicalDeviceImageFormatProperties.
  * [[limits-maxImageDimensionCube]] pname:maxImageDimensionCube is the
    largest dimension (pname:width or pname:height) that is guaranteed to be
    supported for all images created with an pname:imageType of
    ename:VK_IMAGE_TYPE_2D and with
    ename:VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT set in pname:flags.
    Some combinations of image parameters (format, usage, etc.) may: allow
    support for larger dimensions, which can: be queried using
    flink:vkGetPhysicalDeviceImageFormatProperties.
  * [[limits-maxImageArrayLayers]] pname:maxImageArrayLayers is the maximum
    number of layers (pname:arrayLayers) for an image.
  * [[limits-maxTexelBufferElements]] pname:maxTexelBufferElements is the
    maximum number of addressable texels for a buffer view created on a
    buffer which was created with the
    ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or
    ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set in the pname:usage
    member of the slink:VkBufferCreateInfo structure.
  * [[limits-maxUniformBufferRange]] pname:maxUniformBufferRange is the
    maximum value that can: be specified in the pname:range member of a
    slink:VkDescriptorBufferInfo structure passed to
    flink:vkUpdateDescriptorSets for descriptors of type
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC.
  * [[limits-maxStorageBufferRange]] pname:maxStorageBufferRange is the
    maximum value that can: be specified in the pname:range member of a
    slink:VkDescriptorBufferInfo structure passed to
    flink:vkUpdateDescriptorSets for descriptors of type
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC.
  * [[limits-maxPushConstantsSize]] pname:maxPushConstantsSize is the
    maximum size, in bytes, of the pool of push constant memory.
    For each of the push constant ranges indicated by the
    pname:pPushConstantRanges member of the slink:VkPipelineLayoutCreateInfo
    structure, [eq]#(pname:offset {plus} pname:size)# must: be less than or
    equal to this limit.
  * [[limits-maxMemoryAllocationCount]] pname:maxMemoryAllocationCount is
    the maximum number of device memory allocations, as created by
    flink:vkAllocateMemory, which can: simultaneously exist.
  * [[limits-maxSamplerAllocationCount]] pname:maxSamplerAllocationCount is
    the maximum number of sampler objects, as created by
    flink:vkCreateSampler, which can: simultaneously exist on a device.
  * [[limits-bufferImageGranularity]] pname:bufferImageGranularity is the
    granularity, in bytes, at which buffer or linear image resources, and
    optimal image resources can: be bound to adjacent offsets in the same
    sname:VkDeviceMemory object without aliasing.
    See <<resources-bufferimagegranularity,Buffer-Image Granularity>> for
    more details.
  * [[limits-sparseAddressSpaceSize]] pname:sparseAddressSpaceSize is the
    total amount of address space available, in bytes, for sparse memory
    resources.
    This is an upper bound on the sum of the sizes of all sparse resources,
    regardless of whether any memory is bound to them.
  * [[limits-maxBoundDescriptorSets]] pname:maxBoundDescriptorSets is the
    maximum number of descriptor sets that can: be simultaneously used by a
    pipeline.
    All code:DescriptorSet decorations in shader modules must: have a value
    less than pname:maxBoundDescriptorSets.
    See <<descriptorsets-sets>>.
  * [[limits-maxPerStageDescriptorSamplers]]
    pname:maxPerStageDescriptorSamplers is the maximum number of samplers
    that can: be accessible to a single shader stage in a pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_SAMPLER or
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a shader stage when the pname:stageFlags
    member of the sname:VkDescriptorSetLayoutBinding structure has the bit
    for that shader stage set.
    See <<descriptorsets-sampler>> and
    <<descriptorsets-combinedimagesampler>>.
  * [[limits-maxPerStageDescriptorUniformBuffers]]
    pname:maxPerStageDescriptorUniformBuffers is the maximum number of
    uniform buffers that can: be accessible to a single shader stage in a
    pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a shader stage when the pname:stageFlags
    member of the sname:VkDescriptorSetLayoutBinding structure has the bit
    for that shader stage set.
    See <<descriptorsets-uniformbuffer>> and
    <<descriptorsets-uniformbufferdynamic>>.
  * [[limits-maxPerStageDescriptorStorageBuffers]]
    pname:maxPerStageDescriptorStorageBuffers is the maximum number of
    storage buffers that can: be accessible to a single shader stage in a
    pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a pipeline shader stage when the
    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
    structure has the bit for that shader stage set.
    See <<descriptorsets-storagebuffer>> and
    <<descriptorsets-storagebufferdynamic>>.
  * [[limits-maxPerStageDescriptorSampledImages]]
    pname:maxPerStageDescriptorSampledImages is the maximum number of
    sampled images that can: be accessible to a single shader stage in a
    pipeline layout.
    Descriptors with a type of
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a pipeline shader stage when the
    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
    structure has the bit for that shader stage set.
    See <<descriptorsets-combinedimagesampler>>,
    <<descriptorsets-sampledimage>>, and
    <<descriptorsets-uniformtexelbuffer>>.
  * [[limits-maxPerStageDescriptorStorageImages]]
    pname:maxPerStageDescriptorStorageImages is the maximum number of
    storage images that can: be accessible to a single shader stage in a
    pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a pipeline shader stage when the
    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
    structure has the bit for that shader stage set.
    See <<descriptorsets-storageimage>>, and
    <<descriptorsets-storagetexelbuffer>>.
  * [[limits-maxPerStageDescriptorInputAttachments]]
    pname:maxPerStageDescriptorInputAttachments is the maximum number of
    input attachments that can: be accessible to a single shader stage in a
    pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
    count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    A descriptor is accessible to a pipeline shader stage when the
    pname:stageFlags member of the sname:VkDescriptorSetLayoutBinding
    structure has the bit for that shader stage set.
    These are only supported for the fragment stage.
    See <<descriptorsets-inputattachment>>.
  * [[limits-maxPerStageResources]] pname:maxPerStageResources is the
    maximum number of resources that can: be accessible to a single shader
    stage in a pipeline layout.
    Descriptors with a type of
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
    ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, or
    ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    For the fragment shader stage the framebuffer color attachments also
    count against this limit.
  * [[limits-maxDescriptorSetSamplers]] pname:maxDescriptorSetSamplers is
    the maximum number of samplers that can: be included in a pipeline
    layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_SAMPLER or
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-sampler>> and
    <<descriptorsets-combinedimagesampler>>.
  * [[limits-maxDescriptorSetUniformBuffers]]
    pname:maxDescriptorSetUniformBuffers is the maximum number of uniform
    buffers that can: be included in a pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-uniformbuffer>> and
    <<descriptorsets-uniformbufferdynamic>>.
  * [[limits-maxDescriptorSetUniformBuffersDynamic]]
    pname:maxDescriptorSetUniformBuffersDynamic is the maximum number of
    dynamic uniform buffers that can: be included in a pipeline layout.
    Descriptors with a type of
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-uniformbufferdynamic>>.
  * [[limits-maxDescriptorSetStorageBuffers]]
    pname:maxDescriptorSetStorageBuffers is the maximum number of storage
    buffers that can: be included in a pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-storagebuffer>> and
    <<descriptorsets-storagebufferdynamic>>.
  * [[limits-maxDescriptorSetStorageBuffersDynamic]]
    pname:maxDescriptorSetStorageBuffersDynamic is the maximum number of
    dynamic storage buffers that can: be included in a pipeline layout.
    Descriptors with a type of
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-storagebufferdynamic>>.
  * [[limits-maxDescriptorSetSampledImages]]
    pname:maxDescriptorSetSampledImages is the maximum number of sampled
    images that can: be included in a pipeline layout.
    Descriptors with a type of
    ename:VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
    ename:VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-combinedimagesampler>>,
    <<descriptorsets-sampledimage>>, and
    <<descriptorsets-uniformtexelbuffer>>.
  * [[limits-maxDescriptorSetStorageImages]]
    pname:maxDescriptorSetStorageImages is the maximum number of storage
    images that can: be included in a pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-storageimage>>, and
    <<descriptorsets-storagetexelbuffer>>.
  * [[limits-maxDescriptorSetInputAttachments]]
    pname:maxDescriptorSetInputAttachments is the maximum number of input
    attachments that can: be included in a pipeline layout.
    Descriptors with a type of ename:VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
    count against this limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptors in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    See <<descriptorsets-inputattachment>>.
  * [[limits-maxVertexInputAttributes]] pname:maxVertexInputAttributes is
    the maximum number of vertex input attributes that can: be specified for
    a graphics pipeline.
    These are described in the array of
    sname:VkVertexInputAttributeDescription structures that are provided at
    graphics pipeline creation time via the
    pname:pVertexAttributeDescriptions member of the
    slink:VkPipelineVertexInputStateCreateInfo structure.
    See <<fxvertex-attrib>> and <<fxvertex-input>>.
  * [[limits-maxVertexInputBindings]] pname:maxVertexInputBindings is the
    maximum number of vertex buffers that can: be specified for providing
    vertex attributes to a graphics pipeline.
    These are described in the array of
    sname:VkVertexInputBindingDescription structures that are provided at
    graphics pipeline creation time via the pname:pVertexBindingDescriptions
    member of the slink:VkPipelineVertexInputStateCreateInfo structure.
    The pname:binding member of sname:VkVertexInputBindingDescription must:
    be less than this limit.
    See <<fxvertex-input>>.
  * [[limits-maxVertexInputAttributeOffset]]
    pname:maxVertexInputAttributeOffset is the maximum vertex input
    attribute offset that can: be added to the vertex input binding stride.
    The pname:offset member of the sname:VkVertexInputAttributeDescription
    structure must: be less than or equal to this limit.
    See <<fxvertex-input>>.
  * [[limits-maxVertexInputBindingStride]] pname:maxVertexInputBindingStride
    is the maximum vertex input binding stride that can: be specified in a
    vertex input binding.
    The pname:stride member of the sname:VkVertexInputBindingDescription
    structure must: be less than or equal to this limit.
    See <<fxvertex-input>>.
  * [[limits-maxVertexOutputComponents]] pname:maxVertexOutputComponents is
    the maximum number of components of output variables which can: be
    output by a vertex shader.
    See <<shaders-vertex>>.
  * [[limits-maxTessellationGenerationLevel]]
    pname:maxTessellationGenerationLevel is the maximum tessellation
    generation level supported by the fixed-function tessellation primitive
    generator.
    See <<tessellation>>.
  * [[limits-maxTessellationPatchSize]] pname:maxTessellationPatchSize is
    the maximum patch size, in vertices, of patches that can: be processed
    by the tessellation control shader and tessellation primitive generator.
    The pname:patchControlPoints member of the
    slink:VkPipelineTessellationStateCreateInfo structure specified at
    pipeline creation time and the value provided in the code:OutputVertices
    execution mode of shader modules must: be less than or equal to this
    limit.
    See <<tessellation>>.
  * [[limits-maxTessellationControlPerVertexInputComponents]]
    pname:maxTessellationControlPerVertexInputComponents is the maximum
    number of components of input variables which can: be provided as
    per-vertex inputs to the tessellation control shader stage.
  * [[limits-maxTessellationControlPerVertexOutputComponents]]
    pname:maxTessellationControlPerVertexOutputComponents is the maximum
    number of components of per-vertex output variables which can: be output
    from the tessellation control shader stage.
  * [[limits-maxTessellationControlPerPatchOutputComponents]]
    pname:maxTessellationControlPerPatchOutputComponents is the maximum
    number of components of per-patch output variables which can: be output
    from the tessellation control shader stage.
  * [[limits-maxTessellationControlTotalOutputComponents]]
    pname:maxTessellationControlTotalOutputComponents is the maximum total
    number of components of per-vertex and per-patch output variables which
    can: be output from the tessellation control shader stage.
  * [[limits-maxTessellationEvaluationInputComponents]]
    pname:maxTessellationEvaluationInputComponents is the maximum number of
    components of input variables which can: be provided as per-vertex
    inputs to the tessellation evaluation shader stage.
  * [[limits-maxTessellationEvaluationOutputComponents]]
    pname:maxTessellationEvaluationOutputComponents is the maximum number of
    components of per-vertex output variables which can: be output from the
    tessellation evaluation shader stage.
  * [[limits-maxGeometryShaderInvocations]]
    pname:maxGeometryShaderInvocations is the maximum invocation count
    supported for instanced geometry shaders.
    The value provided in the code:Invocations execution mode of shader
    modules must: be less than or equal to this limit.
    See <<geometry>>.
  * [[limits-maxGeometryInputComponents]] pname:maxGeometryInputComponents
    is the maximum number of components of input variables which can: be
    provided as inputs to the geometry shader stage.
  * [[limits-maxGeometryOutputComponents]] pname:maxGeometryOutputComponents
    is the maximum number of components of output variables which can: be
    output from the geometry shader stage.
  * [[limits-maxGeometryOutputVertices]] pname:maxGeometryOutputVertices is
    the maximum number of vertices which can: be emitted by any geometry
    shader.
  * [[limits-maxGeometryTotalOutputComponents]]
    pname:maxGeometryTotalOutputComponents is the maximum total number of
    components of output variables, across all emitted vertices, which can:
    be output from the geometry shader stage.
  * [[limits-maxFragmentInputComponents]] pname:maxFragmentInputComponents
    is the maximum number of components of input variables which can: be
    provided as inputs to the fragment shader stage.
  * [[limits-maxFragmentOutputAttachments]]
    pname:maxFragmentOutputAttachments is the maximum number of output
    attachments which can: be written to by the fragment shader stage.
  * [[limits-maxFragmentDualSrcAttachments]]
    pname:maxFragmentDualSrcAttachments is the maximum number of output
    attachments which can: be written to by the fragment shader stage when
    blending is enabled and one of the dual source blend modes is in use.
    See <<framebuffer-dsb>> and <<features-dualSrcBlend,dualSrcBlend>>.
  * [[limits-maxFragmentCombinedOutputResources]]
    pname:maxFragmentCombinedOutputResources is the total number of storage
    buffers, storage images, and output code:Location decorated color
    attachments (described in <<interfaces-fragmentoutput, Fragment Output
    Interface>>) which can: be used in the fragment shader stage.
  * [[limits-maxComputeSharedMemorySize]] pname:maxComputeSharedMemorySize
    is the maximum total storage size, in bytes, available for variables
    declared with the code:Workgroup storage class in shader modules (or
    with the code:shared storage qualifier in GLSL) in the compute shader
    stage.
ifdef::VK_KHR_workgroup_memory_explicit_layout[]
    When variables declared with the code:Workgroup storage class are
    explicitly laid out (hence they are also decorated with code:Block), the
    amount of storage consumed is the size of the largest Block variable,
    not counting any padding at the end.
endif::VK_KHR_workgroup_memory_explicit_layout[]
    The amount of storage consumed by the
ifdef::VK_KHR_workgroup_memory_explicit_layout[]
    non-Block
endif::VK_KHR_workgroup_memory_explicit_layout[]
    variables declared with the code:Workgroup storage class is
    implementation-dependent.
    However, the amount of storage consumed may not exceed the largest block
    size that would be obtained if all active
ifdef::VK_KHR_workgroup_memory_explicit_layout[]
    non-Block
endif::VK_KHR_workgroup_memory_explicit_layout[]
    variables declared with code:Workgroup storage class were assigned
    offsets in an arbitrary order by successively taking the smallest valid
    offset according to the <<interfaces-resources-standard-layout,Standard
    Storage Buffer Layout>> rules.
    (This is equivalent to using the GLSL std430 layout rules.)
  * [[limits-maxComputeWorkGroupCount]] pname:maxComputeWorkGroupCount[3] is
    the maximum number of local workgroups that can: be dispatched by a
    single dispatching command.
    These three values represent the maximum number of local workgroups for
    the X, Y, and Z dimensions, respectively.
    The workgroup count parameters to the dispatching commands must: be less
    than or equal to the corresponding limit.
    See <<dispatch>>.
  * [[limits-maxComputeWorkGroupInvocations]]
    pname:maxComputeWorkGroupInvocations is the maximum total number of
    compute shader invocations in a single local workgroup.
    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
    execution mode in shader modules or by the object decorated by the
    code:WorkgroupSize decoration, must: be less than or equal to this
    limit.
  * [[limits-maxComputeWorkGroupSize]] pname:maxComputeWorkGroupSize[3] is
    the maximum size of a local compute workgroup, per dimension.
    These three values represent the maximum local workgroup size in the X,
    Y, and Z dimensions, respectively.
    The pname:x, pname:y, and pname:z sizes, as specified by the
    code:LocalSize execution mode or by the object decorated by the
    code:WorkgroupSize decoration in shader modules, must: be less than or
    equal to the corresponding limit.
  * [[limits-subPixelPrecisionBits]] pname:subPixelPrecisionBits is the
    number of bits of subpixel precision in framebuffer coordinates
    [eq]#x~f~# and [eq]#y~f~#.
    See <<primsrast>>.
  * [[limits-subTexelPrecisionBits]] pname:subTexelPrecisionBits is the
    number of bits of precision in the division along an axis of an image
    used for minification and magnification filters.
    [eq]#2^pname:subTexelPrecisionBits^# is the actual number of divisions
    along each axis of the image represented.
    Sub-texel values calculated during image sampling will snap to these
    locations when generating the filtered results.
  * [[limits-mipmapPrecisionBits]] pname:mipmapPrecisionBits is the number
    of bits of division that the LOD calculation for mipmap fetching get
    snapped to when determining the contribution from each mip level to the
    mip filtered results.
    [eq]#2^pname:mipmapPrecisionBits^# is the actual number of divisions.
  * [[limits-maxDrawIndexedIndexValue]] pname:maxDrawIndexedIndexValue is
    the maximum index value that can: be used for indexed draw calls when
    using 32-bit indices.
    This excludes the primitive restart index value of 0xFFFFFFFF.
    See <<features-fullDrawIndexUint32,fullDrawIndexUint32>>.
  * [[limits-maxDrawIndirectCount]] pname:maxDrawIndirectCount is the
    maximum draw count that is supported for indirect draw calls.
    See <<features-multiDrawIndirect,multiDrawIndirect>>.
  * [[limits-maxSamplerLodBias]] pname:maxSamplerLodBias is the maximum
    absolute sampler LOD bias.
    The sum of the pname:mipLodBias member of the slink:VkSamplerCreateInfo
    structure and the code:Bias operand of image sampling operations in
    shader modules (or 0 if no code:Bias operand is provided to an image
    sampling operation) are clamped to the range
    [eq]#[-pname:maxSamplerLodBias,+pname:maxSamplerLodBias]#.
    See <<samplers-mipLodBias>>.
  * [[limits-maxSamplerAnisotropy]] pname:maxSamplerAnisotropy is the
    maximum degree of sampler anisotropy.
    The maximum degree of anisotropic filtering used for an image sampling
    operation is the minimum of the pname:maxAnisotropy member of the
    slink:VkSamplerCreateInfo structure and this limit.
    See <<samplers-maxAnisotropy>>.
  * [[limits-maxViewports]] pname:maxViewports is the maximum number of
    active viewports.
    The pname:viewportCount member of the
    slink:VkPipelineViewportStateCreateInfo structure that is provided at
    pipeline creation must: be less than or equal to this limit.
  * [[limits-maxViewportDimensions]] pname:maxViewportDimensions[2] are the
    maximum viewport dimensions in the X (width) and Y (height) dimensions,
    respectively.
    The maximum viewport dimensions must: be greater than or equal to the
    largest image which can: be created and used as a framebuffer
    attachment.
    See <<vertexpostproc-viewport,Controlling the Viewport>>.
  * [[limits-viewportboundsrange]] pname:viewportBoundsRange[2] is the
    [eq]#[minimum, maximum]# range that the corners of a viewport must: be
    contained in.
    This range must: be at least [eq]#[-2 {times} pname:size, 2 {times}
    pname:size - 1]#, where [eq]#pname:size =
    max(pname:maxViewportDimensions[0], pname:maxViewportDimensions[1])#.
    See <<vertexpostproc-viewport,Controlling the Viewport>>.
+
[NOTE]
.Note
====
The intent of the pname:viewportBoundsRange limit is to allow a maximum
sized viewport to be arbitrarily shifted relative to the output target as
long as at least some portion intersects.
This would give a bounds limit of [eq]#[-pname:size {plus} 1, 2 {times}
pname:size - 1]# which would allow all possible non-empty-set intersections
of the output target and the viewport.
Since these numbers are typically powers of two, picking the signed number
range using the smallest possible number of bits ends up with the specified
range.
====
  * [[limits-viewportSubPixelBits]] pname:viewportSubPixelBits is the number
    of bits of subpixel precision for viewport bounds.
    The subpixel precision that floating-point viewport bounds are
    interpreted at is given by this limit.
  * [[limits-minMemoryMapAlignment]] pname:minMemoryMapAlignment is the
    minimum required: alignment, in bytes, of host visible memory
    allocations within the host address space.
    When mapping a memory allocation with flink:vkMapMemory, subtracting
    pname:offset bytes from the returned pointer will always produce an
    integer multiple of this limit.
    See <<memory-device-hostaccess>>.
  * [[limits-minTexelBufferOffsetAlignment]]
    pname:minTexelBufferOffsetAlignment is the minimum required: alignment,
    in bytes, for the pname:offset member of the
    slink:VkBufferViewCreateInfo structure for texel buffers.
ifdef::VK_EXT_texel_buffer_alignment[]
    If <<features-texelBufferAlignment,texelBufferAlignment>> is enabled,
    this limit is equivalent to the maximum of the
    <<limits-uniformTexelBufferOffsetAlignmentBytes,
    pname:uniformTexelBufferOffsetAlignmentBytes>> and
    <<limits-storageTexelBufferOffsetAlignmentBytes,
    pname:storageTexelBufferOffsetAlignmentBytes>> members of
    slink:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, but smaller
    alignment is optionally: allowed by
    <<limits-storageTexelBufferOffsetSingleTexelAlignment,
    pname:storageTexelBufferOffsetSingleTexelAlignment>> and
    <<limits-uniformTexelBufferOffsetSingleTexelAlignment,
    pname:uniformTexelBufferOffsetSingleTexelAlignment>>.
    If <<features-texelBufferAlignment,texelBufferAlignment>> is not
    enabled,
endif::VK_EXT_texel_buffer_alignment[]
    slink:VkBufferViewCreateInfo::pname:offset must: be a multiple of this
    value.
  * [[limits-minUniformBufferOffsetAlignment]]
    pname:minUniformBufferOffsetAlignment is the minimum required:
    alignment, in bytes, for the pname:offset member of the
    sname:VkDescriptorBufferInfo structure for uniform buffers.
    When a descriptor of type ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC is updated, the
    pname:offset must: be an integer multiple of this limit.
    Similarly, dynamic offsets for uniform buffers must: be multiples of
    this limit.
  * [[limits-minStorageBufferOffsetAlignment]]
    pname:minStorageBufferOffsetAlignment is the minimum required:
    alignment, in bytes, for the pname:offset member of the
    sname:VkDescriptorBufferInfo structure for storage buffers.
    When a descriptor of type ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or
    ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC is updated, the
    pname:offset must: be an integer multiple of this limit.
    Similarly, dynamic offsets for storage buffers must: be multiples of
    this limit.
  * [[limits-minTexelOffset]] pname:minTexelOffset is the minimum offset
    value for the code:ConstOffset image operand of any of the
    code:OpImageSample* or code:OpImageFetch* image instructions.
  * [[limits-maxTexelOffset]] pname:maxTexelOffset is the maximum offset
    value for the code:ConstOffset image operand of any of the
    code:OpImageSample* or code:OpImageFetch* image instructions.
  * [[limits-minTexelGatherOffset]] pname:minTexelGatherOffset is the
    minimum offset value for the code:Offset, code:ConstOffset, or
    code:ConstOffsets image operands of any of the code:OpImage*Gather image
    instructions.
  * [[limits-maxTexelGatherOffset]] pname:maxTexelGatherOffset is the
    maximum offset value for the code:Offset, code:ConstOffset, or
    code:ConstOffsets image operands of any of the code:OpImage*Gather image
    instructions.
  * [[limits-minInterpolationOffset]] pname:minInterpolationOffset is the
    base minimum (inclusive) negative offset value for the code:Offset
    operand of the code:InterpolateAtOffset extended instruction.
  * [[limits-maxInterpolationOffset]] pname:maxInterpolationOffset is the
    base maximum (inclusive) positive offset value for the code:Offset
    operand of the code:InterpolateAtOffset extended instruction.
  * [[limits-subPixelInterpolationOffsetBits]]
    pname:subPixelInterpolationOffsetBits is the number of fractional bits
    that the code:x and code:y offsets to the code:InterpolateAtOffset
    extended instruction may: be rounded to as fixed-point values.
  * [[limits-maxFramebufferWidth]] pname:maxFramebufferWidth is the maximum
    width for a framebuffer.
    The pname:width member of the slink:VkFramebufferCreateInfo structure
    must: be less than or equal to this limit.
  * [[limits-maxFramebufferHeight]] pname:maxFramebufferHeight is the
    maximum height for a framebuffer.
    The pname:height member of the slink:VkFramebufferCreateInfo structure
    must: be less than or equal to this limit.
  * [[limits-maxFramebufferLayers]] pname:maxFramebufferLayers is the
    maximum layer count for a layered framebuffer.
    The pname:layers member of the slink:VkFramebufferCreateInfo structure
    must: be less than or equal to this limit.
  * [[limits-framebufferColorSampleCounts]]
    pname:framebufferColorSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the color sample counts that are
    supported for all framebuffer color attachments with floating- or
    fixed-point formats.
ifndef::VK_VERSION_1_2[]
    There is no limit that specifies the color sample counts that are
    supported for all color attachments with integer formats.
endif::VK_VERSION_1_2[]
ifdef::VK_VERSION_1_2[]
    For color attachments with integer formats, see
    <<limits-framebufferIntegerColorSampleCounts,
    pname:framebufferIntegerColorSampleCounts>>.
endif::VK_VERSION_1_2[]
  * [[limits-framebufferDepthSampleCounts]]
    pname:framebufferDepthSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the supported depth sample counts
    for all framebuffer depth/stencil attachments, when the format includes
    a depth component.
  * [[limits-framebufferStencilSampleCounts]]
    pname:framebufferStencilSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the supported stencil sample
    counts for all framebuffer depth/stencil attachments, when the format
    includes a stencil component.
  * [[limits-framebufferNoAttachmentsSampleCounts]]
    pname:framebufferNoAttachmentsSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the supported sample counts for a
    <<renderpass-noattachments, subpass which uses no attachments>>.
  * [[limits-maxColorAttachments]] pname:maxColorAttachments is the maximum
    number of color attachments that can: be used by a subpass in a render
    pass.
    The pname:colorAttachmentCount member of the sname:VkSubpassDescription
ifdef::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
    or sname:VkSubpassDescription2
endif::VK_VERSION_1_2,VK_KHR_create_renderpass2[]
    structure must: be less than or equal to this limit.
  * [[limits-sampledImageColorSampleCounts]]
    pname:sampledImageColorSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the sample counts supported for
    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a non-integer color
    format.
  * [[limits-sampledImageIntegerSampleCounts]]
    pname:sampledImageIntegerSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the sample counts supported for
    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and an integer color
    format.
  * [[limits-sampledImageDepthSampleCounts]]
    pname:sampledImageDepthSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the sample counts supported for
    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a depth format.
  * [[limits-sampledImageStencilSampleCounts]]
    pname:sampledImageStencilSampleCounts is a bitmask^1^ of
    elink:VkSampleCountFlagBits indicating the sample counts supported for
    all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL, pname:usage
    containing ename:VK_IMAGE_USAGE_SAMPLED_BIT, and a stencil format.
  * [[limits-storageImageSampleCounts]] pname:storageImageSampleCounts is a
    bitmask^1^ of elink:VkSampleCountFlagBits indicating the sample counts
    supported for all 2D images created with ename:VK_IMAGE_TILING_OPTIMAL,
    and pname:usage containing ename:VK_IMAGE_USAGE_STORAGE_BIT.
  * [[limits-maxSampleMaskWords]] pname:maxSampleMaskWords is the maximum
    number of array elements of a variable decorated with the
    code:SampleMask built-in decoration.
  * [[limits-timestampComputeAndGraphics]] pname:timestampComputeAndGraphics
    specifies support for timestamps on all graphics and compute queues.
    If this limit is set to ename:VK_TRUE, all queues that advertise the
    ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT in the
    sname:VkQueueFamilyProperties::pname:queueFlags support
    sname:VkQueueFamilyProperties::pname:timestampValidBits of at least 36.
    See <<queries-timestamps, Timestamp Queries>>.
  * [[limits-timestampPeriod]] pname:timestampPeriod is the number of
    nanoseconds required: for a timestamp query to be incremented by 1.
    See <<queries-timestamps, Timestamp Queries>>.
  * [[limits-maxClipDistances]] pname:maxClipDistances is the maximum number
    of clip distances that can: be used in a single shader stage.
    The size of any array declared with the code:ClipDistance built-in
    decoration in a shader module must: be less than or equal to this limit.
  * [[limits-maxCullDistances]] pname:maxCullDistances is the maximum number
    of cull distances that can: be used in a single shader stage.
    The size of any array declared with the code:CullDistance built-in
    decoration in a shader module must: be less than or equal to this limit.
  * [[limits-maxCombinedClipAndCullDistances]]
    pname:maxCombinedClipAndCullDistances is the maximum combined number of
    clip and cull distances that can: be used in a single shader stage.
    The sum of the sizes of any pair of arrays declared with the
    code:ClipDistance and code:CullDistance built-in decoration used by a
    single shader stage in a shader module must: be less than or equal to
    this limit.
  * [[limits-discreteQueuePriorities]] pname:discreteQueuePriorities is the
    number of discrete priorities that can: be assigned to a queue based on
    the value of each member of
    slink:VkDeviceQueueCreateInfo::pname:pQueuePriorities.
    This must: be at least 2, and levels must: be spread evenly over the
    range, with at least one level at 1.0, and another at 0.0.
    See <<devsandqueues-priority>>.
  * [[limits-pointSizeRange]] pname:pointSizeRange[2] is the range
    [eq]#[pname:minimum,pname:maximum]# of supported sizes for points.
    Values written to variables decorated with the code:PointSize built-in
    decoration are clamped to this range.
  * [[limits-lineWidthRange]] pname:lineWidthRange[2] is the range
    [eq]#[pname:minimum,pname:maximum]# of supported widths for lines.
    Values specified by the pname:lineWidth member of the
    slink:VkPipelineRasterizationStateCreateInfo or the pname:lineWidth
    parameter to fname:vkCmdSetLineWidth are clamped to this range.
  * [[limits-pointSizeGranularity]] pname:pointSizeGranularity is the
    granularity of supported point sizes.
    Not all point sizes in the range defined by pname:pointSizeRange are
    supported.
    This limit specifies the granularity (or increment) between successive
    supported point sizes.
  * [[limits-lineWidthGranularity]] pname:lineWidthGranularity is the
    granularity of supported line widths.
    Not all line widths in the range defined by pname:lineWidthRange are
    supported.
    This limit specifies the granularity (or increment) between successive
    supported line widths.
  * [[limits-strictLines]] pname:strictLines specifies whether lines are
    rasterized according to the preferred method of rasterization.
    If set to ename:VK_FALSE, lines may: be rasterized under a relaxed set
    of rules.
    If set to ename:VK_TRUE, lines are rasterized as per the strict
    definition.
    See <<primsrast-lines-basic,Basic Line Segment Rasterization>>.
  * [[limits-standardSampleLocations]] pname:standardSampleLocations
    specifies whether rasterization uses the standard sample locations as
    documented in <<primsrast-multisampling,Multisampling>>.
    If set to ename:VK_TRUE, the implementation uses the documented sample
    locations.
    If set to ename:VK_FALSE, the implementation may: use different sample
    locations.
  * [[limits-optimalBufferCopyOffsetAlignment]]
    pname:optimalBufferCopyOffsetAlignment is the optimal buffer offset
    alignment in bytes for
ifndef::VK_KHR_copy_commands2[]
    flink:vkCmdCopyBufferToImage and flink:vkCmdCopyImageToBuffer.
endif::VK_KHR_copy_commands2[]
ifdef::VK_KHR_copy_commands2[]
    flink:vkCmdCopyBufferToImage2KHR, flink:vkCmdCopyBufferToImage,
    flink:vkCmdCopyImageToBuffer2KHR, and flink:vkCmdCopyImageToBuffer.
endif::VK_KHR_copy_commands2[]
    The per texel alignment requirements are enforced, but applications
    should: use the optimal alignment for optimal performance and power use.
  * [[limits-optimalBufferCopyRowPitchAlignment]]
    pname:optimalBufferCopyRowPitchAlignment is the optimal buffer row pitch
    alignment in bytes for
ifndef::VK_KHR_copy_commands2[]
    flink:vkCmdCopyBufferToImage and flink:vkCmdCopyImageToBuffer.
endif::VK_KHR_copy_commands2[]
ifdef::VK_KHR_copy_commands2[]
    flink:vkCmdCopyBufferToImage2KHR, flink:vkCmdCopyBufferToImage,
    flink:vkCmdCopyImageToBuffer2KHR, and flink:vkCmdCopyImageToBuffer.
endif::VK_KHR_copy_commands2[]
    Row pitch is the number of bytes between texels with the same X
    coordinate in adjacent rows (Y coordinates differ by one).
    The per texel alignment requirements are enforced, but applications
    should: use the optimal alignment for optimal performance and power use.
  * [[limits-nonCoherentAtomSize]] pname:nonCoherentAtomSize is the size and
    alignment in bytes that bounds concurrent access to
    <<memory-device-hostaccess, host-mapped device memory>>.

1::
    For all bitmasks of elink:VkSampleCountFlagBits, the sample count limits
    defined above represent the minimum supported sample counts for each
    image type.
    Individual images may: support additional sample counts, which are
    queried using flink:vkGetPhysicalDeviceImageFormatProperties as
    described in <<features-supported-sample-counts, Supported Sample
    Counts>>.

include::{generated}/validity/structs/VkPhysicalDeviceLimits.txt[]
--


[open,refpage='VkSampleCountFlagBits',desc='Bitmask specifying sample counts supported for an image used for storage operations',type='enums']
--
Bits which may: be set in the sample count limits returned by
slink:VkPhysicalDeviceLimits, as well as in other queries and structures
representing image sample counts, are:

include::{generated}/api/enums/VkSampleCountFlagBits.txt[]

  * ename:VK_SAMPLE_COUNT_1_BIT specifies an image with one sample per
    pixel.
  * ename:VK_SAMPLE_COUNT_2_BIT specifies an image with 2 samples per pixel.
  * ename:VK_SAMPLE_COUNT_4_BIT specifies an image with 4 samples per pixel.
  * ename:VK_SAMPLE_COUNT_8_BIT specifies an image with 8 samples per pixel.
  * ename:VK_SAMPLE_COUNT_16_BIT specifies an image with 16 samples per
    pixel.
  * ename:VK_SAMPLE_COUNT_32_BIT specifies an image with 32 samples per
    pixel.
  * ename:VK_SAMPLE_COUNT_64_BIT specifies an image with 64 samples per
    pixel.
--

[open,refpage='VkSampleCountFlags',desc='Bitmask of VkSampleCountFlagBits',type='flags']
--
include::{generated}/api/flags/VkSampleCountFlags.txt[]

tname:VkSampleCountFlags is a bitmask type for setting a mask of zero or
more elink:VkSampleCountFlagBits.
--

ifdef::VK_KHR_push_descriptor[]
[open,refpage='VkPhysicalDevicePushDescriptorPropertiesKHR',desc='Structure describing push descriptor limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDevicePushDescriptorPropertiesKHR structure is defined
as:

include::{generated}/api/structs/VkPhysicalDevicePushDescriptorPropertiesKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxPushDescriptors]] pname:maxPushDescriptors is the maximum
    number of descriptors that can: be used in a descriptor set created with
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set.

:refpage: VkPhysicalDevicePushDescriptorPropertiesKHR
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDevicePushDescriptorPropertiesKHR.txt[]
--
endif::VK_KHR_push_descriptor[]

ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
[open,refpage='VkPhysicalDeviceMultiviewProperties',desc='Structure describing multiview limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceMultiviewProperties structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceMultiviewProperties.txt[]

ifdef::VK_KHR_multiview[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceMultiviewPropertiesKHR.txt[]
endif::VK_KHR_multiview[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_multiview-properties[]
  * [[{anchor-prefix}limits-maxMultiviewViewCount]]
    pname:maxMultiviewViewCount is one greater than the maximum view index
    that can: be used in a subpass.
  * [[{anchor-prefix}limits-maxMultiviewInstanceIndex]]
    pname:maxMultiviewInstanceIndex is the maximum valid value of instance
    index allowed to be generated by a drawing command recorded within a
    subpass of a multiview render pass instance.
// end::VK_KHR_multiview-properties[]

:refpage: VkPhysicalDeviceMultiviewProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceMultiviewProperties.txt[]
--
endif::VK_VERSION_1_1,VK_KHR_multiview[]

ifdef::VK_VERSION_1_2,VK_KHR_shader_float_controls[]
[open,refpage='VkPhysicalDeviceFloatControlsProperties',desc='Structure describing properties supported by VK_KHR_shader_float_controls',type='structs',alias='VkPhysicalDeviceFloatControlsPropertiesKHR']
--
The sname:VkPhysicalDeviceFloatControlsProperties structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceFloatControlsProperties.txt[]

ifdef::VK_KHR_shader_float_controls[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceFloatControlsPropertiesKHR.txt[]
endif::VK_KHR_shader_float_controls[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_shader_float_controls-properties[]
  * [[{anchor-prefix}features-denormBehaviorIndependence]]
    pname:denormBehaviorIndependence is a
    elink:VkShaderFloatControlsIndependence value indicating whether, and
    how, denorm behavior can be set independently for different bit widths.
  * [[{anchor-prefix}features-roundingModeIndependence]]
    pname:roundingModeIndependence is a
    elink:VkShaderFloatControlsIndependence value indicating whether, and
    how, rounding modes can be set independently for different bit widths.
  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat16]]
    pname:shaderSignedZeroInfNanPreserveFloat16 is a boolean value
    indicating whether sign of a zero, [eq]##Nan##s and
    latexmath:[\pm\infty] can: be preserved in 16-bit floating-point
    computations.
    It also indicates whether the code:SignedZeroInfNanPreserve execution
    mode can: be used for 16-bit floating-point types.
  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat32]]
    pname:shaderSignedZeroInfNanPreserveFloat32 is a boolean value
    indicating whether sign of a zero, [eq]##Nan##s and
    latexmath:[\pm\infty] can: be preserved in 32-bit floating-point
    computations.
    It also indicates whether the code:SignedZeroInfNanPreserve execution
    mode can: be used for 32-bit floating-point types.
  * [[{anchor-prefix}limits-shaderSignedZeroInfNanPreserveFloat64]]
    pname:shaderSignedZeroInfNanPreserveFloat64 is a boolean value
    indicating whether sign of a zero, [eq]##Nan##s and
    latexmath:[\pm\infty] can: be preserved in 64-bit floating-point
    computations.
    It also indicates whether the code:SignedZeroInfNanPreserve execution
    mode can: be used for 64-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormPreserveFloat16]]
    pname:shaderDenormPreserveFloat16 is a boolean value indicating whether
    denormals can: be preserved in 16-bit floating-point computations.
    It also indicates whether the code:DenormPreserve execution mode can: be
    used for 16-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormPreserveFloat32]]
    pname:shaderDenormPreserveFloat32 is a boolean value indicating whether
    denormals can: be preserved in 32-bit floating-point computations.
    It also indicates whether the code:DenormPreserve execution mode can: be
    used for 32-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormPreserveFloat64]]
    pname:shaderDenormPreserveFloat64 is a boolean value indicating whether
    denormals can: be preserved in 64-bit floating-point computations.
    It also indicates whether the code:DenormPreserve execution mode can: be
    used for 64-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat16]]
    pname:shaderDenormFlushToZeroFloat16 is a boolean value indicating
    whether denormals can: be flushed to zero in 16-bit floating-point
    computations.
    It also indicates whether the code:DenormFlushToZero execution mode can:
    be used for 16-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat32]]
    pname:shaderDenormFlushToZeroFloat32 is a boolean value indicating
    whether denormals can: be flushed to zero in 32-bit floating-point
    computations.
    It also indicates whether the code:DenormFlushToZero execution mode can:
    be used for 32-bit floating-point types.
  * [[{anchor-prefix}limits-shaderDenormFlushToZeroFloat64]]
    pname:shaderDenormFlushToZeroFloat64 is a boolean value indicating
    whether denormals can: be flushed to zero in 64-bit floating-point
    computations.
    It also indicates whether the code:DenormFlushToZero execution mode can:
    be used for 64-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat16]]
    pname:shaderRoundingModeRTEFloat16 is a boolean value indicating whether
    an implementation supports the round-to-nearest-even rounding mode for
    16-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTE execution mode can:
    be used for 16-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat32]]
    pname:shaderRoundingModeRTEFloat32 is a boolean value indicating whether
    an implementation supports the round-to-nearest-even rounding mode for
    32-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTE execution mode can:
    be used for 32-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTEFloat64]]
    pname:shaderRoundingModeRTEFloat64 is a boolean value indicating whether
    an implementation supports the round-to-nearest-even rounding mode for
    64-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTE execution mode can:
    be used for 64-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat16]]
    pname:shaderRoundingModeRTZFloat16 is a boolean value indicating whether
    an implementation supports the round-towards-zero rounding mode for
    16-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTZ execution mode can:
    be used for 16-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat32]]
    pname:shaderRoundingModeRTZFloat32 is a boolean value indicating whether
    an implementation supports the round-towards-zero rounding mode for
    32-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTZ execution mode can:
    be used for 32-bit floating-point types.
  * [[{anchor-prefix}limits-shaderRoundingModeRTZFloat64]]
    pname:shaderRoundingModeRTZFloat64 is a boolean value indicating whether
    an implementation supports the round-towards-zero rounding mode for
    64-bit floating-point arithmetic and conversion instructions.
    It also indicates whether the code:RoundingModeRTZ execution mode can:
    be used for 64-bit floating-point types.
// end::VK_KHR_shader_float_controls-properties[]

ifdef::editing-notes[]
[NOTE]
.editing-note
====
Implementations may not be able to control behavior of denorms for
floating-point atomics.
This needs to be taken into account when such atomics will be added to
Vulkan.
====
endif::editing-notes[]

:refpage: VkPhysicalDeviceFloatControlsProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceFloatControlsProperties.txt[]
--

[open,refpage='VkShaderFloatControlsIndependence',desc='Bitmask specifying whether, and how, shader float controls can be set separately',type='enums',alias='VkShaderFloatControlsIndependenceKHR']
--
Values which may: be returned in the pname:denormBehaviorIndependence and
pname:roundingModeIndependence fields of
sname:VkPhysicalDeviceFloatControlsProperties are:

include::{generated}/api/enums/VkShaderFloatControlsIndependence.txt[]

ifdef::VK_KHR_shader_float_controls[]
or the equivalent

include::{generated}/api/enums/VkShaderFloatControlsIndependenceKHR.txt[]
endif::VK_KHR_shader_float_controls[]

  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY specifies that
    shader float controls for 32-bit floating point can: be set
    independently; other bit widths must: be set identically to each other.
  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL specifies that shader
    float controls for all bit widths can: be set independently.
  * ename:VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE specifies that shader
    float controls for all bit widths must: be set identically.
--
endif::VK_VERSION_1_2,VK_KHR_shader_float_controls[]

ifdef::VK_EXT_discard_rectangles[]
[open,refpage='VkPhysicalDeviceDiscardRectanglePropertiesEXT',desc='Structure describing discard rectangle limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceDiscardRectanglePropertiesEXT structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceDiscardRectanglePropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxDiscardRectangles]] pname:maxDiscardRectangles is the
    maximum number of active discard rectangles that can: be specified.

:refpage: VkPhysicalDeviceDiscardRectanglePropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceDiscardRectanglePropertiesEXT.txt[]
--
endif::VK_EXT_discard_rectangles[]

ifdef::VK_EXT_sample_locations[]
[open,refpage='VkPhysicalDeviceSampleLocationsPropertiesEXT',desc='Structure describing sample location limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceSampleLocationsPropertiesEXT structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceSampleLocationsPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-sampleLocationSampleCounts]] pname:sampleLocationSampleCounts
    is a bitmask of elink:VkSampleCountFlagBits indicating the sample counts
    supporting custom sample locations.
  * [[limits-maxSampleLocationGridSize]] pname:maxSampleLocationGridSize is
    the maximum size of the pixel grid in which sample locations can: vary
    that is supported for all sample counts in
    pname:sampleLocationSampleCounts.
  * [[limits-sampleLocationCoordinateRange]]
    pname:sampleLocationCoordinateRange[2] is the range of supported sample
    location coordinates.
  * [[limits-sampleLocationSubPixelBits]] pname:sampleLocationSubPixelBits
    is the number of bits of subpixel precision for sample locations.
  * [[limits-variableSampleLocations]] pname:variableSampleLocations
    specifies whether the sample locations used by all pipelines that will
    be bound to a command buffer during a subpass must: match.
    If set to ename:VK_TRUE, the implementation supports variable sample
    locations in a subpass.
    If set to ename:VK_FALSE, then the sample locations must: stay constant
    in each subpass.

:refpage: VkPhysicalDeviceSampleLocationsPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceSampleLocationsPropertiesEXT.txt[]
--
endif::VK_EXT_sample_locations[]

ifdef::VK_EXT_external_memory_host[]
[open,refpage='VkPhysicalDeviceExternalMemoryHostPropertiesEXT',desc='Structure describing external memory host pointer limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceExternalMemoryHostPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceExternalMemoryHostPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-minImportedHostPointerAlignment]]
    pname:minImportedHostPointerAlignment is the minimum required:
    alignment, in bytes, for the base address and size of host pointers that
    can: be imported to a Vulkan memory object.
    The value must: be a power of two.

:refpage: VkPhysicalDeviceExternalMemoryHostPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceExternalMemoryHostPropertiesEXT.txt[]
--
endif::VK_EXT_external_memory_host[]

ifdef::VK_NVX_multiview_per_view_attributes[]
[open,refpage='VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX',desc='Structure describing multiview limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX structure
is defined as:

include::{generated}/api/structs/VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-perViewPositionAllComponents]]
    pname:perViewPositionAllComponents is ename:VK_TRUE if the
    implementation supports per-view position values that differ in
    components other than the X component.

:refpage: VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.txt[]
--
endif::VK_NVX_multiview_per_view_attributes[]

ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
[open,refpage='VkPhysicalDevicePointClippingProperties',desc='Structure describing the point clipping behavior supported by an implementation',type='structs']
--
The sname:VkPhysicalDevicePointClippingProperties structure is defined as:

include::{generated}/api/structs/VkPhysicalDevicePointClippingProperties.txt[]

ifdef::VK_KHR_maintenance2[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDevicePointClippingPropertiesKHR.txt[]
endif::VK_KHR_maintenance2[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_maintenance2-properties[]
  * [[{anchor-prefix}limits-pointClipping]] pname:pointClippingBehavior is a
    elink:VkPointClippingBehavior value specifying the point clipping
    behavior supported by the implementation.
// end::VK_KHR_maintenance2-properties[]

:refpage: VkPhysicalDevicePointClippingProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDevicePointClippingProperties.txt[]
--
endif::VK_VERSION_1_1,VK_KHR_maintenance2[]

ifdef::VK_VERSION_1_1[]
[open,refpage='VkPhysicalDeviceSubgroupProperties',desc='Structure describing subgroup support for an implementation',type='structs']
--
The sname:VkPhysicalDeviceSubgroupProperties structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceSubgroupProperties.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_subgroup-properties[]
  * [[{anchor-prefix}limits-subgroup-size]] pname:subgroupSize is the
    default number of invocations in each subgroup.
    pname:subgroupSize is at least 1 if any of the physical device's queues
    support ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT.
    pname:subgroupSize is a power-of-two.
  * [[limits-subgroup-supportedStages]] pname:supportedStages is a bitfield
    of elink:VkShaderStageFlagBits describing the shader stages that
    <<shaders-group-operations, group operations>> with
    <<shaders-scope-subgroup, subgroup scope>> are supported in.
    pname:supportedStages will have the ename:VK_SHADER_STAGE_COMPUTE_BIT
    bit set if any of the physical device's queues support
    ename:VK_QUEUE_COMPUTE_BIT.
  * [[limits-subgroupSupportedOperations]] pname:supportedOperations is a
    bitmask of elink:VkSubgroupFeatureFlagBits specifying the sets of
    <<shaders-group-operations, group operations>> with
    <<shaders-scope-subgroup, subgroup scope>> supported on this device.
    pname:supportedOperations will have the
    ename:VK_SUBGROUP_FEATURE_BASIC_BIT bit set if any of the physical
    device's queues support ename:VK_QUEUE_GRAPHICS_BIT or
    ename:VK_QUEUE_COMPUTE_BIT.
  * [[limits-subgroup-quadOperationsInAllStages]]
    pname:quadOperationsInAllStages is a boolean specifying whether
    <<shaders-quad-operations,quad group operations>> are available in all
    stages, or are restricted to fragment and compute stages.
// end::VK_KHR_subgroup-properties[]

:refpage: VkPhysicalDeviceSubgroupProperties
include::{chapters}/limits.txt[tag=limits_desc]

If pname:supportedOperations includes <<features-subgroup-quad,
ename:VK_SUBGROUP_FEATURE_QUAD_BIT,>>
ifdef::VK_KHR_shader_subgroup_uniform_control_flow[]
or <<features-shaderSubgroupUniformControlFlow,
pname:shaderSubgroupUniformControlFlow>> is enabled,
endif::VK_KHR_shader_subgroup_uniform_control_flow[]
pname:subgroupSize must: be greater than or equal to 4.

include::{generated}/validity/structs/VkPhysicalDeviceSubgroupProperties.txt[]
--

[open,refpage='VkSubgroupFeatureFlagBits',desc='Bitmask describing what group operations are supported with subgroup scope',type='enums']
--
Bits which can: be set in
slink:VkPhysicalDeviceSubgroupProperties::pname:supportedOperations
ifdef::VK_VERSION_1_2[]
and
slink:VkPhysicalDeviceVulkan11Properties::pname:subgroupSupportedOperations
endif::VK_VERSION_1_2[]
to specify supported <<shaders-group-operations, group operations>> with
<<shaders-scope-subgroup, subgroup scope>> are:

include::{generated}/api/enums/VkSubgroupFeatureFlagBits.txt[]

  * [[features-subgroup-basic]] ename:VK_SUBGROUP_FEATURE_BASIC_BIT
    specifies the device will accept SPIR-V shader modules containing the
    code:GroupNonUniform capability.
  * [[features-subgroup-vote]] ename:VK_SUBGROUP_FEATURE_VOTE_BIT specifies
    the device will accept SPIR-V shader modules containing the
    code:GroupNonUniformVote capability.
  * [[features-subgroup-arithmetic]]
    ename:VK_SUBGROUP_FEATURE_ARITHMETIC_BIT specifies the device will
    accept SPIR-V shader modules containing the
    code:GroupNonUniformArithmetic capability.
  * [[features-subgroup-ballot]] ename:VK_SUBGROUP_FEATURE_BALLOT_BIT
    specifies the device will accept SPIR-V shader modules containing the
    code:GroupNonUniformBallot capability.
  * [[features-subgroup-shuffle]] ename:VK_SUBGROUP_FEATURE_SHUFFLE_BIT
    specifies the device will accept SPIR-V shader modules containing the
    code:GroupNonUniformShuffle capability.
  * [[features-subgroup-shuffle-relative]]
    ename:VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT specifies the device will
    accept SPIR-V shader modules containing the
    code:GroupNonUniformShuffleRelative capability.
  * [[features-subgroup-clustered]] ename:VK_SUBGROUP_FEATURE_CLUSTERED_BIT
    specifies the device will accept SPIR-V shader modules containing the
    code:GroupNonUniformClustered capability.
  * [[features-subgroup-quad]] ename:VK_SUBGROUP_FEATURE_QUAD_BIT specifies
    the device will accept SPIR-V shader modules containing the
    code:GroupNonUniformQuad capability.
ifdef::VK_NV_shader_subgroup_partitioned[]
  * [[features-subgroup-partitioned]]
    ename:VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV specifies the device will
    accept SPIR-V shader modules containing the
    code:GroupNonUniformPartitionedNV capability.
endif::VK_NV_shader_subgroup_partitioned[]
--

[open,refpage='VkSubgroupFeatureFlags',desc='Bitmask of VkSubgroupFeatureFlagBits',type='flags']
--
include::{generated}/api/flags/VkSubgroupFeatureFlags.txt[]

tname:VkSubgroupFeatureFlags is a bitmask type for setting a mask of zero or
more elink:VkSubgroupFeatureFlagBits.
--

ifdef::VK_EXT_subgroup_size_control[]
[open,refpage='VkPhysicalDeviceSubgroupSizeControlPropertiesEXT',desc='Structure describing the control subgroup size properties of an implementation',type='structs']
--
The sname:VkPhysicalDeviceSubgroupSizeControlPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceSubgroupSizeControlPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-min-subgroup-size]] pname:minSubgroupSize is the minimum
    subgroup size supported by this device.
    pname:minSubgroupSize is at least one if any of the physical device's
    queues support ename:VK_QUEUE_GRAPHICS_BIT or
    ename:VK_QUEUE_COMPUTE_BIT.
    pname:minSubgroupSize is a power-of-two.
    pname:minSubgroupSize is less than or equal to pname:maxSubgroupSize.
    pname:minSubgroupSize is less than or equal to
    <<limits-subgroup-size,subgroupSize>>.
  * [[limits-max-subgroup-size]] pname:maxSubgroupSize is the maximum
    subgroup size supported by this device.
    pname:maxSubgroupSize is at least one if any of the physical device's
    queues support ename:VK_QUEUE_GRAPHICS_BIT or
    ename:VK_QUEUE_COMPUTE_BIT.
    pname:maxSubgroupSize is a power-of-two.
    pname:maxSubgroupSize is greater than or equal to pname:minSubgroupSize.
    pname:maxSubgroupSize is greater than or equal to
    <<limits-subgroup-size,subgroupSize>>.
  * [[limits-max-subgroups-per-workgroup]]
    pname:maxComputeWorkgroupSubgroups is the maximum number of subgroups
    supported by the implementation within a workgroup.
  * [[limits-required-subgroup-size-stages]]
    pname:requiredSubgroupSizeStages is a bitfield of what shader stages
    support having a required subgroup size specified.

:refpage: VkPhysicalDeviceSubgroupSizeControlPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

If slink:VkPhysicalDeviceSubgroupProperties::pname:supportedOperations
includes <<features-subgroup-quad, ename:VK_SUBGROUP_FEATURE_QUAD_BIT>>,
pname:minSubgroupSize must: be greater than or equal to 4.

include::{generated}/validity/structs/VkPhysicalDeviceSubgroupSizeControlPropertiesEXT.txt[]
--
endif::VK_EXT_subgroup_size_control[]
endif::VK_VERSION_1_1[]

ifdef::VK_EXT_blend_operation_advanced[]
[open,refpage='VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT',desc='Structure describing advanced blending limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-advancedBlendMaxColorAttachments]]
    pname:advancedBlendMaxColorAttachments is one greater than the highest
    color attachment index that can: be used in a subpass, for a pipeline
    that uses an <<framebuffer-blend-advanced,advanced blend operation>>.
  * [[limits-advancedBlendIndependentBlend]]
    pname:advancedBlendIndependentBlend specifies whether advanced blend
    operations can: vary per-attachment.
  * [[limits-advancedBlendNonPremultipliedSrcColor]]
    pname:advancedBlendNonPremultipliedSrcColor specifies whether the source
    color can: be treated as non-premultiplied.
    If this is ename:VK_FALSE, then
    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:srcPremultiplied
    must: be ename:VK_TRUE.
  * [[limits-advancedBlendNonPremultipliedDstColor]]
    pname:advancedBlendNonPremultipliedDstColor specifies whether the
    destination color can: be treated as non-premultiplied.
    If this is ename:VK_FALSE, then
    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:dstPremultiplied
    must: be ename:VK_TRUE.
  * [[limits-advancedBlendCorrelatedOverlap]]
    pname:advancedBlendCorrelatedOverlap specifies whether the overlap mode
    can: be treated as correlated.
    If this is ename:VK_FALSE, then
    slink:VkPipelineColorBlendAdvancedStateCreateInfoEXT::pname:blendOverlap
    must: be ename:VK_BLEND_OVERLAP_UNCORRELATED_EXT.
  * [[limits-advancedBlendAllOperations]] pname:advancedBlendAllOperations
    specifies whether all advanced blend operation enums are supported.
    See the valid usage of slink:VkPipelineColorBlendAttachmentState.

:refpage: VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT.txt[]
--
endif::VK_EXT_blend_operation_advanced[]

ifdef::VK_EXT_vertex_attribute_divisor[]
[open,refpage='VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT',desc='Structure describing max value of vertex attribute divisor that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxVertexAttribDivisor]] pname:maxVertexAttribDivisor is the
    maximum value of the number of instances that will repeat the value of
    vertex attribute data when instanced rendering is enabled.

:refpage: VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT.txt[]
--
endif::VK_EXT_vertex_attribute_divisor[]

ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
[open,refpage='VkPhysicalDeviceSamplerFilterMinmaxProperties',desc='Structure describing sampler filter minmax limits that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT']
--
The sname:VkPhysicalDeviceSamplerFilterMinmaxProperties structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceSamplerFilterMinmaxProperties.txt[]

ifdef::VK_EXT_sampler_filter_minmax[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT.txt[]
endif::VK_EXT_sampler_filter_minmax[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_EXT_sampler_filter_minmax-properties[]
  * [[{anchor-prefix}limits-filterMinmaxSingleComponentFormats]]
    pname:filterMinmaxSingleComponentFormats is a boolean value indicating
    whether a minimum set of required formats support min/max filtering.
  * [[{anchor-prefix}limits-filterMinmaxImageComponentMapping]]
    pname:filterMinmaxImageComponentMapping is a boolean value indicating
    whether the implementation supports non-identity component mapping of
    the image when doing min/max filtering.
// end::VK_EXT_sampler_filter_minmax-properties[]

:refpage: VkPhysicalDeviceSamplerFilterMinmaxProperties
include::{chapters}/limits.txt[tag=limits_desc]

[[limits-filterMinmaxSingleComponentFormats-minimum-requirements]]
If pname:filterMinmaxSingleComponentFormats is ename:VK_TRUE, the following
formats must: support the
ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT feature with
ename:VK_IMAGE_TILING_OPTIMAL, if they support
ename:VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT:

  * ename:VK_FORMAT_R8_UNORM
  * ename:VK_FORMAT_R8_SNORM
  * ename:VK_FORMAT_R16_UNORM
  * ename:VK_FORMAT_R16_SNORM
  * ename:VK_FORMAT_R16_SFLOAT
  * ename:VK_FORMAT_R32_SFLOAT
  * ename:VK_FORMAT_D16_UNORM
  * ename:VK_FORMAT_X8_D24_UNORM_PACK32
  * ename:VK_FORMAT_D32_SFLOAT
  * ename:VK_FORMAT_D16_UNORM_S8_UINT
  * ename:VK_FORMAT_D24_UNORM_S8_UINT
  * ename:VK_FORMAT_D32_SFLOAT_S8_UINT

If the format is a depth/stencil format, this bit only specifies that the
depth aspect (not the stencil aspect) of an image of this format supports
min/max filtering, and that min/max filtering of the depth aspect is
supported when depth compare is disabled in the sampler.

If pname:filterMinmaxImageComponentMapping is ename:VK_FALSE the component
mapping of the image view used with min/max filtering must: have been
created with the pname:r component set to the
<<resources-image-views-identity-mappings,identity swizzle>>.
Only the pname:r component of the sampled image value is defined and the
other component values are undefined:.
If pname:filterMinmaxImageComponentMapping is ename:VK_TRUE this restriction
does not apply and image component mapping works as normal.

include::{generated}/validity/structs/VkPhysicalDeviceSamplerFilterMinmaxProperties.txt[]
--
endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]

ifdef::VK_VERSION_1_1[]
[open,refpage='VkPhysicalDeviceProtectedMemoryProperties',desc='Structure describing protected memory properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceProtectedMemoryProperties structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceProtectedMemoryProperties.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_protected_memory-properties[]
  * pname:protectedNoFault specifies the behavior of the implementation when
    <<memory-protected-access-rules, protected memory access rules>> are
    broken.
    If pname:protectedNoFault is ename:VK_TRUE, breaking those rules will
    not result in process termination or device loss.
// end::VK_KHR_protected_memory-properties[]

:refpage: VkPhysicalDeviceProtectedMemoryProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceProtectedMemoryProperties.txt[]
--
endif::VK_VERSION_1_1[]

ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
[open,refpage='VkPhysicalDeviceMaintenance3Properties',desc='Structure describing descriptor set properties',type='structs']
--
The sname:VkPhysicalDeviceMaintenance3Properties structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceMaintenance3Properties.txt[]

ifdef::VK_KHR_maintenance3[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceMaintenance3PropertiesKHR.txt[]
endif::VK_KHR_maintenance3[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_maintenance3-properties[]
  * [[{anchor-prefix}limits-maxPerSetDescriptors]]
    pname:maxPerSetDescriptors is a maximum number of descriptors (summed
    over all descriptor types) in a single descriptor set that is guaranteed
    to satisfy any implementation-dependent constraints on the size of a
    descriptor set itself.
    Applications can: query whether a descriptor set that goes beyond this
    limit is supported using flink:vkGetDescriptorSetLayoutSupport.
  * [[{anchor-prefix}limits-maxMemoryAllocationSize]]
    pname:maxMemoryAllocationSize is the maximum size of a memory allocation
    that can: be created, even if there is more space available in the heap.
// end::VK_KHR_maintenance3-properties[]

:refpage: VkPhysicalDeviceMaintenance3Properties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceMaintenance3Properties.txt[]
--
endif::VK_VERSION_1_1,VK_KHR_maintenance3[]

ifdef::VK_NV_mesh_shader[]
[open,refpage='VkPhysicalDeviceMeshShaderPropertiesNV',desc='Structure describing mesh shading properties',type='structs']
--
The sname:VkPhysicalDeviceMeshShaderPropertiesNV structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceMeshShaderPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:maxDrawMeshTasksCount is the maximum number of local workgroups
    that can: be launched by a single draw mesh tasks command.
    See <<drawing-mesh-shading>>.
  * pname:maxTaskWorkGroupInvocations is the maximum total number of task
    shader invocations in a single local workgroup.
    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
    execution mode in shader modules or by the object decorated by the
    code:WorkgroupSize decoration, must: be less than or equal to this
    limit.
  * pname:maxTaskWorkGroupSize[3] is the maximum size of a local task
    workgroup.
    These three values represent the maximum local workgroup size in the X,
    Y, and Z dimensions, respectively.
    The pname:x, pname:y, and pname:z sizes, as specified by the
    code:LocalSize execution mode or by the object decorated by the
    code:WorkgroupSize decoration in shader modules, must: be less than or
    equal to the corresponding limit.
  * pname:maxTaskTotalMemorySize is the maximum number of bytes that the
    task shader can use in total for shared and output memory combined.
  * pname:maxTaskOutputCount is the maximum number of output tasks a single
    task shader workgroup can emit.
  * pname:maxMeshWorkGroupInvocations is the maximum total number of mesh
    shader invocations in a single local workgroup.
    The product of the X, Y, and Z sizes, as specified by the code:LocalSize
    execution mode in shader modules or by the object decorated by the
    code:WorkgroupSize decoration, must: be less than or equal to this
    limit.
  * pname:maxMeshWorkGroupSize[3] is the maximum size of a local mesh
    workgroup.
    These three values represent the maximum local workgroup size in the X,
    Y, and Z dimensions, respectively.
    The pname:x, pname:y, and pname:z sizes, as specified by the
    code:LocalSize execution mode or by the object decorated by the
    code:WorkgroupSize decoration in shader modules, must: be less than or
    equal to the corresponding limit.
  * pname:maxMeshTotalMemorySize is the maximum number of bytes that the
    mesh shader can use in total for shared and output memory combined.
  * pname:maxMeshOutputVertices is the maximum number of vertices a mesh
    shader output can store.
  * pname:maxMeshOutputPrimitives is the maximum number of primitives a mesh
    shader output can store.
  * pname:maxMeshMultiviewViewCount is the maximum number of multi-view
    views a mesh shader can use.
  * pname:meshOutputPerVertexGranularity is the granularity with which mesh
    vertex outputs are allocated.
    The value can be used to compute the memory size used by the mesh
    shader, which must be less than or equal to
    pname:maxMeshTotalMemorySize.
  * pname:meshOutputPerPrimitiveGranularity is the granularity with which
    mesh outputs qualified as per-primitive are allocated.
    The value can be used to compute the memory size used by the mesh
    shader, which must be less than or equal to
    pname:maxMeshTotalMemorySize.

:refpage: VkPhysicalDeviceMeshShaderPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceMeshShaderPropertiesNV.txt[]
--
endif::VK_NV_mesh_shader[]

ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
[open,refpage='VkPhysicalDeviceDescriptorIndexingProperties',desc='Structure describing descriptor indexing properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceDescriptorIndexingPropertiesEXT']
--
The sname:VkPhysicalDeviceDescriptorIndexingProperties structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingProperties.txt[]

ifdef::VK_EXT_descriptor_indexing[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceDescriptorIndexingPropertiesEXT.txt[]
endif::VK_EXT_descriptor_indexing[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_EXT_descriptor_indexing-properties[]
  * [[{anchor-prefix}limits-maxUpdateAfterBindDescriptorsInAllPools]]
    pname:maxUpdateAfterBindDescriptorsInAllPools is the maximum number of
    descriptors (summed over all descriptor types) that can: be created
    across all pools that are created with the
    ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT bit set.
    Pool creation may: fail when this limit is exceeded, or when the space
    this limit represents is unable to satisfy a pool creation due to
    fragmentation.
  * [[{anchor-prefix}limits-shaderUniformBufferArrayNonUniformIndexingNative]]
    pname:shaderUniformBufferArrayNonUniformIndexingNative is a boolean
    value indicating whether uniform buffer descriptors natively support
    nonuniform indexing.
    If this is ename:VK_FALSE, then a single dynamic instance of an
    instruction that nonuniformly indexes an array of uniform buffers may:
    execute multiple times in order to access all the descriptors.
  * [[{anchor-prefix}limits-shaderSampledImageArrayNonUniformIndexingNative]]
    pname:shaderSampledImageArrayNonUniformIndexingNative is a boolean value
    indicating whether sampler and image descriptors natively support
    nonuniform indexing.
    If this is ename:VK_FALSE, then a single dynamic instance of an
    instruction that nonuniformly indexes an array of samplers or images
    may: execute multiple times in order to access all the descriptors.
  * [[{anchor-prefix}limits-shaderStorageBufferArrayNonUniformIndexingNative]]
    pname:shaderStorageBufferArrayNonUniformIndexingNative is a boolean
    value indicating whether storage buffer descriptors natively support
    nonuniform indexing.
    If this is ename:VK_FALSE, then a single dynamic instance of an
    instruction that nonuniformly indexes an array of storage buffers may:
    execute multiple times in order to access all the descriptors.
  * [[{anchor-prefix}limits-shaderStorageImageArrayNonUniformIndexingNative]]
    pname:shaderStorageImageArrayNonUniformIndexingNative is a boolean value
    indicating whether storage image descriptors natively support nonuniform
    indexing.
    If this is ename:VK_FALSE, then a single dynamic instance of an
    instruction that nonuniformly indexes an array of storage images may:
    execute multiple times in order to access all the descriptors.
  * [[{anchor-prefix}limits-shaderInputAttachmentArrayNonUniformIndexingNative]]
    pname:shaderInputAttachmentArrayNonUniformIndexingNative is a boolean
    value indicating whether input attachment descriptors natively support
    nonuniform indexing.
    If this is ename:VK_FALSE, then a single dynamic instance of an
    instruction that nonuniformly indexes an array of input attachments may:
    execute multiple times in order to access all the descriptors.
  * [[{anchor-prefix}limits-robustBufferAccessUpdateAfterBind]]
    pname:robustBufferAccessUpdateAfterBind is a boolean value indicating
    whether <<features-robustBufferAccess, pname:robustBufferAccess>> can:
    be enabled in a device simultaneously with
    pname:descriptorBindingUniformBufferUpdateAfterBind,
    pname:descriptorBindingStorageBufferUpdateAfterBind,
    pname:descriptorBindingUniformTexelBufferUpdateAfterBind, and/or
    pname:descriptorBindingStorageTexelBufferUpdateAfterBind.
    If this is ename:VK_FALSE, then either pname:robustBufferAccess must: be
    disabled or all of these update-after-bind features must: be disabled.
  * [[{anchor-prefix}limits-quadDivergentImplicitLod]]
    pname:quadDivergentImplicitLod is a boolean value indicating whether
    implicit level of detail calculations for image operations have
    well-defined results when the image and/or sampler objects used for the
    instruction are not uniform within a quad.
    See <<textures-derivative-image-operations,Derivative Image
    Operations>>.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindSamplers]]
    pname:maxPerStageDescriptorUpdateAfterBindSamplers is similar to
    pname:maxPerStageDescriptorSamplers but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindUniformBuffers]]
    pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers is similar to
    pname:maxPerStageDescriptorUniformBuffers but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindStorageBuffers]]
    pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers is similar to
    pname:maxPerStageDescriptorStorageBuffers but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindSampledImages]]
    pname:maxPerStageDescriptorUpdateAfterBindSampledImages is similar to
    pname:maxPerStageDescriptorSampledImages but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindStorageImages]]
    pname:maxPerStageDescriptorUpdateAfterBindStorageImages is similar to
    pname:maxPerStageDescriptorStorageImages but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageDescriptorUpdateAfterBindInputAttachments]]
    pname:maxPerStageDescriptorUpdateAfterBindInputAttachments is similar to
    pname:maxPerStageDescriptorInputAttachments but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxPerStageUpdateAfterBindResources]]
    pname:maxPerStageUpdateAfterBindResources is similar to
    pname:maxPerStageResources but counts descriptors from descriptor sets
    created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindSamplers]]
    pname:maxDescriptorSetUpdateAfterBindSamplers is similar to
    pname:maxDescriptorSetSamplers but counts descriptors from descriptor
    sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindUniformBuffers]]
    pname:maxDescriptorSetUpdateAfterBindUniformBuffers is similar to
    pname:maxDescriptorSetUniformBuffers but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindUniformBuffersDynamic]]
    pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic is similar to
    pname:maxDescriptorSetUniformBuffersDynamic but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
    While an application can: allocate dynamic uniform buffer descriptors
    from a pool created with the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
    bindings for these descriptors must: not be present in any descriptor
    set layout that includes bindings created with
    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageBuffers]]
    pname:maxDescriptorSetUpdateAfterBindStorageBuffers is similar to
    pname:maxDescriptorSetStorageBuffers but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageBuffersDynamic]]
    pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic is similar to
    pname:maxDescriptorSetStorageBuffersDynamic but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
    While an application can: allocate dynamic storage buffer descriptors
    from a pool created with the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
    bindings for these descriptors must: not be present in any descriptor
    set layout that includes bindings created with
    ename:VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindSampledImages]]
    pname:maxDescriptorSetUpdateAfterBindSampledImages is similar to
    pname:maxDescriptorSetSampledImages but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindStorageImages]]
    pname:maxDescriptorSetUpdateAfterBindStorageImages is similar to
    pname:maxDescriptorSetStorageImages but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[{anchor-prefix}limits-maxDescriptorSetUpdateAfterBindInputAttachments]]
    pname:maxDescriptorSetUpdateAfterBindInputAttachments is similar to
    pname:maxDescriptorSetInputAttachments but counts descriptors from
    descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
// end::VK_EXT_descriptor_indexing-properties[]

:refpage: VkPhysicalDeviceDescriptorIndexingProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceDescriptorIndexingProperties.txt[]
--
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]

ifdef::VK_EXT_inline_uniform_block[]
[open,refpage='VkPhysicalDeviceInlineUniformBlockPropertiesEXT',desc='Structure describing inline uniform block properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceInlineUniformBlockPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxInlineUniformBlockSize]] pname:maxInlineUniformBlockSize is
    the maximum size in bytes of an <<descriptorsets-inlineuniformblock,
    inline uniform block>> binding.
  * [[limits-maxPerStageDescriptorInlineUniformBlocks]]
    pname:maxPerStageDescriptorInlineUniformBlock is the maximum number of
    inline uniform block bindings that can: be accessible to a single shader
    stage in a pipeline layout.
    Descriptor bindings with a descriptor type of
    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptor bindings in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
  * [[limits-maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks]]
    pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks
ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    equals pname:maxPerStageDescriptorInlineUniformBlocks and is reserved
    for future use.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    is similar to pname:maxPerStageDescriptorInlineUniformBlocks but counts
    descriptor bindings from descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
  * [[limits-maxDescriptorSetInlineUniformBlocks]]
    pname:maxDescriptorSetInlineUniformBlocks is the maximum number of
    inline uniform block bindings that can: be included in descriptor
    bindings in a pipeline layout across all pipeline shader stages and
    descriptor set numbers.
    Descriptor bindings with a descriptor type of
    ename:VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT count against this
    limit.
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    Only descriptor bindings in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
  * [[limits-maxDescriptorSetUpdateAfterBindInlineUniformBlocks]]
    pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks
ifndef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    equals pname:maxDescriptorSetInlineUniformBlocks and is reserved for
    future use.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
    is similar to pname:maxDescriptorSetInlineUniformBlocks but counts
    descriptor bindings from descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]

:refpage: VkPhysicalDeviceInlineUniformBlockPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceInlineUniformBlockPropertiesEXT.txt[]
--
endif::VK_EXT_inline_uniform_block[]

ifdef::VK_EXT_conservative_rasterization[]
[open,refpage='VkPhysicalDeviceConservativeRasterizationPropertiesEXT',desc='Structure describing conservative raster properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceConservativeRasterizationPropertiesEXT structure
is defined as:

include::{generated}/api/structs/VkPhysicalDeviceConservativeRasterizationPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-primitiveOverestimationSize]] pname:primitiveOverestimationSize
    is the size in pixels the generating primitive is increased at each of
    its edges during conservative rasterization overestimation mode.
    Even with a size of 0.0, conservative rasterization overestimation rules
    still apply and if any part of the pixel rectangle is covered by the
    generating primitive, fragments are generated for the entire pixel.
    However implementations may: make the pixel coverage area even more
    conservative by increasing the size of the generating primitive.
  * [[limits-maxExtraPrimitiveOverestimationSize]]
    pname:maxExtraPrimitiveOverestimationSize is the maximum size in pixels
    of extra overestimation the implementation supports in the pipeline
    state.
    A value of 0.0 means the implementation does not support any additional
    overestimation of the generating primitive during conservative
    rasterization.
    A value above 0.0 allows the application to further increase the size of
    the generating primitive during conservative rasterization
    overestimation.
  * [[limits-extraPrimitiveOverestimationSizeGranularity]]
    pname:extraPrimitiveOverestimationSizeGranularity is the granularity of
    extra overestimation that can be specified in the pipeline state between
    0.0 and pname:maxExtraPrimitiveOverestimationSize inclusive.
    A value of 0.0 means the implementation can use the smallest
    representable non-zero value in the screen space pixel fixed-point grid.
  * [[limits-primitiveUnderestimation]] pname:primitiveUnderestimation is
    ename:VK_TRUE if the implementation supports the
    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT conservative
    rasterization mode in addition to
    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT.
    Otherwise the implementation only supports
    ename:VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT.
  * [[limits-conservativePointAndLineRasterization]]
    pname:conservativePointAndLineRasterization is ename:VK_TRUE if the
    implementation supports conservative rasterization of point and line
    primitives as well as triangle primitives.
    Otherwise the implementation only supports triangle primitives.
  * [[limits-degenerateTrianglesRasterized]]
    pname:degenerateTrianglesRasterized is ename:VK_FALSE if the
    implementation culls primitives generated from triangles that become
    zero area after they are quantized to the fixed-point rasterization
    pixel grid.
    pname:degenerateTrianglesRasterized is ename:VK_TRUE if these primitives
    are not culled and the provoking vertex attributes and depth value are
    used for the fragments.
    The primitive area calculation is done on the primitive generated from
    the clipped triangle if applicable.
    Zero area primitives are backfacing and the application can: enable
    backface culling if desired.
  * [[limits-degenerateLinesRasterized]] pname:degenerateLinesRasterized is
    ename:VK_FALSE if the implementation culls lines that become zero length
    after they are quantized to the fixed-point rasterization pixel grid.
    pname:degenerateLinesRasterized is ename:VK_TRUE if zero length lines
    are not culled and the provoking vertex attributes and depth value are
    used for the fragments.
  * [[limits-fullyCoveredFragmentShaderInputVariable]]
    pname:fullyCoveredFragmentShaderInputVariable is ename:VK_TRUE if the
    implementation supports the SPIR-V builtin fragment shader input
    variable code:FullyCoveredEXT which specifies that conservative
    rasterization is enabled and the fragment area is fully covered by the
    generating primitive.
  * [[limits-conservativeRasterizationPostDepthCoverage]]
ifdef::VK_EXT_post_depth_coverage[]
    pname:conservativeRasterizationPostDepthCoverage is ename:VK_TRUE if the
    implementation supports conservative rasterization with the
    <<shaders-fragment-earlytest-postdepthcoverage,code:PostDepthCoverage>>
    execution mode enabled.
    When supported the code:SampleMask built-in input variable will reflect
    the coverage after the early per-fragment depth and stencil tests are
    applied even when conservative rasterization is enabled.
    Otherwise
    <<shaders-fragment-earlytest-postdepthcoverage,code:PostDepthCoverage>>
    execution mode must: not be used when conservative rasterization is
    enabled.
endif::VK_EXT_post_depth_coverage[]
ifndef::VK_EXT_post_depth_coverage[]
    pname:conservativeRasterizationPostDepthCoverage must: be
    ename:VK_FALSE.
endif::VK_EXT_post_depth_coverage[]

:refpage: VkPhysicalDeviceConservativeRasterizationPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceConservativeRasterizationPropertiesEXT.txt[]
--
endif::VK_EXT_conservative_rasterization[]

ifdef::VK_EXT_fragment_density_map[]
[open,refpage='VkPhysicalDeviceFragmentDensityMapPropertiesEXT',desc='Structure describing fragment density map properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceFragmentDensityMapPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMapPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-minfragmentdensitytexelsize]] pname:minFragmentDensityTexelSize
    is the minimum <<glossary-fragment-density-texel-size,fragment density
    texel size>>.
  * [[limits-maxfragmentdensitytexelsize]] pname:maxFragmentDensityTexelSize
    is the maximum fragment density texel size.
  * [[limits-fragmentdensityinvocations]] pname:fragmentDensityInvocations
    specifies whether the implementation may: invoke additional fragment
    shader invocations for each covered sample.

:refpage: VkPhysicalDeviceFragmentDensityMapPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMapPropertiesEXT.txt[]
--
endif::VK_EXT_fragment_density_map[]

ifdef::VK_EXT_fragment_density_map2[]
[open,refpage='VkPhysicalDeviceFragmentDensityMap2PropertiesEXT',desc='Structure describing additional fragment density map properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceFragmentDensityMap2PropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceFragmentDensityMap2PropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-subsampledLoads]] pname:subsampledLoads specifies if performing
    image data read with load operations on subsampled attachments will be
    resampled to the fragment density of the render pass
  * [[limits-subsampledCoarseReconstructionEarlyAccess]]
    pname:subsampledCoarseReconstructionEarlyAccess specifies if performing
    image data read with samplers created with pname:flags containing
    ename:VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT in
    fragment shader will trigger additional reads during
    ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
  * [[limits-maxSubsampledArrayLayers]] pname:maxSubsampledArrayLayers is
    the maximum number of slink:VkImageView array layers for usages
    supporting subsampled samplers
  * [[limits-maxDescriptorSetSubsampledSamplers]]
    pname:maxDescriptorSetSubsampledSamplers is the maximum number of
    subsampled samplers that can: be included in a slink:VkPipelineLayout

:refpage: VkPhysicalDeviceFragmentDensityMap2PropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceFragmentDensityMap2PropertiesEXT.txt[]
--
endif::VK_EXT_fragment_density_map2[]

ifdef::VK_AMD_shader_core_properties[]
[open,refpage='VkPhysicalDeviceShaderCorePropertiesAMD',desc='Structure describing shader core properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceShaderCorePropertiesAMD structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceShaderCorePropertiesAMD.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-shaderEngineCount]] pname:shaderEngineCount is an unsigned
    integer value indicating the number of shader engines found inside the
    shader core of the physical device.
  * [[limits-shaderArraysPerEngineCount]] pname:shaderArraysPerEngineCount
    is an unsigned integer value indicating the number of shader arrays
    inside a shader engine.
    Each shader array has its own scan converter, set of compute units, and
    a render back end (color and depth buffers).
    Shader arrays within a shader engine share shader processor input (wave
    launcher) and shader export (export buffer) units.
    Currently, a shader engine can have one or two shader arrays.
  * [[limits-computeUnitsPerShaderArray]] pname:computeUnitsPerShaderArray
    is an unsigned integer value indicating the physical number of compute
    units within a shader array.
    The active number of compute units in a shader array may: be lower.
    A compute unit houses a set of SIMDs along with a sequencer module and a
    local data store.
  * [[limits-simdPerComputeUnit]] pname:simdPerComputeUnit is an unsigned
    integer value indicating the number of SIMDs inside a compute unit.
    Each SIMD processes a single instruction at a time.
  * [[limits-wavefrontSize]] pname:wavefrontSize is an unsigned integer
    value indicating the maximum size of a subgroup.
  * [[limits-sgprsPerSimd]] pname:sgprsPerSimd is an unsigned integer value
    indicating the number of physical Scalar General Purpose Registers
    (SGPRs) per SIMD.
  * [[limits-minSgprAllocation]] pname:minSgprAllocation is an unsigned
    integer value indicating the minimum number of SGPRs allocated for a
    wave.
  * [[limits-maxSgprAllocation]] pname:maxSgprAllocation is an unsigned
    integer value indicating the maximum number of SGPRs allocated for a
    wave.
  * [[limits-sgprAllocationGranularity]] pname:sgprAllocationGranularity is
    an unsigned integer value indicating the granularity of SGPR allocation
    for a wave.
  * [[limits-vgprsPerSimd]] pname:vgprsPerSimd is an unsigned integer value
    indicating the number of physical Vector General Purpose Registers
    (VGPRs) per SIMD.
  * [[limits-minVgprAllocation]] pname:minVgprAllocation is an unsigned
    integer value indicating the minimum number of VGPRs allocated for a
    wave.
  * [[limits-maxVgprAllocation]] pname:maxVgprAllocation is an unsigned
    integer value indicating the maximum number of VGPRs allocated for a
    wave.
  * [[limits-vgprAllocationGranularity]] pname:vgprAllocationGranularity is
    an unsigned integer value indicating the granularity of VGPR allocation
    for a wave.

:refpage: VkPhysicalDeviceShaderCorePropertiesAMD
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceShaderCorePropertiesAMD.txt[]
--
endif::VK_AMD_shader_core_properties[]

ifdef::VK_AMD_shader_core_properties2[]
[open,refpage='VkPhysicalDeviceShaderCoreProperties2AMD',desc='Structure describing shader core properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceShaderCoreProperties2AMD structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceShaderCoreProperties2AMD.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[features-shaderCoreFeatures]] pname:shaderCoreFeatures is a bitmask of
    elink:VkShaderCorePropertiesFlagBitsAMD indicating the set of features
    supported by the shader core.
  * [[limits-activeComputeUnitCount]] pname:activeComputeUnitCount is an
    unsigned integer value indicating the number of compute units that have
    been enabled.

:refpage: VkPhysicalDeviceShaderCoreProperties2AMD
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceShaderCoreProperties2AMD.txt[]
--

[open,refpage='VkShaderCorePropertiesFlagBitsAMD',desc='Bitmask specifying shader core properties',type='enums',xrefs='VkPhysicalDeviceShaderCoreProperties2AMD VkShaderCorePropertiesFlagsAMD']
--
Bits for this type may: be defined by future extensions, or new versions of
the `<<VK_AMD_shader_core_properties2>>` extension.
Possible values of the pname:flags member of
tlink:VkShaderCorePropertiesFlagsAMD are:

include::{generated}/api/enums/VkShaderCorePropertiesFlagBitsAMD.txt[]
--

[open,refpage='VkShaderCorePropertiesFlagsAMD',desc='Bitmask of VkShaderCorePropertiesFlagBitsAMD',type='flags',xrefs='VkPhysicalDeviceShaderCoreProperties2AMD VkShaderCorePropertiesFlagBitsAMD']
--
include::{generated}/api/flags/VkShaderCorePropertiesFlagsAMD.txt[]

tname:VkShaderCorePropertiesFlagsAMD is a bitmask type for providing zero or
more elink:VkShaderCorePropertiesFlagBitsAMD.
--
endif::VK_AMD_shader_core_properties2[]

ifdef::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]
[open,refpage='VkPhysicalDeviceDepthStencilResolveProperties',desc='Structure describing depth/stencil resolve properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceDepthStencilResolvePropertiesKHR']
--
The sname:VkPhysicalDeviceDepthStencilResolveProperties structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceDepthStencilResolveProperties.txt[]

ifdef::VK_KHR_depth_stencil_resolve[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceDepthStencilResolvePropertiesKHR.txt[]
endif::VK_KHR_depth_stencil_resolve[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_depth_stencil_resolve-properties[]
  * [[{anchor-prefix}features-depthResolveModes]]
    pname:supportedDepthResolveModes is a bitmask of
    elink:VkResolveModeFlagBits indicating the set of supported depth
    resolve modes.
    ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT must: be included in the set but
    implementations may: support additional modes.
  * [[{anchor-prefix}features-stencilResolveModes]]
    pname:supportedStencilResolveModes is a bitmask of
    elink:VkResolveModeFlagBits indicating the set of supported stencil
    resolve modes.
    ename:VK_RESOLVE_MODE_SAMPLE_ZERO_BIT must: be included in the set but
    implementations may: support additional modes.
    ename:VK_RESOLVE_MODE_AVERAGE_BIT must: not be included in the set.
  * [[{anchor-prefix}features-independentResolveNone]]
    pname:independentResolveNone is ename:VK_TRUE if the implementation
    supports setting the depth and stencil resolve modes to different values
    when one of those modes is ename:VK_RESOLVE_MODE_NONE.
    Otherwise the implementation only supports setting both modes to the
    same value.
  * [[{anchor-prefix}features-independentResolve]] pname:independentResolve
    is ename:VK_TRUE if the implementation supports all combinations of the
    supported depth and stencil resolve modes, including setting either
    depth or stencil resolve mode to ename:VK_RESOLVE_MODE_NONE.
    An implementation that supports pname:independentResolve must: also
    support pname:independentResolveNone.
// end::VK_KHR_depth_stencil_resolve-properties[]

:refpage: VkPhysicalDeviceDepthStencilResolveProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceDepthStencilResolveProperties.txt[]
--
endif::VK_VERSION_1_2,VK_KHR_depth_stencil_resolve[]

ifdef::VK_KHR_performance_query[]
include::VK_KHR_performance_query/props.txt[]
endif::VK_KHR_performance_query[]

ifdef::VK_NV_shading_rate_image[]
[open,refpage='VkPhysicalDeviceShadingRateImagePropertiesNV',desc='Structure describing shading rate image limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceShadingRateImagePropertiesNV structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceShadingRateImagePropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-shading-rate-texel-size]] pname:shadingRateTexelSize indicates
    the width and height of the portion of the framebuffer corresponding to
    each texel in the shading rate image.
  * [[limits-shading-rate-palette-size]] pname:shadingRatePaletteSize
    indicates the maximum number of palette entries supported for the
    shading rate image.
  * [[limits-shading-rate-max-coarse-samples]]
    pname:shadingRateMaxCoarseSamples specifies the maximum number of
    coverage samples supported in a single fragment.
    If the product of the fragment size derived from the base shading rate
    and the number of coverage samples per pixel exceeds this limit, the
    final shading rate will be adjusted so that its product does not exceed
    the limit.

:refpage: VkPhysicalDeviceShadingRateImagePropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

These properties are related to the <<primsrast-shading-rate-image, shading
rate image>> feature.

include::{generated}/validity/structs/VkPhysicalDeviceShadingRateImagePropertiesNV.txt[]
--
endif::VK_NV_shading_rate_image[]

ifdef::VK_EXT_transform_feedback[]
[open,refpage='VkPhysicalDeviceTransformFeedbackPropertiesEXT',desc='Structure describing transform feedback properties that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceTransformFeedbackPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceTransformFeedbackPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxTransformFeedbackStreams]] pname:maxTransformFeedbackStreams
    is the maximum number of vertex streams that can be output from geometry
    shaders declared with the code:GeometryStreams capability.
    If the implementation does not support
    sname:VkPhysicalDeviceTransformFeedbackFeaturesEXT::pname:geometryStreams
    then pname:maxTransformFeedbackStreams must: be set to `1`.
  * [[limits-maxTransformFeedbackBuffers]] pname:maxTransformFeedbackBuffers
    is the maximum number of transform feedback buffers that can be bound
    for capturing shader outputs from the last
    <<pipeline-graphics-subsets-pre-rasterization,pre-rasterization shader
    stage>>.
  * [[limits-maxTransformFeedbackBufferSize]]
    pname:maxTransformFeedbackBufferSize is the maximum size that can be
    specified when binding a buffer for transform feedback in
    flink:vkCmdBindTransformFeedbackBuffersEXT.
  * [[limits-maxTransformFeedbackStreamDataSize]]
    pname:maxTransformFeedbackStreamDataSize is the maximum amount of data
    in bytes for each vertex that captured to one or more transform feedback
    buffers associated with a specific vertex stream.
  * [[limits-maxTransformFeedbackBufferDataSize]]
    pname:maxTransformFeedbackBufferDataSize is the maximum amount of data
    in bytes for each vertex that can be captured to a specific transform
    feedback buffer.
  * [[limits-maxTransformFeedbackBufferDataStride]]
    pname:maxTransformFeedbackBufferDataStride is the maximum stride between
    each capture of vertex data to the buffer.
  * [[limits-transformFeedbackQueries]] pname:transformFeedbackQueries is
    ename:VK_TRUE if the implementation supports the
    ename:VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT query type.
    pname:transformFeedbackQueries is false if queries of this type cannot:
    be created.
  * [[limits-transformFeedbackStreamsLinesTriangles]]
    pname:transformFeedbackStreamsLinesTriangles is ename:VK_TRUE if the
    implementation supports the geometry shader code:OpExecutionMode of
    code:OutputLineStrip and code:OutputTriangleStrip in addition to
    code:OutputPoints when more than one vertex stream is output.
    If pname:transformFeedbackStreamsLinesTriangles is false the
    implementation only supports an code:OpExecutionMode of
    code:OutputPoints when more than one vertex stream is output from the
    geometry shader.
  * [[limits-transformFeedbackRasterizationStreamSelect]]
    pname:transformFeedbackRasterizationStreamSelect is ename:VK_TRUE if the
    implementation supports the code:GeometryStreams SPIR-V capability and
    the application can use
    slink:VkPipelineRasterizationStateStreamCreateInfoEXT to modify which
    vertex stream output is used for rasterization.
    Otherwise vertex stream `0` must: always be used for rasterization.
  * [[limits-transformFeedbackDraw]] pname:transformFeedbackDraw is
    ename:VK_TRUE if the implementation supports the
    flink:vkCmdDrawIndirectByteCountEXT function otherwise the function
    must: not be called.

:refpage: VkPhysicalDeviceTransformFeedbackPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceTransformFeedbackPropertiesEXT.txt[]
--
endif::VK_EXT_transform_feedback[]

ifdef::VK_NV_ray_tracing[]
[open,refpage='VkPhysicalDeviceRayTracingPropertiesNV',desc='Properties of the physical device for ray tracing',type='structs']
--
The sname:VkPhysicalDeviceRayTracingPropertiesNV structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceRayTracingPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:shaderGroupHandleSize is the size in bytes of the shader header.
  * [[limits-maxRecursionDepth]] pname:maxRecursionDepth is the maximum
    number of levels of recursion allowed in a trace command.
  * pname:maxShaderGroupStride is the maximum stride in bytes allowed
    between shader groups in the shader binding table.
  * pname:shaderGroupBaseAlignment is the required: alignment in bytes for
    the base of the shader binding table.
  * pname:maxGeometryCount is the maximum number of geometries in the bottom
    level acceleration structure.
  * pname:maxInstanceCount is the maximum number of instances in the top
    level acceleration structure.
  * pname:maxTriangleCount is the maximum number of triangles in all
    geometries in the bottom level acceleration structure.
  * pname:maxDescriptorSetAccelerationStructures is the maximum number of
    acceleration structure descriptors that are allowed in a descriptor set.

:refpage: VkPhysicalDeviceRayTracingPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

ifdef::VK_KHR_ray_tracing_pipeline[]
Limits specified by this structure must: match those specified with the same
name in slink:VkPhysicalDeviceAccelerationStructurePropertiesKHR and
slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR.
endif::VK_KHR_ray_tracing_pipeline[]

include::{generated}/validity/structs/VkPhysicalDeviceRayTracingPropertiesNV.txt[]
--
endif::VK_NV_ray_tracing[]

ifdef::VK_KHR_acceleration_structure[]
[open,refpage='VkPhysicalDeviceAccelerationStructurePropertiesKHR',desc='Properties of the physical device for acceleration structure',type='structs']
--
The sname:VkPhysicalDeviceAccelerationStructurePropertiesKHR structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceAccelerationStructurePropertiesKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:maxGeometryCount is the maximum number of geometries in the bottom
    level acceleration structure.
  * pname:maxInstanceCount is the maximum number of instances in the top
    level acceleration structure.
  * pname:maxPrimitiveCount is the maximum number of triangles or AABBs in
    all geometries in the bottom level acceleration structure.
  * [[limits-maxPerStageDescriptorAccelerationStructures]]
    pname:maxPerStageDescriptorAccelerationStructures is the maximum number
    of acceleration structure bindings that can: be accessible to a single
    shader stage in a pipeline layout.
    Descriptor bindings with a descriptor type of
    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR count against this
    limit.
    Only descriptor bindings in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
  * [[limits-maxPerStageDescriptorUpdateAfterBindAccelerationStructures]]
    pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures is
    similar to pname:maxPerStageDescriptorAccelerationStructures but counts
    descriptor bindings from descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[limits-maxDescriptorSetAccelerationStructures]]
    pname:maxDescriptorSetAccelerationStructures is the maximum number of
    acceleration structure descriptors that can: be included in descriptor
    bindings in a pipeline layout across all pipeline shader stages and
    descriptor set numbers.
    Descriptor bindings with a descriptor type of
    ename:VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR count against this
    limit.
    Only descriptor bindings in descriptor set layouts created without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set
    count against this limit.
  * [[limits-maxDescriptorSetUpdateAfterBindAccelerationStructures]]
    pname:maxDescriptorSetUpdateAfterBindAccelerationStructures is similar
    to pname:maxDescriptorSetAccelerationStructures but counts descriptor
    bindings from descriptor sets created with or without the
    ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit
    set.
  * [[limits-minAccelerationStructureScratchOffsetAlignment]]
    pname:minAccelerationStructureScratchOffsetAlignment is the minimum
    required: alignment, in bytes, for scratch data passed in to an
    acceleration structure build command.

:refpage: VkPhysicalDeviceAccelerationStructurePropertiesKHR
include::{chapters}/limits.txt[tag=limits_desc]

ifdef::VK_NV_ray_tracing[]
Limits specified by this structure must: match those specified with the same
name in slink:VkPhysicalDeviceRayTracingPropertiesNV.
endif::VK_NV_ray_tracing[]

include::{generated}/validity/structs/VkPhysicalDeviceAccelerationStructurePropertiesKHR.txt[]
--
endif::VK_KHR_acceleration_structure[]

ifdef::VK_KHR_ray_tracing_pipeline[]
[open,refpage='VkPhysicalDeviceRayTracingPipelinePropertiesKHR',desc='Properties of the physical device for ray tracing',type='structs']
--
The sname:VkPhysicalDeviceRayTracingPipelinePropertiesKHR structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceRayTracingPipelinePropertiesKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:shaderGroupHandleSize is the size in bytes of the shader header.
  * [[limits-maxRayRecursionDepth]] pname:maxRayRecursionDepth is the
    maximum number of levels of ray recursion allowed in a trace command.
  * pname:maxShaderGroupStride is the maximum stride in bytes allowed
    between shader groups in the shader binding table.
  * pname:shaderGroupBaseAlignment is the required: alignment in bytes for
    the base of the shader binding table.
  * pname:shaderGroupHandleCaptureReplaySize is the number of bytes for the
    information required to do capture and replay for shader group handles.
  * pname:maxRayDispatchInvocationCount is the maximum number of ray
    generation shader invocations which may: be produced by a single
    flink:vkCmdTraceRaysIndirectKHR or flink:vkCmdTraceRaysKHR command.
  * pname:shaderGroupHandleAlignment is the required: alignment in bytes for
    each shader binding table entry.
  * pname:maxRayHitAttributeSize is the maximum size in bytes for a ray
    attribute structure

:refpage: VkPhysicalDeviceRayTracingPipelinePropertiesKHR
include::{chapters}/limits.txt[tag=limits_desc]

ifdef::VK_NV_ray_tracing[]
Limits specified by this structure must: match those specified with the same
name in slink:VkPhysicalDeviceRayTracingPropertiesNV.
endif::VK_NV_ray_tracing[]

include::{generated}/validity/structs/VkPhysicalDeviceRayTracingPipelinePropertiesKHR.txt[]
--
endif::VK_KHR_ray_tracing_pipeline[]

ifdef::VK_NV_cooperative_matrix[]
[open,refpage='VkPhysicalDeviceCooperativeMatrixPropertiesNV',desc='Structure describing cooperative matrix properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceCooperativeMatrixPropertiesNV structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-cooperativeMatrixSupportedStages]]
    pname:cooperativeMatrixSupportedStages is a bitfield of
    elink:VkShaderStageFlagBits describing the shader stages that
    cooperative matrix instructions are supported in.
    pname:cooperativeMatrixSupportedStages will have the
    ename:VK_SHADER_STAGE_COMPUTE_BIT bit set if any of the physical
    device's queues support ename:VK_QUEUE_COMPUTE_BIT.

:refpage: VkPhysicalDeviceCooperativeMatrixPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceCooperativeMatrixPropertiesNV.txt[]
--
endif::VK_NV_cooperative_matrix[]

ifdef::VK_NV_shader_sm_builtins[]
[open,refpage='VkPhysicalDeviceShaderSMBuiltinsPropertiesNV',desc='Structure describing shader SM Builtins properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceShaderSMBuiltinsPropertiesNV structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceShaderSMBuiltinsPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-shaderSMCount]] pname:shaderSMCount is the number of SMs on the
    device.
  * [[limits-shaderWarpsPerSM]] pname:shaderWarpsPerSM is the maximum number
    of simultaneously executing warps on an SM.

:refpage: VkPhysicalDeviceShaderSMBuiltinsPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceShaderSMBuiltinsPropertiesNV.txt[]
--
endif::VK_NV_shader_sm_builtins[]

ifdef::VK_EXT_texel_buffer_alignment[]
[open,refpage='VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT',desc='Structure describing the texel buffer alignment requirements supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-storageTexelBufferOffsetAlignmentBytes]]
    pname:storageTexelBufferOffsetAlignmentBytes is a byte alignment that is
    sufficient for a storage texel buffer of any format.
  * [[limits-storageTexelBufferOffsetSingleTexelAlignment]]
    pname:storageTexelBufferOffsetSingleTexelAlignment indicates whether
    single texel alignment is sufficient for a storage texel buffer of any
    format.
  * [[limits-uniformTexelBufferOffsetAlignmentBytes]]
    pname:uniformTexelBufferOffsetAlignmentBytes is a byte alignment that is
    sufficient for a uniform texel buffer of any format.
  * [[limits-uniformTexelBufferOffsetSingleTexelAlignment]]
    pname:uniformTexelBufferOffsetSingleTexelAlignment indicates whether
    single texel alignment is sufficient for a uniform texel buffer of any
    format.

:refpage: VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

If the single texel alignment property is ename:VK_FALSE, then the buffer
view's offset must: be aligned to the corresponding byte alignment value.
If the single texel alignment property is ename:VK_TRUE, then the buffer
view's offset must: be aligned to the lesser of the corresponding byte
alignment value or the size of a single texel, based on
slink:VkBufferViewCreateInfo::pname:format.
If the size of a single texel is a multiple of three bytes, then the size of
a single component of the format is used instead.

These limits must: not advertise a larger alignment than the
<<limits-required,required>> maximum minimum value of
slink:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment, for any
format that supports use as a texel buffer.

include::{generated}/validity/structs/VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT.txt[]
--
endif::VK_EXT_texel_buffer_alignment[]

ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
[open,refpage='VkPhysicalDeviceTimelineSemaphoreProperties',desc='Structure describing timeline semaphore properties that can be supported by an implementation',type='structs',alias='VkPhysicalDeviceTimelineSemaphorePropertiesKHR']
--
The sname:VkPhysicalDeviceTimelineSemaphoreProperties structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphoreProperties.txt[]

ifdef::VK_KHR_timeline_semaphore[]
or the equivalent

include::{generated}/api/structs/VkPhysicalDeviceTimelineSemaphorePropertiesKHR.txt[]
endif::VK_KHR_timeline_semaphore[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.

// Must have preceding whitespace
ifdef::VK_VERSION_1_2[:anchor-prefix: extension-]
ifndef::VK_VERSION_1_2[:anchor-prefix:]
// tag::VK_KHR_timeline_semaphore-properties[]
  * [[{anchor-prefix}limits-maxTimelineSemaphoreValueDifference]]
    pname:maxTimelineSemaphoreValueDifference indicates the maximum
    difference allowed by the implementation between the current value of a
    timeline semaphore and any pending signal or wait operations.
// end::VK_KHR_timeline_semaphore-properties[]

:refpage: VkPhysicalDeviceTimelineSemaphoreProperties
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceTimelineSemaphoreProperties.txt[]
--
endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]

ifdef::VK_EXT_line_rasterization[]
[open,refpage='VkPhysicalDeviceLineRasterizationPropertiesEXT',desc='Structure describing line rasterization properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceLineRasterizationPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceLineRasterizationPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-lineSubPixelPrecisionBits]] pname:lineSubPixelPrecisionBits is
    the number of bits of subpixel precision in framebuffer coordinates
    [eq]#x~f~# and [eq]#y~f~# when rasterizing <<primsrast-lines,line
    segments>>.

:refpage: VkPhysicalDeviceLineRasterizationPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceLineRasterizationPropertiesEXT.txt[]
--
endif::VK_EXT_line_rasterization[]

ifdef::VK_EXT_robustness2[]
[open,refpage='VkPhysicalDeviceRobustness2PropertiesEXT',desc='Structure describing robust buffer access properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceRobustness2PropertiesEXT structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceRobustness2PropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-robustStorageBufferAccessSizeAlignment]]
    pname:robustStorageBufferAccessSizeAlignment is the number of bytes that
    the range of a storage buffer descriptor is rounded up to when used for
    bounds-checking when
    <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled.
    This value is either 1 or 4.
  * [[limits-robustUniformBufferAccessSizeAlignment]]
    pname:robustUniformBufferAccessSizeAlignment is the number of bytes that
    the range of a uniform buffer descriptor is rounded up to when used for
    bounds-checking when
    <<features-robustBufferAccess2,pname:robustBufferAccess2>> is enabled.
    This value is a power of two in the range [1, 256].

:refpage: VkPhysicalDeviceRobustness2PropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceRobustness2PropertiesEXT.txt[]
--
endif::VK_EXT_robustness2[]

ifdef::VK_NV_device_generated_commands[]
[open,refpage='VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV',desc='Structure describing push descriptor limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:maxGraphicsShaderGroupCount is the maximum number of shader groups
    in slink:VkGraphicsPipelineShaderGroupsCreateInfoNV.
  * pname:maxIndirectSequenceCount is the maximum number of sequences in
    slink:VkGeneratedCommandsInfoNV and in
    slink:VkGeneratedCommandsMemoryRequirementsInfoNV.
  * pname:maxIndirectCommandsLayoutTokenCount is the maximum number of
    tokens in slink:VkIndirectCommandsLayoutCreateInfoNV.
  * pname:maxIndirectCommandsStreamCount is the maximum number of streams in
    slink:VkIndirectCommandsLayoutCreateInfoNV.
  * pname:maxIndirectCommandsTokenOffset is the maximum offset in
    sname:VkIndirectCommandsLayoutTokenNV.
  * pname:maxIndirectCommandsStreamStride is the maximum stream stride in
    slink:VkIndirectCommandsLayoutCreateInfoNV.
  * pname:minSequenceCountBufferOffsetAlignment is the minimum alignment for
    memory addresses which can: be used in sname:VkGeneratedCommandsInfoNV.
  * pname:minSequenceIndexBufferOffsetAlignment is the minimum alignment for
    memory addresses which can: be used in sname:VkGeneratedCommandsInfoNV.
  * pname:minIndirectCommandsBufferOffsetAlignment is the minimum alignment
    for memory addresses used in sname:VkIndirectCommandsStreamNV, and as
    preprocess buffer in sname:VkGeneratedCommandsInfoNV.

:refpage: VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV.txt[]
--

endif::VK_NV_device_generated_commands[]

ifdef::VK_KHR_portability_subset[]
[open,refpage='VkPhysicalDevicePortabilitySubsetPropertiesKHR',desc='Structure describing additional properties supported by a portable implementation',type='structs']
--
The sname:VkPhysicalDevicePortabilitySubsetPropertiesKHR structure is
defined as:

include::{generated}/api/structs/VkPhysicalDevicePortabilitySubsetPropertiesKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-minVertexInputBindingStrideAlignment]]
    pname:minVertexInputBindingStrideAlignment indicates the minimum
    alignment for vertex input strides.
    slink:VkVertexInputBindingDescription::pname:stride must: be a multiple
    of, and at least as large as, this value.

:refpage: VkPhysicalDevicePortabilitySubsetPropertiesKHR
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDevicePortabilitySubsetPropertiesKHR.txt[]
--
endif::VK_KHR_portability_subset[]


ifdef::VK_KHR_fragment_shading_rate[]
[open,refpage='VkPhysicalDeviceFragmentShadingRatePropertiesKHR',desc='Structure describing variable fragment shading rate limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceFragmentShadingRatePropertiesKHR structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRatePropertiesKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-minFragmentShadingRateAttachmentTexelSize]]
    pname:minFragmentShadingRateAttachmentTexelSize indicates minimum
    supported width and height of the portion of the framebuffer
    corresponding to each texel in a fragment shading rate attachment.
    Each value must: be less than or equal to the values in
    pname:maxFragmentShadingRateAttachmentTexelSize.
    Each value must: be a power-of-two.
    It must: be [eq]#(0,0)# if the <<features-attachmentFragmentShadingRate,
    pname:attachmentFragmentShadingRate>> feature is not supported.
  * [[limits-maxFragmentShadingRateAttachmentTexelSize]]
    pname:maxFragmentShadingRateAttachmentTexelSize indicates maximum
    supported width and height of the portion of the framebuffer
    corresponding to each texel in a fragment shading rate attachment.
    Each value must: be greater than or equal to the values in
    pname:minFragmentShadingRateAttachmentTexelSize.
    Each value must: be a power-of-two.
    It must: be [eq]#(0,0)# if the <<features-attachmentFragmentShadingRate,
    pname:attachmentFragmentShadingRate>> feature is not supported.
  * [[limits-maxFragmentShadingRateAttachmentTexelSizeAspectRatio]]
    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio indicates the
    maximum ratio between the width and height of the portion of the
    framebuffer corresponding to each texel in a fragment shading rate
    attachment.
    pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio must: be a
    power-of-two value, and must: be less than or equal to
    [eq]#max(pname:maxFragmentShadingRateAttachmentTexelSize.width /
    pname:minFragmentShadingRateAttachmentTexelSize.height,
    pname:maxFragmentShadingRateAttachmentTexelSize.height /
    pname:minFragmentShadingRateAttachmentTexelSize.width)#.
    It must: be 0 if the <<features-attachmentFragmentShadingRate,
    pname:attachmentFragmentShadingRate>> feature is not supported.
  * [[limits-primitiveFragmentShadingRateWithMultipleViewports]]
    pname:primitiveFragmentShadingRateWithMultipleViewports specifies
    whether the <<primsrast-fragment-shading-rate-primitive,primitive
    fragment shading rate>> can: be used when multiple viewports are used.
    If this value is ename:VK_FALSE, only a single viewport must: be used,
    and applications must: not write to the
ifdef::VK_NV_viewport_array2[]
    code:ViewportMaskNV or
endif::VK_NV_viewport_array2[]
    code:ViewportIndex built-in when setting code:PrimitiveShadingRateKHR.
    It must: be ename:VK_FALSE if
ifdef::VK_VERSION_1_2[]
    the <<features-shaderOutputViewportIndex,
    pname:shaderOutputViewportIndex>> feature,
endif::VK_VERSION_1_2[]
ifdef::VK_EXT_shader_viewport_index_layer[]
    the <<VK_EXT_shader_viewport_index_layer>> extension,
endif::VK_EXT_shader_viewport_index_layer[]
ifdef::VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer[or]
    the <<features-geometryShader, pname:geometryShader>> feature is not
    supported, or if the <<features-primitiveFragmentShadingRate,
    pname:primitiveFragmentShadingRate>> feature is not supported.
  * [[limits-layeredShadingRateAttachments]]
    pname:layeredShadingRateAttachments specifies whether a shading rate
    attachment image view can: be created with multiple layers.
    If this value is ename:VK_FALSE, when creating an image view with a
    pname:usage that includes
    ename:VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
    pname:layerCount must: be `1`.
    It must: be ename:VK_FALSE if
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
    the <<features-multiview,pname:multiview>> feature,
endif::VK_VERSION_1_1,VK_KHR_multiview[]
ifdef::VK_VERSION_1_2[]
    the <<features-shaderOutputViewportIndex,
    pname:shaderOutputViewportIndex>> feature,
endif::VK_VERSION_1_2[]
ifdef::VK_EXT_shader_viewport_index_layer[]
    the <<VK_EXT_shader_viewport_index_layer>> extension,
endif::VK_EXT_shader_viewport_index_layer[]
ifdef::VK_VERSION_1_1,VK_KHR_multiview,VK_VERSION_1_2,VK_EXT_shader_viewport_index_layer[or]
    the <<features-geometryShader, pname:geometryShader>> feature is not
    supported, or if the <<features-attachmentFragmentShadingRate,
    pname:attachmentFragmentShadingRate>> feature is not supported.
  * [[limits-fragmentShadingRateNonTrivialCombinerOps]]
    pname:fragmentShadingRateNonTrivialCombinerOps specifies whether
    elink:VkFragmentShadingRateCombinerOpKHR enums other than
    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR or
    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR can: be used.
    It must: be ename:VK_FALSE unless either the
    <<features-primitiveFragmentShadingRate,
    pname:primitiveFragmentShadingRate>> or
    <<features-attachmentFragmentShadingRate,
    pname:attachmentFragmentShadingRate>> feature is supported.
  * [[limits-maxFragmentSize]] pname:maxFragmentSize indicates the maximum
    supported width and height of a fragment.
    Its pname:width and pname:height members must: both be power-of-two
    values.
    This limit is purely informational, and is not validated.
  * [[limits-maxFragmentSizeAspectRatio]] pname:maxFragmentSizeAspectRatio
    indicates the maximum ratio between the width and height of a fragment.
    pname:maxFragmentSizeAspectRatio must: be a power-of-two value, and
    must: be less than or equal to the maximum of the pname:width and
    pname:height members of pname:maxFragmentSize.
    This limit is purely informational, and is not validated.
  * [[limits-maxFragmentShadingRateCoverageSamples]]
    pname:maxFragmentShadingRateCoverageSamples specifies the maximum number
    of coverage samples supported in a single fragment.
    pname:maxFragmentShadingRateCoverageSamples must: be less than or equal
    to the product of the pname:width and pname:height members of
    pname:maxFragmentSize, and the sample count reported by
    pname:maxFragmentShadingRateRasterizationSamples.
    pname:maxFragmentShadingRateCoverageSamples must: be less than or equal
    to [eq]#pname:maxSampleMaskWords {times} 32# if
    pname:fragmentShadingRateWithShaderSampleMask is supported.
    This limit is purely informational, and is not validated.
  * [[limits-maxFragmentShadingRateRasterizationSamples]]
    pname:maxFragmentShadingRateRasterizationSamples is a
    elink:VkSampleCountFlagBits value specifying the maximum sample rate
    supported when a fragment covers multiple pixels.
    This limit is purely informational, and is not validated.
  * [[limits-fragmentShadingRateWithShaderDepthStencilWrites]]
    pname:fragmentShadingRateWithShaderDepthStencilWrites specifies whether
    the implementation supports writing code:FragDepth
ifdef::VK_EXT_shader_stencil_export[]
    or code:FragStencilRefEXT
endif::VK_EXT_shader_stencil_export[]
    from a fragment shader for multi-pixel fragments.
    If this value is ename:VK_FALSE, writing to those built-ins will clamp
    the fragment shading rate to [eq]#(1,1)#.
  * [[limits-fragmentShadingRateWithSampleMask]]
    pname:fragmentShadingRateWithSampleMask specifies whether the the
    implementation supports setting valid bits of
    slink:VkPipelineMultisampleStateCreateInfo::pname:pSampleMask to `0` for
    multi-pixel fragments.
    If this value is ename:VK_FALSE, zeroing valid bits in the sample mask
    will clamp the fragment shading rate to [eq]#(1,1)#.
  * [[limits-fragmentShadingRateWithShaderSampleMask]]
    pname:fragmentShadingRateWithShaderSampleMask specifies whether the
    implementation supports reading or writing code:SampleMask for
    multi-pixel fragments.
    If this value is ename:VK_FALSE, using that built-in will clamp the
    fragment shading rate to [eq]#(1,1)#.
  * [[limits-fragmentShadingRateWithConservativeRasterization]]
    pname:fragmentShadingRateWithConservativeRasterization
ifndef::VK_EXT_conservative_rasterization[]
    is reserved for future use.
endif::VK_EXT_conservative_rasterization[]
ifdef::VK_EXT_conservative_rasterization[]
    specifies whether <<primsrast-conservativeraster, conservative
    rasterization>> is supported for multi-pixel fragments.
    It must: be ename:VK_FALSE if <<VK_EXT_conservative_rasterization>> is
    not supported.
    If this value is ename:VK_FALSE, using <<primsrast-conservativeraster,
    conservative rasterization>> will clamp the fragment shading rate to
    [eq]#(1,1)#.
endif::VK_EXT_conservative_rasterization[]
  * [[limits-fragmentShadingRateWithFragmentShaderInterlock]]
    pname:fragmentShadingRateWithFragmentShaderInterlock
ifndef::VK_EXT_fragment_shader_interlock[]
    is reserved for future use.
endif::VK_EXT_fragment_shader_interlock[]
ifdef::VK_EXT_fragment_shader_interlock[]
    specifies whether <<shaders-fragment-shader-interlock, fragment shader
    interlock>> is supported for multi-pixel fragments.
    It must: be ename:VK_FALSE if <<VK_EXT_fragment_shader_interlock>> is
    not supported.
    If this value is ename:VK_FALSE, using
    <<shaders-fragment-shader-interlock, fragment shader interlock>> will
    clamp the fragment shading rate to [eq]#(1,1)#.
endif::VK_EXT_fragment_shader_interlock[]
  * [[limits-fragmentShadingRateWithCustomSampleLocations]]
    pname:fragmentShadingRateWithCustomSampleLocations
ifndef::VK_EXT_sample_locations[]
    is reserved for future use.
endif::VK_EXT_sample_locations[]
ifdef::VK_EXT_sample_locations[]
    specifies whether <<primrast-samplelocations, custom sample locations>>
    are supported for multi-pixel fragments.
    It must: be ename:VK_FALSE if <<VK_EXT_sample_locations>> is not
    supported.
    If this value is ename:VK_FALSE, using <<primrast-samplelocations,
    custom sample locations>> will clamp the fragment shading rate to
    [eq]#(1,1)#.
endif::VK_EXT_sample_locations[]
  * [[limits-fragmentShadingRateStrictMultiplyCombiner]]
    pname:fragmentShadingRateStrictMultiplyCombiner specifies whether
    ename:VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR accurately performs a
    multiplication or not.
    Implementations where this value is ename:VK_FALSE will instead combine
    rates with an addition.
    If pname:fragmentShadingRateNonTrivialCombinerOps is ename:VK_FALSE,
    implementations must: report this as ename:VK_FALSE.
    If pname:fragmentShadingRateNonTrivialCombinerOps is ename:VK_TRUE,
    implementations should: report this as ename:VK_TRUE.

[NOTE]
.Note
====
Multiplication of the combiner rates using the fragment width/height in
linear space is equivalent to an addition of those values in log2 space.
Some implementations inadvertently implemented an addition in linear space
due to unclear requirements originating outside of this specification.
This resulted in <<limits-fragmentShadingRateStrictMultiplyCombiner,
pname:fragmentShadingRateStrictMultiplyCombiner>> being added.
Fortunately, this only affects situations where a rate of 1 in either
dimension is combined with another rate of 1.
All other combinations result in the exact same result as if multiplication
was performed in linear space due to the clamping logic, and the fact that
both the sum and product of 2 and 2 are equal.
In many cases, this limit will not affect the correct operation of
applications.
====

:refpage: VkPhysicalDeviceFragmentShadingRatePropertiesKHR
include::{chapters}/limits.txt[tag=limits_desc]

These properties are related to <<primsrast-primsrast-fragment-shading-rate,
fragment shading rates>>.

include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRatePropertiesKHR.txt[]
--
endif::VK_KHR_fragment_shading_rate[]

ifdef::VK_NV_fragment_shading_rate_enums[]
[open,refpage='VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV',desc='Structure describing fragment shading rate limits that can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxFragmentShadingRateInvocationCount]]
    pname:maxFragmentShadingRateInvocationCount is a
    elink:VkSampleCountFlagBits value indicating the maximum number of
    fragment shader invocations per fragment supported in pipeline,
    primitive, and attachment fragment shading rates.

:refpage: VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV
include::{chapters}/limits.txt[tag=limits_desc]

These properties are related to <<primsrast-primsrast-fragment-shading-rate,
fragment shading rates>>.

include::{generated}/validity/structs/VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV.txt[]
--
endif::VK_NV_fragment_shading_rate_enums[]

ifdef::VK_EXT_custom_border_color[]
[open,refpage='VkPhysicalDeviceCustomBorderColorPropertiesEXT',desc='Structure describing whether custom border colors can be supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceCustomBorderColorPropertiesEXT structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceCustomBorderColorPropertiesEXT.txt[]

  * [[limits-maxCustomBorderColorSamplers]]
    pname:maxCustomBorderColorSamplers indicates the maximum number of
    samplers with custom border colors which can: simultaneously exist on a
    device.

:refpage: VkPhysicalDeviceCustomBorderColorPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceCustomBorderColorPropertiesEXT.txt[]
--
endif::VK_EXT_custom_border_color[]

ifdef::VK_EXT_provoking_vertex[]
[open,refpage='VkPhysicalDeviceProvokingVertexPropertiesEXT',desc='Structure describing provoking vertex properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceProvokingVertexPropertiesEXT structure is defined
as:

include::{generated}/api/structs/VkPhysicalDeviceProvokingVertexPropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-provokingVertexModePerPipeline]]
    pname:provokingVertexModePerPipeline indicates whether the
    implementation supports graphics pipelines with different provoking
    vertex modes within the same renderpass instance.
  * [[limits-transformFeedbackPreservesTriangleFanProvokingVertex]]
    pname:transformFeedbackPreservesTriangleFanProvokingVertex indicates
    whether the implementation can preserve the provoking vertex order when
    writing triangle fan vertices to transform feedback.

:refpage: VkPhysicalDeviceProvokingVertexPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceProvokingVertexPropertiesEXT.txt[]
--
endif::VK_EXT_provoking_vertex[]

ifdef::VK_HUAWEI_subpass_shading[]
[open,refpage='VkPhysicalDeviceSubpassShadingPropertiesHUAWEI',desc='Structure describing subpass shading properties supported by an implementation',type='structs']
--
The sname:VkPhysicalDeviceSubpassShadingPropertiesHUAWEI structure is
defined as:

include::{generated}/api/structs/VkPhysicalDeviceSubpassShadingPropertiesHUAWEI.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * [[limits-maxSubpassShadingWorkgroupSizeAspectRatio]]
    pname:maxSubpassShadingWorkgroupSizeAspectRatio indicates the maximum
    ratio between the width and height of the portion of the subpass shading
    shader workgroup size.
    pname:maxSubpassShadingWorkgroupSizeAspectRatio must: be a power-of-two
    value, and must: be less than or equal to max(code:WorkgroupSize.x /
    code:WorkgroupSize.y, code:WorkgroupSize.y / code:WorkgroupSize.x).

:refpage: VkPhysicalDeviceSubpassShadingPropertiesHUAWEI
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceSubpassShadingPropertiesHUAWEI.txt[]
--
endif::VK_HUAWEI_subpass_shading[]

ifdef::VK_EXT_multi_draw[]

[open,refpage='VkPhysicalDeviceMultiDrawPropertiesEXT',desc='Structure describing multidraw limits of an implementation',type='structs']
--
The sname:VkPhysicalDeviceMultiDrawPropertiesEXT structure is defined as:

include::{generated}/api/structs/VkPhysicalDeviceMultiDrawPropertiesEXT.txt[]

The members of the sname:VkPhysicalDeviceMultiDrawPropertiesEXT structure
describe the following features:

  * [[limits-maxMultiDrawCount]] pname:maxMultiDrawCount indicates the
    maximum number of draw calls which can: be batched into a single
    multidraw.

:refpage: VkPhysicalDeviceMultiDrawPropertiesPropertiesEXT
include::{chapters}/limits.txt[tag=limits_desc]

include::{generated}/validity/structs/VkPhysicalDeviceMultiDrawPropertiesEXT.txt[]
--

endif::VK_EXT_multi_draw[]

[[limits-minmax]]
== Limit Requirements

The following table specifies the required: minimum/maximum for all Vulkan
graphics implementations.
Where a limit corresponds to a fine-grained device feature which is
optional:, the feature name is listed with two required: limits, one when
the feature is supported and one when it is not supported.
If an implementation supports a feature, the limits reported are the same
whether or not the feature is enabled.

[[limits-types]]
.Required Limit Types
[width="100%",cols="<20%,<50%,<30%",options="header"]
|====
| Type                     | Limit                                      | Feature
| code:uint32_t            | pname:maxImageDimension1D                  | -
| code:uint32_t            | pname:maxImageDimension2D                  | -
| code:uint32_t            | pname:maxImageDimension3D                  | -
| code:uint32_t            | pname:maxImageDimensionCube                | -
| code:uint32_t            | pname:maxImageArrayLayers                  | -
| code:uint32_t            | pname:maxTexelBufferElements               | -
| code:uint32_t            | pname:maxUniformBufferRange                | -
| code:uint32_t            | pname:maxStorageBufferRange                | -
| code:uint32_t            | pname:maxPushConstantsSize                 | -
| code:uint32_t            | pname:maxMemoryAllocationCount             | -
| code:uint32_t            | pname:maxSamplerAllocationCount            | -
| basetype:VkDeviceSize    | pname:bufferImageGranularity               | -
| basetype:VkDeviceSize    | pname:sparseAddressSpaceSize               | pname:sparseBinding
| code:uint32_t            | pname:maxBoundDescriptorSets               | -
| code:uint32_t            | pname:maxPerStageDescriptorSamplers        | -
| code:uint32_t            | pname:maxPerStageDescriptorUniformBuffers  | -
| code:uint32_t            | pname:maxPerStageDescriptorStorageBuffers  | -
| code:uint32_t            | pname:maxPerStageDescriptorSampledImages   | -
| code:uint32_t            | pname:maxPerStageDescriptorStorageImages   | -
| code:uint32_t            | pname:maxPerStageDescriptorInputAttachments| -
| code:uint32_t            | pname:maxPerStageResources                 | -
| code:uint32_t            | pname:maxDescriptorSetSamplers             | -
| code:uint32_t            | pname:maxDescriptorSetUniformBuffers       | -
| code:uint32_t            | pname:maxDescriptorSetUniformBuffersDynamic| -
| code:uint32_t            | pname:maxDescriptorSetStorageBuffers       | -
| code:uint32_t            | pname:maxDescriptorSetStorageBuffersDynamic| -
| code:uint32_t            | pname:maxDescriptorSetSampledImages        | -
| code:uint32_t            | pname:maxDescriptorSetStorageImages        | -
| code:uint32_t            | pname:maxDescriptorSetInputAttachments     | -
| code:uint32_t            | pname:maxVertexInputAttributes             | -
| code:uint32_t            | pname:maxVertexInputBindings               | -
| code:uint32_t            | pname:maxVertexInputAttributeOffset        | -
| code:uint32_t            | pname:maxVertexInputBindingStride          | -
| code:uint32_t            | pname:maxVertexOutputComponents            | -
| code:uint32_t            | pname:maxTessellationGenerationLevel       | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationPatchSize             | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationControlPerVertexInputComponents  | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationControlPerVertexOutputComponents | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationControlPerPatchOutputComponents  | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationControlTotalOutputComponents     | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationEvaluationInputComponents        | pname:tessellationShader
| code:uint32_t            | pname:maxTessellationEvaluationOutputComponents       | pname:tessellationShader
| code:uint32_t            | pname:maxGeometryShaderInvocations         | pname:geometryShader
| code:uint32_t            | pname:maxGeometryInputComponents           | pname:geometryShader
| code:uint32_t            | pname:maxGeometryOutputComponents          | pname:geometryShader
| code:uint32_t            | pname:maxGeometryOutputVertices            | pname:geometryShader
| code:uint32_t            | pname:maxGeometryTotalOutputComponents     | pname:geometryShader
| code:uint32_t            | pname:maxFragmentInputComponents           | -
| code:uint32_t            | pname:maxFragmentOutputAttachments         | -
| code:uint32_t            | pname:maxFragmentDualSrcAttachments        | pname:dualSrcBlend
| code:uint32_t            | pname:maxFragmentCombinedOutputResources   | -
| code:uint32_t            | pname:maxComputeSharedMemorySize           | -
| 3 {times} code:uint32_t  | pname:maxComputeWorkGroupCount             | -
| code:uint32_t            | pname:maxComputeWorkGroupInvocations       | -
| 3 {times} code:uint32_t  | pname:maxComputeWorkGroupSize              | -
| code:uint32_t            | pname:subPixelPrecisionBits                | -
| code:uint32_t            | pname:subTexelPrecisionBits                | -
| code:uint32_t            | pname:mipmapPrecisionBits                  | -
| code:uint32_t            | pname:maxDrawIndexedIndexValue             | pname:fullDrawIndexUint32
| code:uint32_t            | pname:maxDrawIndirectCount                 | pname:multiDrawIndirect
| code:float               | pname:maxSamplerLodBias                    | -
| code:float               | pname:maxSamplerAnisotropy                 | pname:samplerAnisotropy
| code:uint32_t            | pname:maxViewports                         | pname:multiViewport
| 2 {times} code:uint32_t  | pname:maxViewportDimensions                | -
| 2 {times} code:float     | pname:viewportBoundsRange                  | -
| code:uint32_t            | pname:viewportSubPixelBits                 | -
| code:size_t              | pname:minMemoryMapAlignment                | -
| basetype:VkDeviceSize    | pname:minTexelBufferOffsetAlignment        | -
| basetype:VkDeviceSize    | pname:minUniformBufferOffsetAlignment      | -
| basetype:VkDeviceSize    | pname:minStorageBufferOffsetAlignment      | -
| code:int32_t             | pname:minTexelOffset                       | -
| code:uint32_t            | pname:maxTexelOffset                       | -
| code:int32_t             | pname:minTexelGatherOffset                 | pname:shaderImageGatherExtended
| code:uint32_t            | pname:maxTexelGatherOffset                 | pname:shaderImageGatherExtended
| code:float               | pname:minInterpolationOffset               | pname:sampleRateShading
| code:float               | pname:maxInterpolationOffset               | pname:sampleRateShading
| code:uint32_t            | pname:subPixelInterpolationOffsetBits      | pname:sampleRateShading
| code:uint32_t            | pname:maxFramebufferWidth                  | -
| code:uint32_t            | pname:maxFramebufferHeight                 | -
| code:uint32_t            | pname:maxFramebufferLayers                 | -
| tlink:VkSampleCountFlags | pname:framebufferColorSampleCounts         | -
ifdef::VK_VERSION_1_2[]
| tlink:VkSampleCountFlags | pname:framebufferIntegerColorSampleCounts  | -
endif::VK_VERSION_1_2[]
| tlink:VkSampleCountFlags | pname:framebufferDepthSampleCounts         | -
| tlink:VkSampleCountFlags | pname:framebufferStencilSampleCounts       | -
| tlink:VkSampleCountFlags | pname:framebufferNoAttachmentsSampleCounts | -
| code:uint32_t            | pname:maxColorAttachments                  | -
| tlink:VkSampleCountFlags | pname:sampledImageColorSampleCounts        | -
| tlink:VkSampleCountFlags | pname:sampledImageIntegerSampleCounts      | -
| tlink:VkSampleCountFlags | pname:sampledImageDepthSampleCounts        | -
| tlink:VkSampleCountFlags | pname:sampledImageStencilSampleCounts      | -
| tlink:VkSampleCountFlags | pname:storageImageSampleCounts             | pname:shaderStorageImageMultisample
| code:uint32_t            | pname:maxSampleMaskWords                   | -
| basetype:VkBool32        | pname:timestampComputeAndGraphics          | -
| code:float               | pname:timestampPeriod                      | -
| code:uint32_t            | pname:maxClipDistances                     | pname:shaderClipDistance
| code:uint32_t            | pname:maxCullDistances                     | pname:shaderCullDistance
| code:uint32_t            | pname:maxCombinedClipAndCullDistances      | pname:shaderCullDistance
| code:uint32_t            | pname:discreteQueuePriorities              | -
| 2 {times} code:float     | pname:pointSizeRange                       | pname:largePoints
| 2 {times} code:float     | pname:lineWidthRange                       | pname:wideLines
| code:float               | pname:pointSizeGranularity                 | pname:largePoints
| code:float               | pname:lineWidthGranularity                 | pname:wideLines
| basetype:VkBool32        | pname:strictLines                          | -
| basetype:VkBool32        | pname:standardSampleLocations              | -
| basetype:VkDeviceSize    | pname:optimalBufferCopyOffsetAlignment     | -
| basetype:VkDeviceSize    | pname:optimalBufferCopyRowPitchAlignment   | -
| basetype:VkDeviceSize    | pname:nonCoherentAtomSize                  | -
ifdef::VK_EXT_discard_rectangles[]
| code:uint32_t            | pname:maxDiscardRectangles                 | `<<VK_EXT_discard_rectangles>>`
endif::VK_EXT_discard_rectangles[]
ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
// Jon - add VK_VERSION_1_2 to the limit, not just the extension
| basetype:VkBool32        | pname:filterMinmaxSingleComponentFormats   | `<<VK_EXT_sampler_filter_minmax>>`
| basetype:VkBool32        | pname:filterMinmaxImageComponentMapping    | `<<VK_EXT_sampler_filter_minmax>>`
endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
ifdef::VK_EXT_conservative_rasterization[]
| code:float           | pname:primitiveOverestimationSize                 | `<<VK_EXT_conservative_rasterization>>`
| basetype:VkBool32        | pname:maxExtraPrimitiveOverestimationSize         | `<<VK_EXT_conservative_rasterization>>`
| code:float           | pname:extraPrimitiveOverestimationSizeGranularity | `<<VK_EXT_conservative_rasterization>>`
| basetype:VkBool32        | pname:degenerateTriangleRasterized                | `<<VK_EXT_conservative_rasterization>>`
| code:float           | pname:degenerateLinesRasterized                   | `<<VK_EXT_conservative_rasterization>>`
| basetype:VkBool32        | pname:fullyCoveredFragmentShaderInputVariable     | `<<VK_EXT_conservative_rasterization>>`
| basetype:VkBool32        | pname:conservativeRasterizationPostDepthCoverage  | `<<VK_EXT_conservative_rasterization>>`
endif::VK_EXT_conservative_rasterization[]
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
| code:uint32_t     | pname:maxUpdateAfterBindDescriptorsInAllPools             | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| basetype:VkBool32 | pname:shaderUniformBufferArrayNonUniformIndexingNative    | -
| basetype:VkBool32 | pname:shaderSampledImageArrayNonUniformIndexingNative     | -
| basetype:VkBool32 | pname:shaderStorageBufferArrayNonUniformIndexingNative    | -
| basetype:VkBool32 | pname:shaderStorageImageArrayNonUniformIndexingNative     | -
| basetype:VkBool32 | pname:shaderInputAttachmentArrayNonUniformIndexingNative  | -
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindSamplers        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers  | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers  | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindSampledImages   | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindStorageImages   | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageDescriptorUpdateAfterBindInputAttachments| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxPerStageUpdateAfterBindResources                 | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindSamplers             | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindUniformBuffers       | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageBuffers       | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic| `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindSampledImages        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindStorageImages        | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
| code:uint32_t     | pname:maxDescriptorSetUpdateAfterBindInputAttachments     | `<<features-descriptorIndexing,pname:descriptorIndexing>>`
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_vertex_attribute_divisor[]
| code:uint32_t            | pname:maxVertexAttribDivisor               | `<<VK_EXT_vertex_attribute_divisor>>`
endif::VK_EXT_vertex_attribute_divisor[]
ifdef::VK_NV_mesh_shader[]
| code:uint32_t            | pname:maxDrawMeshTasksCount               | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxTaskWorkGroupInvocations         | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxTaskWorkGroupSize                | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxTaskTotalMemorySize              | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxTaskOutputCount                  | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshWorkGroupInvocations         | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshWorkGroupSize                | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshTotalMemorySize              | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshOutputVertices               | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshOutputPrimitives             | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:maxMeshMultiviewViewCount           | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:meshOutputPerVertexGranularity      | `<<VK_NV_mesh_shader>>`
| code:uint32_t            | pname:meshOutputPerPrimitiveGranularity   | `<<VK_NV_mesh_shader>>`
endif::VK_NV_mesh_shader[]
ifdef::VK_EXT_transform_feedback[]
| code:uint32_t            | pname:maxTransformFeedbackStreams                 | `<<VK_EXT_transform_feedback>>`
| code:uint32_t            | pname:maxTransformFeedbackBuffers                 | `<<VK_EXT_transform_feedback>>`
| basetype:VkDeviceSize    | pname:maxTransformFeedbackBufferSize              | `<<VK_EXT_transform_feedback>>`
| code:uint32_t            | pname:maxTransformFeedbackStreamDataSize          | `<<VK_EXT_transform_feedback>>`
| code:uint32_t            | pname:maxTransformFeedbackBufferDataSize          | `<<VK_EXT_transform_feedback>>`
| code:uint32_t            | pname:maxTransformFeedbackBufferDataStride        | `<<VK_EXT_transform_feedback>>`
| basetype:VkBool32        | pname:transformFeedbackQueries                    | `<<VK_EXT_transform_feedback>>`
| basetype:VkBool32        | pname:transformFeedbackStreamsLinesTriangles      | `<<VK_EXT_transform_feedback>>`
| basetype:VkBool32        | pname:transformFeedbackRasterizationStreamSelect  | `<<VK_EXT_transform_feedback>>`
| basetype:VkBool32        | pname:transformFeedbackDraw                       | `<<VK_EXT_transform_feedback>>`
endif::VK_EXT_transform_feedback[]
ifdef::VK_EXT_fragment_density_map[]
| slink:VkExtent2D         | pname:minFragmentDensityTexelSize         | `<<VK_EXT_fragment_density_map>>`
| slink:VkExtent2D         | pname:maxFragmentDensityTexelSize         | `<<VK_EXT_fragment_density_map>>`
| basetype:VkBool32        | pname:fragmentDensityInvocations          | `<<VK_EXT_fragment_density_map>>`
endif::VK_EXT_fragment_density_map[]
ifdef::VK_EXT_fragment_density_map2[]
| basetype:VkBool32        | pname:subsampledLoads                           | `<<VK_EXT_fragment_density_map2>>`
| basetype:VkBool32        | pname:subsampledCoarseReconstructionEarlyAccess | `<<VK_EXT_fragment_density_map2>>`
| code:uint32_t            | pname:maxSubsampledArrayLayers                  | `<<VK_EXT_fragment_density_map2>>`
| code:uint32_t            | pname:maxDescriptorSetSubsampledSamplers        | `<<VK_EXT_fragment_density_map2>>`
endif::VK_EXT_fragment_density_map2[]
ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
| code:uint32_t            | pname:maxGeometryCount                         | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_acceleration_structure>>`
| code:uint32_t            | pname:maxInstanceCount                         | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_acceleration_structure>>`
endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
| code:uint32_t            | pname:shaderGroupHandleSize                    | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:maxShaderGroupStride                     | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:shaderGroupBaseAlignment                 | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_ray_tracing_pipeline>>`
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing[]
| code:uint32_t            | pname:maxRecursionDepth                        | `<<VK_NV_ray_tracing>>`
| code:uint32_t            | pname:maxTriangleCount                         | `<<VK_NV_ray_tracing>>`
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_acceleration_structure[]
| code:uint32_t            | pname:maxPerStageDescriptorAccelerationStructures
                                                                            | `<<VK_KHR_acceleration_structure>>`
| code:uint32_t            | pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures
                                                                            | `<<VK_KHR_acceleration_structure>>`
endif::VK_KHR_acceleration_structure[]
ifdef::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
| code:uint32_t            | pname:maxDescriptorSetAccelerationStructures   | `<<VK_NV_ray_tracing>>`, `<<VK_KHR_acceleration_structure>>`
endif::VK_NV_ray_tracing,VK_KHR_acceleration_structure[]
ifdef::VK_KHR_acceleration_structure[]
| code:uint32_t            | pname:maxDescriptorSetUpdateAfterBindAccelerationStructures
                                                                            | `<<VK_KHR_acceleration_structure>>`
| code:uint32_t            | pname:minAccelerationStructureScratchOffsetAlignment
                                                                            | `<<VK_KHR_acceleration_structure>>`
endif::VK_KHR_acceleration_structure[]
ifdef::VK_KHR_ray_tracing_pipeline[]
| code:uint32_t            | pname:maxRayRecursionDepth                     | `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:shaderGroupHandleCaptureReplaySize       | `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:maxRayDispatchInvocationCount            | `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:shaderGroupHandleAlignment               | `<<VK_KHR_ray_tracing_pipeline>>`
| code:uint32_t            | pname:maxRayHitAttributeSize                   | `<<VK_KHR_ray_tracing_pipeline>>`
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
| code:uint64_t            | pname:maxTimelineSemaphoreValueDifference      | `<<features-timelineSemaphore,pname:timelineSemaphore>>`
endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
ifdef::VK_EXT_line_rasterization[]
| code:uint32_t            | pname:lineSubPixelPrecisionBits                | `<<VK_EXT_line_rasterization>>`
endif::VK_EXT_line_rasterization[]
ifdef::VK_EXT_custom_border_color[]
| code:uint32_t            | pname:maxCustomBorderColorSamplers             | `<<VK_EXT_custom_border_color>>`
endif::VK_EXT_custom_border_color[]
ifdef::VK_EXT_robustness2[]
| basetype:VkDeviceSize    | pname:robustStorageBufferAccessSizeAlignment   | `<<VK_EXT_robustness2>>`
| basetype:VkDeviceSize    | pname:robustUniformBufferAccessSizeAlignment   | `<<VK_EXT_robustness2>>`
endif::VK_EXT_robustness2[]
ifdef::VK_KHR_fragment_shading_rate[]
| 2 {times} code:uint32_t       | pname:minFragmentShadingRateAttachmentTexelSize           | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
| 2 {times} code:uint32_t       | pname:maxFragmentShadingRateAttachmentTexelSize           | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
| code:uint32_t                 | pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
| basetype:VkBool32             | pname:primitiveFragmentShadingRateWithMultipleViewports   | `<<features-primitiveFragmentShadingRate,pname:primitiveFragmentShadingRate>>`
| basetype:VkBool32             | pname:layeredShadingRateAttachments                       | `<<features-attachmentFragmentShadingRate,pname:attachmentFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateNonTrivialCombinerOps            | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| 2 {times} code:uint32_t       | pname:maxFragmentSize                                     | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| code:uint32_t                 | pname:maxFragmentSizeAspectRatio                          | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| code:uint32_t                 | pname:maxFragmentShadingRateCoverageSamples               | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| elink:VkSampleCountFlagBits   | pname:maxFragmentShadingRateRasterizationSamples          | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithShaderDepthStencilWrites     | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithSampleMask                   | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithShaderSampleMask             | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithConservativeRasterization    | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithFragmentShaderInterlock      | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateWithCustomSampleLocations        | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
| basetype:VkBool32             | pname:fragmentShadingRateStrictMultiplyCombiner           | `<<features-pipelineFragmentShadingRate,pname:pipelineFragmentShadingRate>>`
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_NV_fragment_shading_rate_enums[]
| elink:VkSampleCountFlagBits   | pname:maxFragmentShadingRateInvocationCount               | `<<features-supersampleFragmentShadingRates,pname:supersampleFragmentShadingRates>>`
endif::VK_NV_fragment_shading_rate_enums[]
ifdef::VK_HUAWEI_subpass_shading[]
| code:uint32_t                 | pname:maxSubpassShadingWorkgroupSizeAspectRatio | `<<features-subpassShading,pname:subpassShading>>`
endif::VK_HUAWEI_subpass_shading[]
|====

[[limits-required]]
.Required Limits
[width="100%",cols="<35,<9,<14,<11",options="header"]
|====
| Limit | Unsupported Limit | Supported Limit | Limit Type^1^
| pname:maxImageDimension1D                  | - | 4096    | min
| pname:maxImageDimension2D                  | - | 4096    | min
| pname:maxImageDimension3D                  | - | 256     | min
| pname:maxImageDimensionCube                | - | 4096    | min
| pname:maxImageArrayLayers                  | - | 256     | min
| pname:maxTexelBufferElements               | - | 65536   | min
| pname:maxUniformBufferRange                | - | 16384   | min
| pname:maxStorageBufferRange                | - | 2^27^   | min
| pname:maxPushConstantsSize                 | - | 128     | min
| pname:maxMemoryAllocationCount             | - | 4096    | min
| pname:maxSamplerAllocationCount            | - | 4000    | min
| pname:bufferImageGranularity               | - | 131072  | max
| pname:sparseAddressSpaceSize               | 0 | 2^31^   | min
| pname:maxBoundDescriptorSets               | - | 4       | min
| pname:maxPerStageDescriptorSamplers        | - | 16      | min
| pname:maxPerStageDescriptorUniformBuffers  | - | 12      | min
| pname:maxPerStageDescriptorStorageBuffers  | - | 4       | min
| pname:maxPerStageDescriptorSampledImages   | - | 16      | min
| pname:maxPerStageDescriptorStorageImages   | - | 4       | min
| pname:maxPerStageDescriptorInputAttachments| - | 4       | min
| pname:maxPerStageResources                 | - | 128 ^2^ | min
| pname:maxDescriptorSetSamplers             | - | 96 ^8^  | min, _n_ {times} PerStage
| pname:maxDescriptorSetUniformBuffers       | - | 72 ^8^  | min, _n_ {times} PerStage
| pname:maxDescriptorSetUniformBuffersDynamic| - | 8       | min
| pname:maxDescriptorSetStorageBuffers       | - | 24 ^8^  | min, _n_ {times} PerStage
| pname:maxDescriptorSetStorageBuffersDynamic| - | 4       | min
| pname:maxDescriptorSetSampledImages        | - | 96 ^8^  | min, _n_ {times} PerStage
| pname:maxDescriptorSetStorageImages        | - | 24 ^8^  | min, _n_ {times} PerStage
| pname:maxDescriptorSetInputAttachments     | - | 4       | min
| pname:maxVertexInputAttributes             | - | 16      | min
ifndef::VK_KHR_portability_subset[]
| pname:maxVertexInputBindings               | - | 16      | min
endif::VK_KHR_portability_subset[]
ifdef::VK_KHR_portability_subset[]
| pname:maxVertexInputBindings               | - | 16 ^10^ | min
endif::VK_KHR_portability_subset[]
| pname:maxVertexInputAttributeOffset        | - | 2047    | min
| pname:maxVertexInputBindingStride          | - | 2048    | min
| pname:maxVertexOutputComponents            | - | 64      | min
| pname:maxTessellationGenerationLevel       | 0 | 64      | min
| pname:maxTessellationPatchSize             | 0 | 32      | min
| pname:maxTessellationControlPerVertexInputComponents  | 0 |64 | min
| pname:maxTessellationControlPerVertexOutputComponents | 0 |64 | min
| pname:maxTessellationControlPerPatchOutputComponents  | 0 |120 | min
| pname:maxTessellationControlTotalOutputComponents     | 0 |2048 | min
| pname:maxTessellationEvaluationInputComponents        | 0 |64 | min
| pname:maxTessellationEvaluationOutputComponents       | 0 |64 | min
| pname:maxGeometryShaderInvocations         | 0 | 32      | min
| pname:maxGeometryInputComponents           | 0 | 64      | min
| pname:maxGeometryOutputComponents          | 0 | 64      | min
| pname:maxGeometryOutputVertices            | 0 | 256     | min
| pname:maxGeometryTotalOutputComponents     | 0 | 1024    | min
| pname:maxFragmentInputComponents           | - | 64      | min
| pname:maxFragmentOutputAttachments         | - | 4       | min
| pname:maxFragmentDualSrcAttachments        | 0 | 1       | min
| pname:maxFragmentCombinedOutputResources   | - | 4       | min
| pname:maxComputeSharedMemorySize           | - | 16384   | min
| pname:maxComputeWorkGroupCount             | - | (65535,65535,65535) | min
| pname:maxComputeWorkGroupInvocations       | - | 128     | min
| pname:maxComputeWorkGroupSize              | - | (128,128,64) | min
| pname:subPixelPrecisionBits                | - | 4       | min
| pname:subTexelPrecisionBits                | - | 4       | min
| pname:mipmapPrecisionBits                  | - | 4       | min
| pname:maxDrawIndexedIndexValue             | 2^24^-1 | 2^32^-1 | min
| pname:maxDrawIndirectCount                 | 1 | 2^16^-1 | min
| pname:maxSamplerLodBias                    | - | 2       | min
| pname:maxSamplerAnisotropy                 | 1 | 16      | min
| pname:maxViewports                         | 1 | 16      | min
| pname:maxViewportDimensions                | - | (4096,4096) ^3^  | min
| pname:viewportBoundsRange                  | - | (-8192,8191) ^4^ | (max,min)
| pname:viewportSubPixelBits                 | - | 0   | min
| pname:minMemoryMapAlignment                | - | 64  | min
| pname:minTexelBufferOffsetAlignment        | - | 256 | max
| pname:minUniformBufferOffsetAlignment      | - | 256 | max
| pname:minStorageBufferOffsetAlignment      | - | 256 | max
| pname:minTexelOffset                       | - | -8  | max
| pname:maxTexelOffset                       | - | 7   | min
| pname:minTexelGatherOffset                 | 0 | -8  | max
| pname:maxTexelGatherOffset                 | 0 | 7   | min
| pname:minInterpolationOffset               |0.0| -0.5 ^5^ | max
| pname:maxInterpolationOffset               |0.0| 0.5 - (1 ULP) ^5^ | min
| pname:subPixelInterpolationOffsetBits      | 0 | 4 ^5^ | min
| pname:maxFramebufferWidth                  | - | 4096  | min
| pname:maxFramebufferHeight                 | - | 4096  | min
| pname:maxFramebufferLayers                 | - | 256   | min
| pname:framebufferColorSampleCounts         | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
ifdef::VK_VERSION_1_2[]
| pname:framebufferIntegerColorSampleCounts  | - | (ename:VK_SAMPLE_COUNT_1_BIT)                                | min
endif::VK_VERSION_1_2[]
| pname:framebufferDepthSampleCounts         | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:framebufferStencilSampleCounts       | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:framebufferNoAttachmentsSampleCounts | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:maxColorAttachments                  | - | 4     | min
| pname:sampledImageColorSampleCounts        | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:sampledImageIntegerSampleCounts      | - | ename:VK_SAMPLE_COUNT_1_BIT                                  | min
| pname:sampledImageDepthSampleCounts        | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:sampledImageStencilSampleCounts      | - | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:storageImageSampleCounts             | ename:VK_SAMPLE_COUNT_1_BIT | (ename:VK_SAMPLE_COUNT_1_BIT \| ename:VK_SAMPLE_COUNT_4_BIT) | min
| pname:maxSampleMaskWords                   | - | 1     | min
| pname:timestampComputeAndGraphics          | - | -     |implementation-dependent
| pname:timestampPeriod                      | - | -     |duration
| pname:maxClipDistances                     | 0 | 8     | min
| pname:maxCullDistances                     | 0 | 8     | min
| pname:maxCombinedClipAndCullDistances      | 0 | 8     | min
| pname:discreteQueuePriorities              | - | 2     | min
| pname:pointSizeRange                       | (1.0,1.0) | (1.0,64.0 - ULP)^6^| (max,min)
| pname:lineWidthRange                       | (1.0,1.0) | (1.0,8.0 - ULP)^7^ | (max,min)
| pname:pointSizeGranularity                 |  0.0 | 1.0 ^6^ | max, fixed point increment
| pname:lineWidthGranularity                 |  0.0 | 1.0 ^7^ | max, fixed point increment
| pname:strictLines                          | - | -   | implementation-dependent
| pname:standardSampleLocations              | - | -   | implementation-dependent
| pname:optimalBufferCopyOffsetAlignment     | - | -   | recommendation
| pname:optimalBufferCopyRowPitchAlignment   | - | -   | recommendation
| pname:nonCoherentAtomSize                  | - | 256 | max
ifdef::VK_KHR_push_descriptor[]
| pname:maxPushDescriptors                   | - | 32  | min
endif::VK_KHR_push_descriptor[]
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
| pname:maxMultiviewViewCount                | - |  6  | min
| pname:maxMultiviewInstanceIndex            | - |  2^27^-1  | min
endif::VK_VERSION_1_1,VK_KHR_multiview[]
ifdef::VK_EXT_discard_rectangles[]
| pname:maxDiscardRectangles                 | 0 | 4   | min
endif::VK_EXT_discard_rectangles[]
ifdef::VK_EXT_sample_locations[]
| pname:sampleLocationSampleCounts           | - | ename:VK_SAMPLE_COUNT_4_BIT | min
| pname:maxSampleLocationGridSize            | - | (1,1) | min
| pname:sampleLocationCoordinateRange        | - | (0.0, 0.9375) | (max,min)
| pname:sampleLocationSubPixelBits           | - | 4   | min
| pname:variableSampleLocations              | - |false| implementation-dependent
endif::VK_EXT_sample_locations[]
ifdef::VK_EXT_external_memory_host[]
| pname:minImportedHostPointerAlignment      | - | 65536 | max
endif::VK_EXT_external_memory_host[]
ifdef::VK_NVX_multiview_per_view_attributes[]
| pname:perViewPositionAllComponents         | - | -   | implementation-dependent
endif::VK_NVX_multiview_per_view_attributes[]
ifdef::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
| pname:filterMinmaxSingleComponentFormats   | - | -   | implementation-dependent
| pname:filterMinmaxImageComponentMapping    | - | -   | implementation-dependent
endif::VK_VERSION_1_2,VK_EXT_sampler_filter_minmax[]
ifdef::VK_EXT_blend_operation_advanced[]
| pname:advancedBlendMaxColorAttachments        | - | 1   | min
| pname:advancedBlendIndependentBlend           | - |false| implementation-dependent
| pname:advancedBlendNonPremultipliedSrcColor   | - |false| implementation-dependent
| pname:advancedBlendNonPremultipliedDstColor   | - |false| implementation-dependent
| pname:advancedBlendCorrelatedOverlap          | - |false| implementation-dependent
| pname:advancedBlendAllOperations              | - |false| implementation-dependent
endif::VK_EXT_blend_operation_advanced[]
ifdef::VK_VERSION_1_1,VK_KHR_maintenance3[]
| pname:maxPerSetDescriptors                                | - |1024 | min
| pname:maxMemoryAllocationSize                             | - | 2^30^ | min
endif::VK_VERSION_1_1,VK_KHR_maintenance3[]
ifdef::VK_EXT_conservative_rasterization[]
| pname:primitiveOverestimationSize                 | - |0.0   | min
| pname:maxExtraPrimitiveOverestimationSize         | - |0.0   | min
| pname:extraPrimitiveOverestimationSizeGranularity | - |0.0   | min
| pname:primitiveUnderestimation                    | - |false | implementation-dependent
| pname:conservativePointAndLineRasterization       | - |false | implementation-dependent
| pname:degenerateTrianglesRasterized               | - |false | implementation-dependent
| pname:degenerateLinesRasterized                   | - |false | implementation-dependent
| pname:fullyCoveredFragmentShaderInputVariable     | - |false | implementation-dependent
| pname:conservativeRasterizationPostDepthCoverage  | - |false | implementation-dependent
endif::VK_EXT_conservative_rasterization[]
ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
| pname:maxUpdateAfterBindDescriptorsInAllPools             | 0 |500000| min
| pname:shaderUniformBufferArrayNonUniformIndexingNative    | - |false| implementation-dependent
| pname:shaderSampledImageArrayNonUniformIndexingNative     | - |false| implementation-dependent
| pname:shaderStorageBufferArrayNonUniformIndexingNative    | - |false| implementation-dependent
| pname:shaderStorageImageArrayNonUniformIndexingNative     | - |false| implementation-dependent
| pname:shaderInputAttachmentArrayNonUniformIndexingNative  | - |false| implementation-dependent
| pname:maxPerStageDescriptorUpdateAfterBindSamplers        | 0^9^ |500000 ^9^ | min
| pname:maxPerStageDescriptorUpdateAfterBindUniformBuffers  | 0^9^ |12 ^9^ | min
| pname:maxPerStageDescriptorUpdateAfterBindStorageBuffers  | 0^9^ |500000 ^9^ | min
| pname:maxPerStageDescriptorUpdateAfterBindSampledImages   | 0^9^ |500000 ^9^ | min
| pname:maxPerStageDescriptorUpdateAfterBindStorageImages   | 0^9^ |500000 ^9^ | min
| pname:maxPerStageDescriptorUpdateAfterBindInputAttachments| 0^9^ |4 ^9^ | min
| pname:maxPerStageUpdateAfterBindResources                 | 0^9^ |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindSamplers             | 0^9^ |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindUniformBuffers       | 0^9^ |72 ^8^ ^9^ | min, _n_ {times} PerStage
| pname:maxDescriptorSetUpdateAfterBindUniformBuffersDynamic| 0^9^ |8 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindStorageBuffers       | 0^9^ |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindStorageBuffersDynamic| 0^9^ |4 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindSampledImages        | 0^9^ |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindStorageImages        | 0^9^ |500000 ^9^ | min
| pname:maxDescriptorSetUpdateAfterBindInputAttachments     | 0^9^ |4 ^9^ | min
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
ifdef::VK_EXT_inline_uniform_block[]
| pname:maxInlineUniformBlockSize                               | - | 256   | min
| pname:maxPerStageDescriptorInlineUniformBlocks                | - | 4     | min
| pname:maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks | - | 4     | min
| pname:maxDescriptorSetInlineUniformBlocks                     | - | 4     | min
| pname:maxDescriptorSetUpdateAfterBindInlineUniformBlocks      | - | 4     | min
endif::VK_EXT_inline_uniform_block[]
ifdef::VK_EXT_vertex_attribute_divisor[]
| pname:maxVertexAttribDivisor               | - | 2^16^-1   | min
endif::VK_EXT_vertex_attribute_divisor[]
ifdef::VK_NV_mesh_shader[]
| pname:maxDrawMeshTasksCount                | - | 2^16^-1   | min
| pname:maxTaskWorkGroupInvocations          | - | 32        | min
| pname:maxTaskWorkGroupSize                 | - | (32,1,1)  | min
| pname:maxTaskTotalMemorySize               | - | 16384     | min
| pname:maxTaskOutputCount                   | - | 2^16^-1   | min
| pname:maxMeshWorkGroupInvocations          | - | 32        | min
| pname:maxMeshWorkGroupSize                 | - | (32,1,1)  | min
| pname:maxMeshTotalMemorySize               | - | 16384     | min
| pname:maxMeshOutputVertices                | - | 256       | min
| pname:maxMeshOutputPrimitives              | - | 256       | min
| pname:maxMeshMultiviewViewCount            | - | 1         | min
| pname:meshOutputPerVertexGranularity       | - | -         | implementation-dependent
| pname:meshOutputPerPrimitiveGranularity    | - | -         | implementation-dependent
endif::VK_NV_mesh_shader[]
ifdef::VK_EXT_transform_feedback[]
| pname:maxTransformFeedbackStreams                         | - | 1         | min
| pname:maxTransformFeedbackBuffers                         | - | 1         | min
| pname:maxTransformFeedbackBufferSize                      | - | 2^27^     | min
| pname:maxTransformFeedbackStreamDataSize                  | - | 512       | min
| pname:maxTransformFeedbackBufferDataSize                  | - | 512       | min
| pname:maxTransformFeedbackBufferDataStride                | - | 512       | min
| pname:transformFeedbackQueries                            | - | false     | implementation-dependent
| pname:transformFeedbackStreamsLinesTriangles              | - | false     | implementation-dependent
| pname:transformFeedbackRasterizationStreamSelect          | - | false     | implementation-dependent
| pname:transformFeedbackDraw                               | - | false     | implementation-dependent
endif::VK_EXT_transform_feedback[]
ifdef::VK_EXT_fragment_density_map[]
| pname:minFragmentDensityTexelSize          | - | (1,1)  | min
| pname:maxFragmentDensityTexelSize          | - | (1,1)  | min
| pname:fragmentDensityInvocations           | - |  -     | implementation-dependent
endif::VK_EXT_fragment_density_map[]
ifdef::VK_EXT_fragment_density_map2[]
| pname:subsampledLoads                           | true  | false | implementation-dependent
| pname:subsampledCoarseReconstructionEarlyAccess | false | false | implementation-dependent
| pname:maxSubsampledArrayLayers                  | 2     | 2     | min
| pname:maxDescriptorSetSubsampledSamplers        | 1     | 1     | min
endif::VK_EXT_fragment_density_map2[]
ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_NV_ray_tracing[]
| slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:shaderGroupHandleSize | - | 16      | min
| slink:VkPhysicalDeviceRayTracingPropertiesNV::pname:maxRecursionDepth     | - | 31      | min
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_ray_tracing_pipeline[]
| slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:shaderGroupHandleSize | - | 32      | exact
| slink:VkPhysicalDeviceRayTracingPipelinePropertiesKHR::pname:maxRayRecursionDepth  | - | 1       | min
endif::VK_KHR_ray_tracing_pipeline[]
| pname:maxShaderGroupStride                     | - | 4096    | min
| pname:shaderGroupBaseAlignment                 | - | 64      | max
| pname:maxGeometryCount                         | - | 2^24^-1 | min
| pname:maxInstanceCount                         | - | 2^24^-1 | min
ifdef::VK_NV_ray_tracing[]
| pname:maxTriangleCount                         | - | 2^29^-1 | min
endif::VK_NV_ray_tracing[]
ifdef::VK_KHR_acceleration_structure[]
| pname:maxPrimitiveCount                        | - | 2^29^-1 | min
| pname:maxPerStageDescriptorAccelerationStructures                 | - | 16         | min
| pname:maxPerStageDescriptorUpdateAfterBindAccelerationStructures  | - | 500000 ^9^ | min
endif::VK_KHR_acceleration_structure[]
| pname:maxDescriptorSetAccelerationStructures                      | - | 16         | min
endif::VK_NV_ray_tracing,VK_KHR_ray_tracing_pipeline[]
ifdef::VK_KHR_acceleration_structure[]
| pname:maxDescriptorSetUpdateAfterBindAccelerationStructures       | - | 500000 ^9^ | min
| pname:minAccelerationStructureScratchOffsetAlignment              | - | 256        | max
endif::VK_KHR_acceleration_structure[]
ifdef::VK_KHR_ray_tracing_pipeline[]
| pname:shaderGroupHandleCaptureReplaySize              | - | 64  | max
| pname:maxRayDispatchInvocationCount                   | - | 2^30^ | min
| pname:shaderGroupHandleAlignment                      | - | 32  | max
| pname:maxRayHitAttributeSize                          | - | 32  | min
endif::VK_KHR_ray_tracing_pipeline[]
ifdef::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
| pname:maxTimelineSemaphoreValueDifference      | - | 2^31^-1 | min
endif::VK_VERSION_1_2,VK_KHR_timeline_semaphore[]
ifdef::VK_EXT_line_rasterization[]
| pname:lineSubPixelPrecisionBits                | - | 4    | min
endif::VK_EXT_line_rasterization[]
ifdef::VK_NV_device_generated_commands[]
| pname:maxGraphicsShaderGroupCount               | - | 2^12^   | min
| pname:maxIndirectSequenceCount                  | - | 2^20^   | min
| pname:maxIndirectCommandsTokenCount             | - | 16     | min
| pname:maxIndirectCommandsStreamCount            | - | 16     | min
| pname:maxIndirectCommandsTokenOffset            | - | 2047   | min
| pname:maxIndirectCommandsStreamStride           | - | 2048   | min
| pname:minSequencesCountBufferOffsetAlignment    | - | 256    | max
| pname:minSequencesIndexBufferOffsetAlignment    | - | 256    | max
| pname:minIndirectCommandsBufferOffsetAlignment  | - | 256    | max
endif::VK_NV_device_generated_commands[]
ifdef::VK_EXT_custom_border_color[]
| pname:maxCustomBorderColorSamplers              | - | 32    | min
endif::VK_EXT_custom_border_color[]
ifdef::VK_EXT_robustness2[]
| pname:robustStorageBufferAccessSizeAlignment   | - | 4    | max
| pname:robustUniformBufferAccessSizeAlignment   | - | 256  | max
endif::VK_EXT_robustness2[]
ifdef::VK_KHR_fragment_shading_rate[]
| pname:minFragmentShadingRateAttachmentTexelSize           | (0,0) | (32,32) | max
| pname:maxFragmentShadingRateAttachmentTexelSize           | (0,0) | (8,8)   | min
| pname:maxFragmentShadingRateAttachmentTexelSizeAspectRatio |  0   |   1     | min
| pname:primitiveFragmentShadingRateWithMultipleViewports   | false | false   | implementation-dependent
| pname:layeredShadingRateAttachments                       | false | false   | implementation-dependent
| pname:fragmentShadingRateNonTrivialCombinerOps            |   -   | false   | implementation-dependent
| pname:maxFragmentSize                                     |   -   | (2,2)   | min
| pname:maxFragmentSizeAspectRatio                          |   -   | 2       | min
| pname:maxFragmentShadingRateCoverageSamples               |   -   | 16      | min
| pname:maxFragmentShadingRateRasterizationSamples          |   -   | ename:VK_SAMPLE_COUNT_4_BIT      | min
| pname:fragmentShadingRateWithShaderDepthStencilWrites     |   -   | false   | implementation-dependent
| pname:fragmentShadingRateWithSampleMask                   |   -   | false   | implementation-dependent
| pname:fragmentShadingRateWithShaderSampleMask             |   -   | false   | implementation-dependent
| pname:fragmentShadingRateWithConservativeRasterization    |   -   | false   | implementation-dependent
| pname:fragmentShadingRateWithFragmentShaderInterlock      |   -   | false   | implementation-dependent
| pname:fragmentShadingRateWithCustomSampleLocations        |   -   | false   | implementation-dependent
| pname:fragmentShadingRateStrictMultiplyCombiner           |   -   | false   | implementation-dependent
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_NV_fragment_shading_rate_enums[]
| pname:maxFragmentShadingRateInvocationCount               | - | ename:VK_SAMPLE_COUNT_4_BIT | min
endif::VK_NV_fragment_shading_rate_enums[]
ifdef::VK_HUAWEI_subpass_shading[]
| pname:maxSubpassShadingWorkgroupSizeAspectRatio |  0   |   1     | min
endif::VK_HUAWEI_subpass_shading[]
ifdef::VK_EXT_multi_draw[]
| pname:maxMultiDrawCount               | - | 1024 | min
endif::VK_EXT_multi_draw[]
|====

1::
    The *Limit Type* column specifies the limit is either the minimum limit
    all implementations must: support, the maximum limit all implementations
    must: support, or the exact value all implementations must: support.
    For bitmasks a minimum limit is the least bits all implementations must:
    set, but they may: have additional bits set beyond this minimum.

2::
    The pname:maxPerStageResources must: be at least the smallest of the
    following:
+
  * the sum of the pname:maxPerStageDescriptorUniformBuffers,
    pname:maxPerStageDescriptorStorageBuffers,
    pname:maxPerStageDescriptorSampledImages,
    pname:maxPerStageDescriptorStorageImages,
    pname:maxPerStageDescriptorInputAttachments, pname:maxColorAttachments
    limits, or
  * 128.
+
It may: not be possible to reach this limit in every stage.

3::
    See <<limits-maxViewportDimensions,pname:maxViewportDimensions>> for the
    required: relationship to other limits.

4::
    See <<limits-viewportboundsrange,pname:viewportBoundsRange>> for the
    required: relationship to other limits.

5::
    The values pname:minInterpolationOffset and pname:maxInterpolationOffset
    describe the closed interval of supported interpolation offsets:
    [pname:minInterpolationOffset, pname:maxInterpolationOffset].
    The ULP is determined by pname:subPixelInterpolationOffsetBits.
    If pname:subPixelInterpolationOffsetBits is 4, this provides increments
    of (1/2^4^) = 0.0625, and thus the range of supported interpolation
    offsets would be [eq]#[-0.5, 0.4375]#.

6::
    The point size ULP is determined by pname:pointSizeGranularity.
    If the pname:pointSizeGranularity is 0.125, the range of supported point
    sizes must: be at least [1.0, 63.875].

7::
    The line width ULP is determined by pname:lineWidthGranularity.
    If the pname:lineWidthGranularity is 0.0625, the range of supported line
    widths must: be at least [1.0, 7.9375].

8::
    The minimum ptext:maxDescriptorSet* limit is _n_ times the corresponding
    _specification_ minimum ptext:maxPerStageDescriptor* limit, where _n_ is
    the number of shader stages supported by the slink:VkPhysicalDevice.
    If all shader stages are supported, _n_ = 6 (vertex, tessellation
    control, tessellation evaluation, geometry, fragment, compute).

ifdef::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]
9::
    The ptext:UpdateAfterBind descriptor limits must: each be greater than
    or equal to the corresponding ptext:non-UpdateAfterBind limit.
endif::VK_VERSION_1_2,VK_EXT_descriptor_indexing[]

ifdef::VK_KHR_portability_subset[]
10::
     If the `<<VK_KHR_portability_subset>>` extension is enabled, the
     required minimum value of pname:maxVertexInputBindings is code:8.
endif::VK_KHR_portability_subset[]


ifdef::VK_EXT_sample_locations[]

[[limits-multisample]]
== Additional Multisampling Capabilities

[open,refpage='vkGetPhysicalDeviceMultisamplePropertiesEXT',desc='Report sample count specific multisampling capabilities of a physical device',type='protos']
--
To query additional multisampling capabilities which may: be supported for a
specific sample count, beyond the minimum capabilities described for
<<limits, Limits>> above, call:

include::{generated}/api/protos/vkGetPhysicalDeviceMultisamplePropertiesEXT.txt[]

  * pname:physicalDevice is the physical device from which to query the
    additional multisampling capabilities.
  * pname:samples is a elink:VkSampleCountFlagBits value specifying the
    sample count to query capabilities for.
  * pname:pMultisampleProperties is a pointer to a
    slink:VkMultisamplePropertiesEXT structure in which information about
    additional multisampling capabilities specific to the sample count is
    returned.

include::{generated}/validity/protos/vkGetPhysicalDeviceMultisamplePropertiesEXT.txt[]
--

[open,refpage='VkMultisamplePropertiesEXT',desc='Structure returning information about sample count specific additional multisampling capabilities',type='structs']
--
The sname:VkMultisamplePropertiesEXT structure is defined as

include::{generated}/api/structs/VkMultisamplePropertiesEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:maxSampleLocationGridSize is the maximum size of the pixel grid in
    which sample locations can: vary.

include::{generated}/validity/structs/VkMultisamplePropertiesEXT.txt[]
--

If the sample count for which additional multisampling capabilities are
requested using fname:vkGetPhysicalDeviceMultisamplePropertiesEXT is set
in sname:VkPhysicalDeviceSampleLocationsPropertiesEXT::
<<limits-sampleLocationSampleCounts, pname:sampleLocationSampleCounts>> the
pname:width and pname:height members of
sname:VkMultisamplePropertiesEXT::pname:maxSampleLocationGridSize must: be
greater than or equal to the corresponding members of
sname:VkPhysicalDeviceSampleLocationsPropertiesEXT::
<<limits-maxSampleLocationGridSize,pname:maxSampleLocationGridSize>>,
respectively, otherwise both members must: be `0`.
endif::VK_EXT_sample_locations[]

// If you are adding a new features structure, it must be placed at the end
// of the previous section (immediately before [[limits-multisample]]).
