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

// Common Valid Usage
// Common to VkPipelineStageFlags2KHR parameters
// Set "stageMaskName" attribute to the name of the stage mask to validate
  * [[VUID-{refpage}-{stageMaskName}-03929]]
    If the <<features-geometryShader,geometry shaders>> feature is not
    enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR
  * [[VUID-{refpage}-{stageMaskName}-03930]]
    If the <<features-tessellationShader,tessellation shaders>> feature is
    not enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR or
    ename:VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR
ifdef::VK_EXT_conditional_rendering[]
  * [[VUID-{refpage}-{stageMaskName}-03931]]
    If the <<features-conditionalRendering,conditional rendering>> feature
    is not enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT
endif::VK_EXT_conditional_rendering[]
ifdef::VK_EXT_fragment_density_map[]
  * [[VUID-{refpage}-{stageMaskName}-03932]]
    If the <<features-fragmentDensityMap,fragment density map>> feature is
    not enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT
endif::VK_EXT_fragment_density_map[]
ifdef::VK_EXT_transform_feedback[]
  * [[VUID-{refpage}-{stageMaskName}-03933]]
    If the <<features-transformFeedback,transform feedback>> feature is not
    enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT
endif::VK_EXT_transform_feedback[]
ifdef::VK_NV_mesh_shader[]
  * [[VUID-{refpage}-{stageMaskName}-03934]]
    If the <<features-meshShader,mesh shaders>> feature is not enabled,
    pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV
  * [[VUID-{refpage}-{stageMaskName}-03935]]
    If the <<features-taskShader,task shaders>> feature is not enabled,
    pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV
endif::VK_NV_mesh_shader[]
ifdef::VK_NV_shading_rate_image[]
  * [[VUID-{refpage}-{stageMaskName}-04956]]
    If the <<features-shadingRateImage,shading rate image>> feature is not
    enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV
endif::VK_NV_shading_rate_image[]
ifdef::VK_HUAWEI_subpass_shading[]
  * [[VUID-{refpage}-{stageMaskName}-04957]]
    If the <<features-subpassShading,subpass shading>> feature is not
    enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI
endif::VK_HUAWEI_subpass_shading[]
ifdef::VK_HUAWEI_invocation_mask[]
  * [[VUID-{refpage}-{stageMaskName}-04995]]
    If the <<features-invocationMask, invocation mask image>> feature is not
    enabled, pname:{stageMaskName} must: not contain
    ename:VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI
endif::VK_HUAWEI_invocation_mask[]
// Common Valid Usage
