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

// Common Valid Usage
// Common to all drawing commands
include::draw_dispatch_common.txt[]
  * [[VUID-{refpage}-renderPass-02684]]
    The current render pass must: be <<renderpass-compatibility,compatible>>
    with the pname:renderPass member of the
    sname:VkGraphicsPipelineCreateInfo structure specified when creating the
    sname:VkPipeline bound to ename:VK_PIPELINE_BIND_POINT_GRAPHICS
  * [[VUID-{refpage}-subpass-02685]]
    The subpass index of the current render pass must: be equal to the
    pname:subpass member of the sname:VkGraphicsPipelineCreateInfo structure
    specified when creating the sname:VkPipeline bound to
    ename:VK_PIPELINE_BIND_POINT_GRAPHICS
  * [[VUID-{refpage}-None-02686]]
    Every input attachment used by the current subpass must: be bound to the
    pipeline via a descriptor set
  * [[VUID-{refpage}-None-04584]]
    Image subresources used as attachments in the current render pass must:
    not be accessed in any way other than as an attachment by this command,
    except for cases involving read-only access to depth/stencil attachments
    as described in the <<renderpass-attachment-nonattachment, Render Pass>>
    chapter
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
  * [[VUID-{refpage}-maxMultiviewInstanceIndex-02688]]
    If the draw is recorded in a render pass instance with multiview
    enabled, the maximum instance index must: be less than or equal to
    slink:VkPhysicalDeviceMultiviewProperties::pname:maxMultiviewInstanceIndex
endif::VK_VERSION_1_1,VK_KHR_multiview[]
ifdef::VK_EXT_sample_locations[]
  * [[VUID-{refpage}-sampleLocationsEnable-02689]]
    If the bound graphics pipeline was created with
    slink:VkPipelineSampleLocationsStateCreateInfoEXT::pname:sampleLocationsEnable
    set to ename:VK_TRUE and the current subpass has a depth/stencil
    attachment, then that attachment must: have been created with the
    ename:VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set
endif::VK_EXT_sample_locations[]
ifdef::VK_EXT_extended_dynamic_state[]
  * [[VUID-{refpage}-viewportCount-03417]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
    but not the ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state
    enabled, then flink:vkCmdSetViewportWithCountEXT must: have been called
    in the current command buffer prior to this drawing command, and the
    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
    must: match the
    sname:VkPipelineViewportStateCreateInfo::pname:scissorCount of the
    pipeline
  * [[VUID-{refpage}-scissorCount-03418]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but
    not the ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state
    enabled, then flink:vkCmdSetScissorWithCountEXT must: have been called
    in the current command buffer prior to this drawing command, and the
    pname:scissorCount parameter of fname:vkCmdSetScissorWithCountEXT must:
    match the sname:VkPipelineViewportStateCreateInfo::pname:viewportCount
    of the pipeline
  * [[VUID-{refpage}-viewportCount-03419]]
    If the bound graphics pipeline state was created with both the
    ename:VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled
    then both flink:vkCmdSetViewportWithCountEXT and
    flink:vkCmdSetScissorWithCountEXT must: have been called in the current
    command buffer prior to this drawing command, and the
    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
    must: match the pname:scissorCount parameter of
    fname:vkCmdSetScissorWithCountEXT
ifdef::VK_NV_clip_space_w_scaling[]
  * [[VUID-{refpage}-viewportCount-04137]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
    but not the ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state
    enabled, then the bound graphics pipeline must: have been created with
    slink:VkPipelineViewportWScalingStateCreateInfoNV::pname:viewportCount
    greater or equal to the pname:viewportCount parameter in the last call
    to flink:vkCmdSetViewportWithCountEXT
  * [[VUID-{refpage}-viewportCount-04138]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT and
    ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic states enabled then
    the pname:viewportCount parameter in the last call to
    flink:vkCmdSetViewportWScalingNV must: be greater than or equal to the
    pname:viewportCount parameter in the last call to
    flink:vkCmdSetViewportWithCountEXT
endif::VK_NV_clip_space_w_scaling[]
ifdef::VK_NV_shading_rate_image[]
  * [[VUID-{refpage}-viewportCount-04139]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
    but not the ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV
    dynamic state enabled, then the bound graphics pipeline must: have been
    created with
    slink:VkPipelineViewportShadingRateImageStateCreateInfoNV::pname:viewportCount
    greater or equal to the pname:viewportCount parameter in the last call
    to flink:vkCmdSetViewportWithCountEXT
  * [[VUID-{refpage}-viewportCount-04140]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT and
    ename:VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV dynamic states
    enabled then the pname:viewportCount parameter in the last call to
    flink:vkCmdSetViewportShadingRatePaletteNV must: be greater than or
    equal to the pname:viewportCount parameter in the last call to
    flink:vkCmdSetViewportWithCountEXT
endif::VK_NV_shading_rate_image[]
ifdef::VK_NV_viewport_swizzle[]
  * [[VUID-{refpage}-VkPipelineVieportCreateInfo-04141]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled and
    a slink:VkPipelineViewportSwizzleStateCreateInfoNV structure chained
    from pname:VkPipelineVieportCreateInfo, then the bound graphics pipeline
    must: have been created with
    slink:VkPipelineViewportSwizzleStateCreateInfoNV::pname:viewportCount
    greater or equal to the pname:viewportCount parameter in the last call
    to flink:vkCmdSetViewportWithCountEXT
endif::VK_NV_viewport_swizzle[]
ifdef::VK_NV_scissor_exclusive[]
  * [[VUID-{refpage}-VkPipelineVieportCreateInfo-04142]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled and
    a slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV structure
    chained from pname:VkPipelineVieportCreateInfo, then the bound graphics
    pipeline must: have been created with
    slink:VkPipelineViewportExclusiveScissorStateCreateInfoNV::pname:exclusiveScissorCount
    greater or equal to the pname:viewportCount parameter in the last call
    to flink:vkCmdSetViewportWithCountEXT
endif::VK_NV_scissor_exclusive[]
  * [[VUID-{refpage}-primitiveTopology-03420]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then
    flink:vkCmdSetPrimitiveTopologyEXT must: have been called in the current
    command buffer prior to this drawing command, and the
    pname:primitiveTopology parameter of fname:vkCmdSetPrimitiveTopologyEXT
    must: be of the same <<drawing-primitive-topology-class, topology
    class>> as the pipeline
    slink:VkPipelineInputAssemblyStateCreateInfo::pname:topology state
endif::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_extended_dynamic_state2[]
  * [[VUID-{refpage}-None-04875]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT dynamic state enabled
    then flink:vkCmdSetPatchControlPointsEXT must: have been called in the
    current command buffer prior to this drawing command
  * [[VUID-{refpage}-None-04876]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT dynamic state
    enabled then flink:vkCmdSetRasterizerDiscardEnableEXT must: have been
    called in the current command buffer prior to this drawing command
  * [[VUID-{refpage}-None-04877]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT dynamic state enabled then
    flink:vkCmdSetDepthBiasEnableEXT must: have been called in the current
    command buffer prior to this drawing command
  * [[VUID-{refpage}-logicOp-04878]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_LOGIC_OP_EXT dynamic state enabled then
    flink:vkCmdSetLogicOpEXT must: have been called in the current command
    buffer prior to this drawing command and the pname:logicOp must: be a
    valid elink:VkLogicOp value
  * [[VUID-{refpage}-None-04879]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT dynamic state
    enabled then flink:vkCmdSetPrimitiveRestartEnableEXT must: have been
    called in the current command buffer prior to this drawing command
endif::VK_EXT_extended_dynamic_state2[]
ifdef::VK_KHR_fragment_shading_rate+VK_EXT_extended_dynamic_state[]
  * [[VUID-{refpage}-primitiveFragmentShadingRateWithMultipleViewports-04552]]
    If the <<limits-primitiveFragmentShadingRateWithMultipleViewports,
    pname:primitiveFragmentShadingRateWithMultipleViewports>> limit is not
    supported, the bound graphics pipeline was created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled,
    and any of the shader stages of the bound graphics pipeline write to the
    code:PrimitiveShadingRateKHR built-in, then
    flink:vkCmdSetViewportWithCountEXT must: have been called in the current
    command buffer prior to this drawing command, and the
    pname:viewportCount parameter of fname:vkCmdSetViewportWithCountEXT
    must: be `1`
endif::VK_KHR_fragment_shading_rate+VK_EXT_extended_dynamic_state[]
  * [[VUID-{refpage}-blendEnable-04727]]
    If rasterization is not disabled in the bound graphics pipeline, then
    for each color attachment in the subpass, if the corresponding image
    view's <<resources-image-view-format-features,format features>> do not
    contain ename:VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT, then the
    pname:blendEnable member of the corresponding element of the
    pname:pAttachments member of pname:pColorBlendState must: be
    ename:VK_FALSE
  * [[VUID-{refpage}-rasterizationSamples-04740]]
    If rasterization is not disabled in the bound graphics pipeline, and
    neither the `apiext:VK_AMD_mixed_attachment_samples` nor the
    `apiext:VK_NV_framebuffer_mixed_samples` extensions are enabled, then
    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
    must: be the same as the current subpass color and/or depth/stencil
    attachments
ifdef::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_vertex_input_dynamic_state[]
  * [[VUID-{refpage}-None-04912]]
    If the bound graphics pipeline was created with both the
    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT and
    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic states
    enabled, then flink:vkCmdSetVertexInputEXT must: have been called in the
    current command buffer prior to this draw command
  * [[VUID-{refpage}-pStrides-04913]]
    If the bound graphics pipeline was created with the
    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state
    enabled, but not the ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic
    state enabled, then flink:vkCmdBindVertexBuffers2EXT must: have been
    called in the current command buffer prior to this draw command, and the
    pname:pStrides parameter of flink:vkCmdBindVertexBuffers2EXT must: not
    be `NULL`
endif::VK_EXT_vertex_input_dynamic_state[]
ifndef::VK_EXT_vertex_input_dynamic_state[]
  * [[VUID-{refpage}-pStrides-04884]]
    If the bound graphics pipeline was created with the
    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state
    enabled, then flink:vkCmdBindVertexBuffers2EXT must: have been called in
    the current command buffer prior to this drawing command, and the
    pname:pStrides parameter of flink:vkCmdBindVertexBuffers2EXT must: not
    be `NULL`
endif::VK_EXT_vertex_input_dynamic_state[]
endif::VK_EXT_extended_dynamic_state[]
ifdef::VK_EXT_vertex_input_dynamic_state[]
  * [[VUID-{refpage}-None-04914]]
    If the bound graphics pipeline state was created with the
    ename:VK_DYNAMIC_STATE_VERTEX_INPUT_EXT dynamic state enabled, then
    flink:vkCmdSetVertexInputEXT must: have been called in the current
    command buffer prior to this draw command
endif::VK_EXT_vertex_input_dynamic_state[]
ifdef::VK_KHR_dynamic_rendering[]
  * [[VUID-{refpage}-imageView-06172]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
    member of pname:pDepthAttachment is
    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command
    must: not write any values to the depth attachment
  * [[VUID-{refpage}-imageView-06173]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
    pname:layout member of pname:pStencilAttachment is
    ename:VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, this command
    must: not write any values to the stencil attachment
ifdef::VK_VERSION_1_1,VK_KHR_maintenance2[]
  * [[VUID-{refpage}-imageView-06174]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
    member of pname:pDepthAttachment is
    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, this
    command must: not write any values to the depth attachment
  * [[VUID-{refpage}-imageView-06175]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
    pname:layout member of pname:pStencilAttachment is
    ename:VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, this
    command must: not write any values to the stencil attachment
endif::VK_VERSION_1_1,VK_KHR_maintenance2[]
ifdef::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
  * [[VUID-{refpage}-imageView-06176]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pDepthAttachment is not dlink:VK_NULL_HANDLE, and the pname:layout
    member of pname:pDepthAttachment is
    ename:VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, this command must: not
    write any values to the depth attachment
  * [[VUID-{refpage}-imageView-06177]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the pname:imageView member of
    pname:pStencilAttachment is not dlink:VK_NULL_HANDLE, and the
    pname:layout member of pname:pStencilAttachment is
    ename:VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, this command must: not
    write any values to the stencil attachment
endif::VK_VERSION_1_2,VK_KHR_separate_depth_stencil_layouts[]
  * [[VUID-{refpage}-viewMask-06178]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound graphics pipeline
    must: have been created with a
    slink:VkPipelineRenderingCreateInfoKHR::pname:viewMask equal to
    slink:VkRenderingInfoKHR::pname:viewMask
  * [[VUID-{refpage}-colorAttachmentCount-06179]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound graphics pipeline
    must: have been created with a
    slink:VkPipelineRenderingCreateInfoKHR::pname:colorAttachmentCount equal
    to slink:VkRenderingInfoKHR::pname:colorAttachmentCount
  * [[VUID-{refpage}-colorAttachmentCount-06180]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR and
    slink:VkRenderingInfoKHR::pname:colorAttachmentCount greater than `0`,
    then each element of the
    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
    created with a elink:VkFormat equal to the corresponding element of
    slink:VkPipelineRenderingCreateInfoKHR::pname:pColorAttachmentFormats
    used to create the currently bound graphics pipeline
  * [[VUID-{refpage}-pDepthAttachment-06181]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR and
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of
    slink:VkPipelineRenderingCreateInfoKHR::pname:depthAttachmentFormat used
    to create the currently bound graphics pipeline must: be equal to the
    elink:VkFormat used to create
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
  * [[VUID-{refpage}-pStencilAttachment-06182]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR and
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of
    slink:VkPipelineRenderingCreateInfoKHR::pname:stencilAttachmentFormat
    used to create the currently bound graphics pipeline must: be equal to
    the elink:VkFormat used to create
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
ifdef::VK_KHR_fragment_shading_rate[]
  * [[VUID-{refpage}-imageView-06183]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR and
    slink:VkRenderingFragmentShadingRateAttachmentInfoKHR::pname:imageView
    was not dlink:VK_NULL_HANDLE, the currently bound graphics pipeline
    must: have been created with
    ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR
endif::VK_KHR_fragment_shading_rate[]
ifdef::VK_EXT_fragment_density_map[]
  * [[VUID-{refpage}-imageView-06184]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR and
    slink:VkRenderingFragmentDensityMapAttachmentInfoEXT::pname:imageView
    was not dlink:VK_NULL_HANDLE, the currently bound graphics pipeline
    must: have been created with
    ename:VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
endif::VK_EXT_fragment_density_map[]
ifdef::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
  * [[VUID-{refpage}-colorAttachmentCount-06185]]
    If the currently bound pipeline was created with a
    slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and the current render
    pass instance was begun with flink:vkCmdBeginRenderingKHR with a
    slink:VkRenderingInfoKHR::pname:colorAttachmentCount parameter greater
    than `0`, then each element of the
    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
    created with a sample count equal to the corresponding element of the
    pname:pColorAttachmentSamples member of
    slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
    graphics pipeline
  * [[VUID-{refpage}-pDepthAttachment-06186]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
    with a slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of the
    pname:depthStencilAttachmentSamples member of
    slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
    graphics pipeline must: be equal to the sample count used to create
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
  * [[VUID-{refpage}-pStencilAttachment-06187]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
    with a slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of the
    pname:depthStencilAttachmentSamples member of
    slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV used to create the currently bound
    graphics pipeline must: be equal to the sample count used to create
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
  * [[VUID-{refpage}-colorAttachmentCount-06188]]
    If the currently bound pipeline was created without a
    slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and the current render
    pass instance was begun with flink:vkCmdBeginRenderingKHR with a
    slink:VkRenderingInfoKHR::pname:colorAttachmentCount parameter greater
    than `0`, then each element of the
    slink:VkRenderingInfoKHR::pname:pColorAttachments array with a
    pname:imageView not equal to dlink:VK_NULL_HANDLE must: have been
    created with a sample count equal to the value of
    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
    used to create the currently bound graphics pipeline
  * [[VUID-{refpage}-pDepthAttachment-06189]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
    without a slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of
    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
    used to create the currently bound graphics pipeline must: be equal to
    the sample count used to create
    slink:VkRenderingInfoKHR::pname:pDepthAttachment->pname:imageView
  * [[VUID-{refpage}-pStencilAttachment-06190]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound pipeline was created
    without a slink:VkAttachmentSampleCountInfoAMD or
    slink:VkAttachmentSampleCountInfoNV structure, and
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView was
    not dlink:VK_NULL_HANDLE, the value of
    slink:VkPipelineMultisampleStateCreateInfo::pname:rasterizationSamples
    used to create the currently bound graphics pipeline must: be equal to
    the sample count used to create
    slink:VkRenderingInfoKHR::pname:pStencilAttachment->pname:imageView
  * [[VUID-{refpage}-renderPass-06198]]
    If the current render pass instance was begun with
    flink:vkCmdBeginRenderingKHR, the currently bound pipeline must: have
    been created with a slink:VkGraphicsPipelineCreateInfo::pname:renderPass
    equal to dlink:VK_NULL_HANDLE
endif::VK_AMD_mixed_attachment_samples,VK_NV_framebuffer_mixed_samples[]
endif::VK_KHR_dynamic_rendering[]
// Common Valid Usage
