同步和缓存控制

在 Vulkan 中,对资源的访问进行同步主要由应用程序负责。 命令相对于主机和其他设备上命令的执行顺序很少有隐式保证,需要显式指定。 内存缓存和其他优化也需要显式管理,这要求系统中的数据流很大程度上受应用程序控制。

虽然命令之间存在一些隐式保证,但 Vulkan 暴露了五种显式同步机制

栅栏

栅栏可以用于通知主机设备上的某些任务已完成执行,从而控制主机和设备之间的资源访问。

信号量

信号量可以用于控制多个队列之间的资源访问。

事件

事件提供了一种细粒度的同步原语,该原语可以在命令缓冲区内或由主机发出信号,并且可以在命令缓冲区内等待或在主机上查询。 事件可以用于控制单个队列中的资源访问。

管线屏障

管线屏障还在命令缓冲区内提供同步控制,但仅在一个点,而不是使用单独的信号和等待操作。 管线屏障可以用于控制单个队列中的资源访问。

渲染通道对象

渲染通道对象为渲染任务提供同步框架,该框架基于本章中的概念构建。 许多本来需要应用程序使用其他同步原语的情况,可以作为渲染通道的一部分更有效地表达。 渲染通道对象可以用于控制单个队列中的资源访问。

执行和内存依赖关系

操作是指在主机、设备或外部实体(例如呈现引擎)上执行的任意数量的工作。 同步命令在命令的两个同步范围定义的两组操作之间引入显式执行依赖关系内存依赖关系

同步范围定义了同步命令能够与之创建执行依赖关系的其他操作。 不在同步命令的同步范围内的任何类型的操作都不会包含在生成的依赖关系中。 例如,对于许多同步命令,同步范围可以限制为仅在特定管线阶段中执行的操作,这允许将其他管线阶段排除在依赖关系之外。 根据特定命令,可能会有其他作用域选项。

执行依赖关系保证对于两组操作,第一组操作必须在第二组操作之前发生。 如果一个操作在另一个操作之前发生,则第一个操作必须在第二个操作启动之前完成。 更准确地说

  • Ops1Ops2 为单独的操作集。

  • Sync 为同步命令。

  • Scope1stScope2ndSync 的同步范围。

  • ScopedOps1 为集合 Ops1Scope1st 的交集。

  • ScopedOps2 为集合 Ops2Scope2nd 的交集。

  • 按顺序提交 Ops1SyncOps2 进行执行,将在 ScopedOps1ScopedOps2 之间产生执行依赖关系 ExeDep

  • 执行依赖关系 ExeDep 保证 ScopedOps1ScopedOps2 之前发生。

执行依赖关系链是执行依赖关系的序列,该序列在第一个依赖关系的 ScopedOps1 和最后一个依赖关系的 ScopedOps2 之间形成一个先发生关系。 对于每对连续的执行依赖关系,如果第一个依赖关系中的 Scope2nd 和第二个依赖关系中的 Scope1st 的交集不是空集,则存在链。 可以通过在执行依赖关系的描述中替换以下内容来描述从执行依赖关系链形成单个执行依赖关系

  • Sync 为生成执行依赖关系链的一组同步命令。

  • Scope1stSync 中第一个命令的第一个同步范围。

  • Scope2ndSync 中最后一个命令的第二个同步范围。

仅有执行依赖关系不足以保证从一个操作集中写入的值可以从另一个操作集中读取。

另外三种类型的操作用于控制内存访问。可用性操作使指定的内存写入访问生成的值对内存域可用,以便将来访问。任何可用的值都保持可用,直到后续对同一内存位置进行写入(无论是否使其可用)或内存被释放为止。内存域操作使对源内存域可用的写入对目标内存域可用(例如,使对主机域可用的写入对设备域可用)。可见性操作使对内存域可用的值对指定的内存访问可见

可用性、可见性、内存域和内存域操作在 可用性和可见性 部分的 内存模型 章节中进行了正式定义。哪些 API 操作执行这些操作在 可用性、可见性和域操作 中定义。

内存依赖是一种执行依赖,它包括可用性和可见性操作,使得

  • 第一组操作先于可用性操作发生。

  • 可用性操作先于可见性操作发生。

  • 可见性操作先于第二组操作发生。

一旦写入的值对特定类型的内存访问可见,它们可以被该类型的内存访问读取或写入。Vulkan 中的大多数同步命令都定义了内存依赖。

可用和可见的特定内存访问由内存依赖的访问范围定义。在内存依赖的第一个访问范围内的任何类型的访问,并且发生在 ScopedOps1 中的任何类型的访问都会被设为可用。在内存依赖的第二个访问范围内的任何类型的访问,并且发生在 ScopedOps2 中的任何类型的访问,都会使任何可用的写入对它可见。不在同步命令的访问范围内的任何类型的操作将不会包含在最终的依赖中。

内存依赖强制执行内存访问的可用性和可见性,以及两组操作之间的执行顺序。添加到 执行依赖链 的描述

  • MemOps1ScopedOps1 执行的内存访问集合。

  • MemOps2ScopedOps2 执行的内存访问集合。

  • AccessScope1stSync 链中第一个命令的第一个访问范围。

  • AccessScope2ndSync 链中最后一个命令的第二个访问范围。

  • ScopedMemOps1 为集合 MemOps1AccessScope1st 的交集。

  • ScopedMemOps2 为集合 MemOps2AccessScope2nd 的交集。

  • 按照顺序提交 Ops1SyncOps2 进行执行,将导致 ScopedOps1ScopedOps2 之间存在内存依赖 MemDep

  • 内存依赖 MemDep 保证

    • ScopedMemOps1 中的内存写入被设为可用。

    • 可用的内存写入(包括来自 ScopedMemOps1 的写入)对 ScopedMemOps2 可见。

执行依赖和内存依赖用于解决数据冲突,即确保读写操作以明确定义的顺序发生。先写后读冲突只需执行依赖即可解决,但先读后写和先写后写冲突需要在它们之间包含适当的内存依赖。如果应用程序不包含解决这些冲突的依赖,则内存访问的结果和执行顺序是未定义的

图像布局转换

图像子资源可以作为 内存依赖 的一部分(例如,通过使用 图像内存屏障)从一个 布局 转换为另一个布局。当在内存依赖中指定布局转换时,它发生在内存依赖中的可用性操作之后,并且发生在可见性操作之前。图像布局转换可能对绑定到图像子资源范围的所有内存执行读写访问,因此应用程序必须确保所有内存写入在执行布局转换之前都已变为可用。可用的内存会自动对布局转换变为可见,并且布局转换执行的写入会自动变为可用。

布局转换始终应用于特定的图像子资源范围,并指定旧布局和新布局。旧布局必须VK_IMAGE_LAYOUT_UNDEFINED,或者与图像子资源范围的当前布局匹配。如果旧布局与图像子资源范围的当前布局匹配,则转换会保留该范围的内容。如果旧布局是 VK_IMAGE_LAYOUT_UNDEFINED,则该范围的内容可能会被丢弃。

使用 VK_IMAGE_LAYOUT_UNDEFINED 的图像布局转换允许实现丢弃图像子资源范围,这可以提供性能或功耗优势。基于瓦片的架构可能能够避免将瓦片数据刷新到内存,而即时渲染器可能能够实现快速的元数据清除,以重新初始化帧缓冲区压缩状态或类似的状态。

如果渲染过程完成后不需要附件的内容,则应用程序应该使用 VK_ATTACHMENT_STORE_OP_DONT_CARE

由于图像布局转换可能对绑定到图像的内存执行读写访问,如果受布局转换影响的图像子资源绑定到当前设备掩码中任何设备的对等内存,则绑定内存来自的内存堆必须支持 vkGetDeviceGroupPeerMemoryFeatures 返回的 VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BITVK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT 功能。

应用程序必须确保布局转换发生在所有使用旧布局访问图像的操作之后,并且发生在任何将使用新布局访问图像的操作之前。布局转换是潜在的读/写操作,因此如果不定义适当的内存依赖来保证这一点,将导致数据竞争。

图像布局转换与内存别名交互。

通过图像内存屏障执行的布局转换在 提交顺序 中完整执行,相对于提交到同一队列的其他图像布局转换,包括由渲染过程执行的转换。实际上,从每个这样的布局转换到之前提交到同一队列的所有布局转换都存在隐式的执行依赖。

使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的每个图像子资源的图像布局,取决于上次渲染到该图像子资源作为深度/模板附件时使用的采样位置。因此,当 图像内存屏障image 成员是使用此标志创建的图像时,应用程序可以VkSampleLocationsInfoEXT 结构链接到 VkImageMemoryBarrier2VkImageMemoryBarrierpNext 链,以指定在任何图像布局转换期间要使用的采样位置。

如果 VkSampleLocationsInfoEXT 结构与上次用于渲染到 subresourceRange 指定的图像子资源范围的采样位置状态不匹配,或者如果不存在 VkSampleLocationsInfoEXT 结构,则给定图像子资源范围的内容将变为未定义,如同 oldLayout 等于 VK_IMAGE_LAYOUT_UNDEFINED 一样。

管线阶段

操作命令 执行的工作由多个操作组成,这些操作以逻辑上独立的步骤序列执行,称为管线阶段。执行的确切管线阶段取决于所使用的特定命令,以及记录命令时当前的命令缓冲区状态。

同步命令(例如,可用性和可见性操作)执行的操作不会由定义的管线阶段执行。但是,其他命令仍然可以通过使用 同步范围 来创建 依赖链 与它们同步。

跨管线阶段执行操作必须遵守隐式排序保证,特别包括 管线阶段顺序。否则,除非由执行依赖性强制执行,否则跨管线阶段的执行可能会与其他阶段重叠或乱序执行。

一些同步命令包括管线阶段参数,将该命令的 同步范围 限制为仅这些阶段。这允许对操作命令执行的确切执行依赖性和访问进行精细控制。实现应该使用这些管线阶段以避免不必要的停顿或缓存刷新。

可以在 VkPipelineStageFlags2 掩码中设置的位,指定执行阶段,如下所示

// Provided by VK_VERSION_1_3
// Flag bits for VkPipelineStageFlagBits2
typedef VkFlags64 VkPipelineStageFlagBits2;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE = 0ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT = 0x00000001ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT = 0x00000002ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT = 0x00000004ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT = 0x00000008ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT = 0x00000040ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT = 0x00000080ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT = 0x00000100ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT = 0x00000200ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT = 0x00000800ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT = 0x00001000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT = 0x00001000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT = 0x00002000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT = 0x00004000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT = 0x00008000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT = 0x00010000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT = 0x100000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT = 0x200000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT = 0x400000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT = 0x800000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT = 0x1000000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT = 0x2000000000ULL;
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0x4000000000ULL;
// Provided by VK_KHR_video_decode_queue
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL;
// Provided by VK_KHR_video_encode_queue
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL;
// Provided by VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_transform_feedback
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_conditional_rendering
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_device_generated_commands
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_device_generated_commands
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT = 0x00020000ULL;
// Provided by VK_KHR_fragment_shading_rate with VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_shading_rate_image
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV = 0x00400000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000ULL;
// Provided by VK_KHR_ray_tracing_pipeline with VK_KHR_synchronization2
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR = 0x00200000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_ray_tracing
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_NV = 0x00200000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_ray_tracing
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_NV = 0x02000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_fragment_density_map
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_mesh_shader
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_mesh_shader
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_mesh_shader
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT = 0x00080000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_mesh_shader
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT = 0x00100000ULL;
// Provided by VK_HUAWEI_subpass_shading
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI = 0x8000000000ULL;
// VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI is a deprecated alias
// Provided by VK_HUAWEI_subpass_shading
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0x8000000000ULL;
// Provided by VK_HUAWEI_invocation_mask
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL;
// Provided by VK_KHR_ray_tracing_maintenance1 with VK_KHR_synchronization2 or VK_VERSION_1_3
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0x10000000ULL;
// Provided by VK_EXT_opacity_micromap
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT = 0x40000000ULL;
// Provided by VK_HUAWEI_cluster_culling_shader
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI = 0x20000000000ULL;
// Provided by VK_NV_optical_flow
static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV = 0x20000000ULL;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkPipelineStageFlagBits2 VkPipelineStageFlagBits2KHR;
  • VK_PIPELINE_STAGE_2_NONE 指定没有执行阶段。

  • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT 指定使用间接命令参数的管线阶段。此阶段还包括读取由 vkCmdPreprocessGeneratedCommandsNV 写入的命令。此阶段还包括读取由 vkCmdPreprocessGeneratedCommandsEXT 写入的命令。

  • VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT 指定任务着色器阶段。

  • VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT 指定网格着色器阶段。

  • VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT 指定使用索引缓冲区的管线阶段。

  • VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT 指定使用顶点缓冲区的管线阶段。

  • VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT 等效于逻辑或

    • VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT

    • VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT

  • VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT 指定顶点着色器阶段。

  • VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT 指定细分控制着色器阶段。

  • VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT 指定细分评估着色器阶段。

  • VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT 指定几何着色器阶段。

  • VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT 等效于指定所有支持的预光栅化着色器阶段

    • VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT

    • VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT

    • VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

    • VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

    • VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT 指定片段着色器阶段。

  • VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT 指定执行早期片段测试(片段着色之前的深度和模板测试)的管线阶段。此阶段还包括具有深度/模板格式的帧缓冲附件的渲染通道加载操作

  • VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT 指定执行后期片段测试(片段着色之后的深度和模板测试)的管线阶段。此阶段还包括具有深度/模板格式的帧缓冲附件的渲染通道存储操作

  • VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT 指定从管线输出最终颜色值的管线阶段。此阶段包括混合逻辑操作、颜色附件的渲染通道加载存储操作、渲染通道多重采样解析操作以及vkCmdClearAttachments

  • VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT 指定计算着色器阶段。

  • VK_PIPELINE_STAGE_2_HOST_BIT 指定伪阶段,表示在主机上执行设备内存的读取/写入。此阶段不会被命令缓冲区中记录的任何命令调用。

  • VK_PIPELINE_STAGE_2_COPY_BIT 指定所有 复制命令 的执行,包括 vkCmdCopyQueryPoolResults

  • VK_PIPELINE_STAGE_2_BLIT_BIT 指定 vkCmdBlitImage 的执行。

  • VK_PIPELINE_STAGE_2_RESOLVE_BIT 指定 vkCmdResolveImage 的执行。

  • VK_PIPELINE_STAGE_2_CLEAR_BIT 指定清除命令的执行,除了vkCmdClearAttachments之外。

  • VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT 等效于指定所有

    • VK_PIPELINE_STAGE_2_COPY_BIT

    • VK_PIPELINE_STAGE_2_BLIT_BIT

    • VK_PIPELINE_STAGE_2_RESOLVE_BIT

    • VK_PIPELINE_STAGE_2_CLEAR_BIT

    • VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR

  • VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR 指定光线追踪着色器阶段的执行。

  • VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 指定加速结构命令加速结构复制命令的执行。

  • VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR 指定执行加速结构复制命令

  • VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT 指定执行所有图形管线阶段,等效于以下各项的逻辑或:

    • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

    • VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT

    • VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT

    • VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT

    • VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

    • VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

    • VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT

    • VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT

    • VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

    • VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

    • VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

    • VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

    • VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

    • VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

    • VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

    • VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

    • VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

  • VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT 指定与其一起使用的队列上支持的所有命令执行的所有操作。

  • VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT 指定管线中消耗条件渲染谓词的阶段。

  • VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT 指定管线中将顶点属性输出值写入变换反馈缓冲区的阶段。

  • VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV 指定管线中通过 vkCmdPreprocessGeneratedCommandsNV 处理设备端命令生成的阶段。

  • VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT 指定管线中通过 vkCmdPreprocessGeneratedCommandsEXT 处理设备端命令生成的阶段。

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 指定管线中读取片元着色率附件着色率图像以确定光栅化图元部分片元着色率的阶段。

  • VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT 指定管线中读取片元密度图以生成片元区域的阶段。

  • VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI 指定管线中实现读取调用掩码图像以优化射线调度的阶段。

  • VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR 指定执行视频解码操作

  • VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR 指定执行视频编码操作

  • VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV 指定管线中执行光流操作的阶段。

  • VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI 指定子通道着色器阶段。

  • VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 指定执行微映射命令

  • VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI 指定集群剔除着色器阶段。

  • VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT 等效于 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,当在第二个同步作用域中指定时,VkAccessFlags2 设置为 0,但在第一个作用域中等效于 VK_PIPELINE_STAGE_2_NONE

  • VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT 等效于 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,当在第一个同步作用域中指定时,VkAccessFlags2 设置为 0,但在第二个作用域中等效于 VK_PIPELINE_STAGE_2_NONE

TOPBOTTOM 管线阶段已弃用,应用程序应首选 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_NONE

VkPipelineStageFlags2 位掩码超出了 C99 枚举中允许的 31 个单独的位标志,这就是 VkPipelineStageFlagBits 的定义方式。 前 31 个值在两者之间是通用的,并且可以互换。

VkPipelineStageFlags2 是一种位掩码类型,用于设置零个或多个 VkPipelineStageFlagBits2 标志的掩码

// Provided by VK_VERSION_1_3
typedef VkFlags64 VkPipelineStageFlags2;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkPipelineStageFlags2 VkPipelineStageFlags2KHR;

可以在 VkPipelineStageFlags 掩码中设置的位,指定执行阶段,包括

// Provided by VK_VERSION_1_0
typedef enum VkPipelineStageFlagBits {
    VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0x00000001,
    VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0x00000002,
    VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0x00000004,
    VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0x00000008,
    VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010,
    VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020,
    VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0x00000040,
    VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0x00000080,
    VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0x00000100,
    VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0x00000200,
    VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400,
    VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800,
    VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000,
    VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT = 0x00002000,
    VK_PIPELINE_STAGE_HOST_BIT = 0x00004000,
    VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT = 0x00008000,
    VK_PIPELINE_STAGE_ALL_COMMANDS_BIT = 0x00010000,
  // Provided by VK_VERSION_1_3
    VK_PIPELINE_STAGE_NONE = 0,
  // Provided by VK_EXT_transform_feedback
    VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000,
  // Provided by VK_EXT_conditional_rendering
    VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000,
  // Provided by VK_KHR_acceleration_structure
    VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000,
  // Provided by VK_KHR_ray_tracing_pipeline
    VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR = 0x00200000,
  // Provided by VK_EXT_fragment_density_map
    VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000,
  // Provided by VK_KHR_fragment_shading_rate
    VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000,
  // Provided by VK_NV_device_generated_commands
    VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = 0x00020000,
  // Provided by VK_EXT_mesh_shader
    VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT = 0x00080000,
  // Provided by VK_EXT_mesh_shader
    VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT = 0x00100000,
  // Provided by VK_NV_shading_rate_image
    VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
  // Provided by VK_NV_mesh_shader
    VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV = VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT,
  // Provided by VK_NV_mesh_shader
    VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV = VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT,
  // Provided by VK_KHR_synchronization2
    VK_PIPELINE_STAGE_NONE_KHR = VK_PIPELINE_STAGE_NONE,
  // Provided by VK_EXT_device_generated_commands
    VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,
} VkPipelineStageFlagBits;

这些值都具有与 VkPipelineStageFlags2 的等效命名值相同的含义。

  • VK_PIPELINE_STAGE_NONE 指定没有执行阶段。

  • VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT 指定管线中消耗 VkDrawIndirect* / VkDispatchIndirect* / VkTraceRaysIndirect* 数据结构的阶段。此阶段还包括读取由 vkCmdExecuteGeneratedCommandsNV 写入的命令。此阶段还包括读取由 vkCmdExecuteGeneratedCommandsEXT 写入的命令。

  • VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT 指定任务着色器阶段。

  • VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT 指定网格着色器阶段。

  • VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 指定管线中消耗顶点和索引缓冲区的阶段。

  • VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 指定顶点着色器阶段。

  • VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT 指定细分控制着色器阶段。

  • VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT 指定细分评估着色器阶段。

  • VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT 指定几何着色器阶段。

  • VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 指定片元着色器阶段。

  • VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 指定管线中执行早期片元测试(在片元着色之前的深度和模板测试)的阶段。此阶段还包括具有深度/模板格式的帧缓冲附件的渲染通道加载操作

  • VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 指定管线中执行后期片元测试(在片元着色之后的深度和模板测试)的阶段。此阶段还包括具有深度/模板格式的帧缓冲附件的渲染通道存储操作

  • VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 指定混合后管线输出最终颜色值的管线阶段。此阶段包括混合逻辑操作,用于颜色附件的渲染通道加载存储操作、渲染通道多采样解析操作以及vkCmdClearAttachments

  • VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT 指定计算着色器的执行。

  • VK_PIPELINE_STAGE_TRANSFER_BIT 指定以下命令

  • VK_PIPELINE_STAGE_HOST_BIT 指定一个伪阶段,指示主机上对设备内存的读取/写入的执行。 此阶段不由命令缓冲区中记录的任何命令调用。

  • VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 指定执行 vkCmdBuildAccelerationStructureNVvkCmdCopyAccelerationStructureNVvkCmdWriteAccelerationStructuresPropertiesNVvkCmdBuildAccelerationStructuresKHRvkCmdBuildAccelerationStructuresIndirectKHRvkCmdCopyAccelerationStructureKHRvkCmdCopyAccelerationStructureToMemoryKHRvkCmdCopyMemoryToAccelerationStructureKHRvkCmdWriteAccelerationStructuresPropertiesKHR

  • VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR 指定通过 vkCmdTraceRaysNVvkCmdTraceRaysKHRvkCmdTraceRaysIndirectKHR 执行的光线追踪着色器阶段。

  • VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT 指定所有图形管线阶段的执行,等效于以下各项的逻辑或:

    • VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT

    • VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

    • VK_PIPELINE_STAGE_VERTEX_INPUT_BIT

    • VK_PIPELINE_STAGE_VERTEX_SHADER_BIT

    • VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT

    • VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

    • VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

    • VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT

    • VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT

    • VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT

    • VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT

    • VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

    • VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

    • VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

    • VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VK_PIPELINE_STAGE_ALL_COMMANDS_BIT 指定在与其一起使用的队列上支持的所有命令执行的所有操作。

  • VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT 指定管线中消耗条件渲染谓词的阶段。

  • VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT 指定管线中将顶点属性输出值写入变换反馈缓冲区的阶段。

  • VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV 指定管线中通过 vkCmdPreprocessGeneratedCommandsNV 处理为生成命令的设备端预处理的阶段。

  • VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT 指定管线中通过 vkCmdPreprocessGeneratedCommandsEXT 处理为生成命令的设备端预处理的阶段。

  • VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 指定管线中读取片段着色率附件着色率图像以确定光栅化图元的各个部分的片段着色率的阶段。

  • VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT 指定管线中读取片段密度图以生成片段区域的阶段。

  • VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 等效于 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,当在第二个同步范围中指定时,VkAccessFlags 设置为 0,但在第一个范围中指定时不指定任何执行阶段。

  • VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT 等效于 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,当在第一个同步范围中指定时,VkAccessFlags 设置为 0,但在第二个范围中指定时不指定任何执行阶段。

// Provided by VK_VERSION_1_0
typedef VkFlags VkPipelineStageFlags;

VkPipelineStageFlags 是一种位掩码类型,用于设置零个或多个 VkPipelineStageFlagBits 的掩码。

如果同步命令包括源阶段掩码,则其第一个同步范围仅包括在该掩码中指定的管线阶段的执行以及任何逻辑上更早的阶段。其第一个访问范围仅包括由源阶段掩码中明确指定的管线阶段执行的内存访问。

如果同步命令包括目标阶段掩码,则其第二个同步范围仅包括在该掩码中指定的管线阶段的执行以及任何逻辑上更晚的阶段。其第二个访问范围仅包括由目标阶段掩码中明确指定的管线阶段执行的内存访问。

请注意,访问范围不会与任何一个范围的逻辑上更早或更晚的阶段交互 - 仅考虑应用程序指定的阶段是每个访问范围的一部分。

某些管线阶段仅在支持特定操作集的队列上可用。下表列出了每个管线阶段标志,队列必须支持哪个队列功能标志。当表的第二列中枚举多个标志时,这意味着如果队列支持任何列出的功能标志,则支持该管线阶段。有关队列功能的更多详细信息,请参阅 物理设备枚举队列

表 1. 支持的管线阶段标志
管线阶段标志 所需的队列功能标志

VK_PIPELINE_STAGE_2_NONE

无要求

VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT

无要求

VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT

VK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT

无要求

VK_PIPELINE_STAGE_2_HOST_BIT

无要求

VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

无要求

VK_PIPELINE_STAGE_2_COPY_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_RESOLVE_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_BLIT_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_CLEAR_BIT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

VK_QUEUE_VIDEO_DECODE_BIT_KHR

VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

VK_QUEUE_VIDEO_ENCODE_BIT_KHR

VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

VK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

VK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR

VK_QUEUE_GRAPHICS_BITVK_QUEUE_COMPUTE_BITVK_QUEUE_TRANSFER_BIT

VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

VK_QUEUE_COMPUTE_BIT

VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_QUEUE_GRAPHICS_BIT

VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

VK_QUEUE_OPTICAL_FLOW_BIT_NV

作为命令结果执行的管线阶段在逻辑上按特定顺序完成执行,以便逻辑上更晚的管线阶段的完成必须在逻辑上更早的阶段完成之前发生。这意味着在特定同步命令的源阶段掩码中包含任何阶段也意味着该命令的 Scope1st 中也包含任何逻辑上更早的阶段。

类似地,逻辑上较早的管线阶段的启动必须不能发生在逻辑上较晚的管线阶段的启动之后。对于特定的同步命令,将任何给定的阶段包括在目标阶段掩码中,也意味着任何逻辑上较晚的阶段都包含在该命令的 Scope2nd 中。

实现可能不支持对每个同步操作的每个管线阶段进行同步。如果实现不支持同步的管线阶段出现在源阶段掩码中,则它可能用任何逻辑上较晚的阶段来代替它,用于第一个同步范围。如果实现不支持同步的管线阶段出现在目标阶段掩码中,则它可能用任何逻辑上较早的阶段来代替它,用于第二个同步范围。

例如,如果实现无法在顶点着色器执行完成后立即发出事件信号,则它可能改为在颜色附件输出完成后发出事件信号。

如果实现进行了这样的替换,则必须不影响执行或内存依赖关系或图像和缓冲区内存屏障的语义。

图形管线在支持 VK_QUEUE_GRAPHICS_BIT 的队列上执行。图形管线执行的阶段只能在为支持 VK_QUEUE_GRAPHICS_BIT 的队列记录的命令中指定。

图形图元管线执行以下阶段,阶段的逻辑顺序与此处指定的顺序匹配

  • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

  • VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT

  • VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT

  • VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT

  • VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT

  • VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT

  • VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

图形网格管线执行以下阶段,阶段的逻辑顺序与此处指定的顺序匹配

  • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

  • VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT

  • VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

对于计算管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

  • VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT

对于子通道着色管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

对于在具有片段密度图附件的渲染通道中执行的图形管线命令,读取片段密度图的以下管线阶段相对于其他阶段没有特定的顺序,但它在逻辑上比 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 早。

  • VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT

条件渲染阶段正式属于图形管线和计算管线的一部分。读取谓词的管线阶段相对于这些管线的其他阶段具有未指定的顺序

  • VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

对于传输管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_TRANSFER_BIT

对于主机操作,只发生一个管线阶段,因此不保证顺序

  • VK_PIPELINE_STAGE_2_HOST_BIT

对于命令预处理管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT

对于加速结构构建操作,只发生一个管线阶段,因此不保证顺序

  • VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

对于加速结构复制操作,只发生一个管线阶段,因此不保证顺序

  • VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR

对于不透明度微型地图构建操作,只发生一个管线阶段,因此不保证顺序

  • VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

对于光线追踪管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT

  • VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

对于视频解码管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

对于视频编码管线,以下阶段按此顺序发生

  • VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

访问类型

Vulkan 中的内存可以从着色器调用中访问,也可以通过管线的一些固定功能阶段访问。访问类型是使用的 描述符类型 的函数,或固定功能阶段如何访问内存的函数。

一些同步命令将一组访问类型作为参数,以定义内存依赖项的访问范围。如果同步命令包含源访问掩码,则其第一个访问范围仅包含通过该掩码中指定的访问类型进行的访问。类似地,如果同步命令包含目标访问掩码,则其第二个访问范围仅包含通过该掩码中指定的访问类型进行的访问。

可以在 VkMemoryBarrier2KHRVkImageMemoryBarrier2KHRVkBufferMemoryBarrier2KHRsrcAccessMaskdstAccessMask 成员中设置的位,指定访问行为,是

// Provided by VK_VERSION_1_3
// Flag bits for VkAccessFlagBits2
typedef VkFlags64 VkAccessFlagBits2;
static const VkAccessFlagBits2 VK_ACCESS_2_NONE = 0ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT = 0x00000001ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT = 0x00000002ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT = 0x00000008ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT = 0x00000010ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT = 0x00000020ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT = 0x00000040ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT = 0x00000080ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT = 0x00000800ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT = 0x00001000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT = 0x00002000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT = 0x00004000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT = 0x00008000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT = 0x00010000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT = 0x100000000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000ULL;
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL;
// Provided by VK_KHR_video_decode_queue
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL;
// Provided by VK_KHR_video_decode_queue
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL;
// Provided by VK_KHR_video_encode_queue
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL;
// Provided by VK_KHR_video_encode_queue
static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_NONE_KHR = 0ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL;
// Provided by VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_transform_feedback
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_transform_feedback
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_transform_feedback
static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_conditional_rendering
static const VkAccessFlagBits2 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_device_generated_commands
static const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_device_generated_commands
static const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_device_generated_commands
static const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_EXT = 0x00020000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_device_generated_commands
static const VkAccessFlagBits2 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_EXT = 0x00040000ULL;
// Provided by VK_KHR_fragment_shading_rate with VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_shading_rate_image
static const VkAccessFlagBits2 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV = 0x00800000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_synchronization2
static const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_ray_tracing
static const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_NV = 0x00200000ULL;
// Provided by VK_KHR_synchronization2 with VK_NV_ray_tracing
static const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = 0x00400000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_fragment_density_map
static const VkAccessFlagBits2 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL;
// Provided by VK_KHR_synchronization2 with VK_EXT_blend_operation_advanced
static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL;
// Provided by VK_EXT_descriptor_buffer
static const VkAccessFlagBits2 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT = 0x20000000000ULL;
// Provided by VK_HUAWEI_invocation_mask
static const VkAccessFlagBits2 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI = 0x8000000000ULL;
// Provided by VK_KHR_ray_tracing_maintenance1 with (VK_KHR_synchronization2 or VK_VERSION_1_3) and VK_KHR_ray_tracing_pipeline
static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR = 0x10000000000ULL;
// Provided by VK_EXT_opacity_micromap
static const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_READ_BIT_EXT = 0x100000000000ULL;
// Provided by VK_EXT_opacity_micromap
static const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT = 0x200000000000ULL;
// Provided by VK_NV_optical_flow
static const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV = 0x40000000000ULL;
// Provided by VK_NV_optical_flow
static const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV = 0x80000000000ULL;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkAccessFlagBits2 VkAccessFlagBits2KHR;
  • VK_ACCESS_2_NONE 指定没有访问。

  • VK_ACCESS_2_MEMORY_READ_BIT 指定所有读取访问。它在任何访问掩码中始终有效,并且被视为等效于设置所有在它使用的地方有效的 READ 访问标志。

  • VK_ACCESS_2_MEMORY_WRITE_BIT 指定所有写入访问。它在任何访问掩码中始终有效,并且被视为等效于设置所有在它使用的地方有效的 WRITE 访问标志。

  • VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT 指定读取从间接缓冲区读取的命令数据的访问,作为间接构建、跟踪、绘制或调度命令的一部分。此类访问发生在 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT 管线阶段。

  • VK_ACCESS_2_INDEX_READ_BIT 指定读取索引缓冲区的访问,作为由 vkCmdBindIndexBuffer2vkCmdBindIndexBuffer 绑定的索引绘制命令的一部分。此类访问发生在 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT 管线阶段。

  • VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT 指定读取顶点缓冲区的访问,作为由 vkCmdBindVertexBuffers 绑定的绘制命令的一部分。此类访问发生在 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT 管线阶段。

  • VK_ACCESS_2_UNIFORM_READ_BIT 指定读取任何着色器管线阶段中的统一缓冲区的访问。

  • VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT 指定读取渲染通道中子通道着色或片段着色期间的输入附件的访问。此类访问发生在 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT 管线阶段。

  • VK_ACCESS_2_SHADER_SAMPLED_READ_BIT 指定读取任何着色器管线阶段中的统一纹理缓冲区采样图像的访问。

  • VK_ACCESS_2_SHADER_STORAGE_READ_BIT 指定读取任何着色器管线阶段中的存储缓冲区物理存储缓冲区存储纹理缓冲区存储图像的访问。

  • VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR 指定读取任何着色器管线阶段中的着色器绑定表的访问。

  • VK_ACCESS_2_SHADER_READ_BIT 等价于以下各项的逻辑或:

    • VK_ACCESS_2_SHADER_SAMPLED_READ_BIT

    • VK_ACCESS_2_SHADER_STORAGE_READ_BIT

  • VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT 指定在任何着色器管线阶段对存储缓冲区物理存储缓冲区存储纹理缓冲存储图像的写入访问。

  • VK_ACCESS_2_SHADER_WRITE_BIT 等价于 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT

  • VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT 指定对颜色附件的读取访问,例如通过混合(除了高级混合操作)、逻辑操作VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段中的某些渲染通道加载操作,或通过 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT 管线阶段中的片段着色器瓦片图像读取

  • VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT 指定在渲染通道期间或通过某些渲染通道的加载存储多采样解析操作对颜色附件的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段。

  • VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT 指定对深度/模板附件的读取访问,通过深度或模板操作VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT 管线阶段中的某些渲染通道加载操作,或通过 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT 管线阶段中的片段着色器瓦片图像读取

  • VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 指定通过深度或模板操作或某些渲染通道的加载存储操作,对深度/模板附件的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT 管线阶段。

  • VK_ACCESS_2_TRANSFER_READ_BIT 指定在复制操作中对图像或缓冲区的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BIT 管线阶段。

  • VK_ACCESS_2_TRANSFER_WRITE_BIT 指定在清除复制操作中对图像或缓冲区的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_RESOLVE_BIT 管线阶段。

  • VK_ACCESS_2_HOST_READ_BIT 指定主机操作的读取访问。这种类型的访问不是通过资源执行的,而是直接在内存上执行的。这种访问发生在 VK_PIPELINE_STAGE_2_HOST_BIT 管线阶段。

  • VK_ACCESS_2_HOST_WRITE_BIT 指定主机操作的写入访问。这种类型的访问不是通过资源执行的,而是直接在内存上执行的。这种访问发生在 VK_PIPELINE_STAGE_2_HOST_BIT 管线阶段。

  • VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT 指定作为条件渲染一部分对谓词的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT 管线阶段。

  • VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT 指定当变换反馈处于活动状态时对变换反馈缓冲区的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT 指定在执行 vkCmdBeginTransformFeedbackEXT 时读取的变换反馈计数器缓冲区的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT 指定在执行 vkCmdEndTransformFeedbackEXT 时写入的变换反馈计数器缓冲区的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV 指定从 vkCmdPreprocessGeneratedCommandsNV 的缓冲区输入中读取。这种访问发生在 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV 管线阶段。

  • VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV 指定写入到目标命令缓冲区预处理输出。这种访问发生在 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV 管线阶段。

  • VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_EXT 指定从 vkCmdPreprocessGeneratedCommandsEXT 的缓冲区输入中读取。这种访问发生在 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_EXT 指定写入到目标命令缓冲区预处理输出。这种访问发生在 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT 指定对颜色附件的读取访问,包括高级混合操作。这种访问发生在 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段。

  • VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI 指定在 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI 管线阶段中对调用掩码图像的读取访问。

  • VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR 指定对加速结构的读取访问,作为跟踪、构建或复制命令的一部分,或者作为构建命令一部分对加速结构暂存缓冲区的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR 管线阶段或 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段。

  • VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR 指定对加速结构或加速结构暂存缓冲区的写入访问,作为构建或复制命令的一部分。这种访问发生在 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段。

  • VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT 指定在动态片段密度图操作期间对片段密度图附件的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR 指定在光栅化期间对片段着色率附件的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 管线阶段。

  • VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV 指定在光栅化期间对着色率图像的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NV 管线阶段。它等价于 VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR

  • VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR 指定在视频解码操作中对图像或缓冲区资源的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR 管线阶段。

  • VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR 指定在视频解码操作中对图像或缓冲区资源的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR 管线阶段。

  • VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR 指定在视频编码操作中对图像或缓冲区资源的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR 管线阶段。

  • VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR 指定在视频编码操作中对图像或缓冲区资源的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR 管线阶段。

  • VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT 指定在任何着色器管线阶段中对描述符缓冲区的读取访问。

  • VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV 指定在光流操作中对图像或缓冲区资源的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV 管线阶段。

  • VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV 指定在光流操作中对图像或缓冲区资源的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV 管线阶段。

  • VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT 指定对微型地图对象的写入访问。这种访问发生在 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT 管线阶段。

  • VK_ACCESS_2_MICROMAP_READ_BIT_EXT 指定对微型地图对象的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段。

在应用程序希望为给定的一组管线阶段选择所有访问类型的情况下,可以使用 VK_ACCESS_2_MEMORY_READ_BITVK_ACCESS_2_MEMORY_WRITE_BIT。这在指定只有一个访问类型的阶段时特别有用。

VkAccessFlags2 位掩码超出了 C99 枚举中允许的 31 个单独的位标志,这也是 VkAccessFlagBits 的定义方式。前 31 个值两者通用,并且可以互换。

VkAccessFlags2 是一种位掩码类型,用于设置零个或多个 VkAccessFlagBits2 的掩码

// Provided by VK_VERSION_1_3
typedef VkFlags64 VkAccessFlags2;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkAccessFlags2 VkAccessFlags2KHR;

应用程序 **可以** 在 VkMemoryBarrier2VkBufferMemoryBarrier2VkImageMemoryBarrier2pNext 链中链接一个 VkMemoryBarrierAccessFlags3KHR 结构,以提供 VkAccessFlagBits2 中未提供的额外访问标志。

VkMemoryBarrierAccessFlags3KHR 结构定义如下

// Provided by VK_KHR_maintenance8
typedef struct VkMemoryBarrierAccessFlags3KHR {
    VkStructureType      sType;
    const void*          pNext;
    VkAccessFlags3KHR    srcAccessMask3;
    VkAccessFlags3KHR    dstAccessMask3;
} VkMemoryBarrierAccessFlags3KHR;
有效用法(隐式)
  • VUID-VkMemoryBarrierAccessFlags3KHR-sType-sType
    sType **必须** 为 VK_STRUCTURE_TYPE_MEMORY_BARRIER_ACCESS_FLAGS_3_KHR

  • VUID-VkMemoryBarrierAccessFlags3KHR-srcAccessMask3-parameter
    srcAccessMask3 **必须** 是 VkAccessFlagBits3KHR 值的有效组合

  • VUID-VkMemoryBarrierAccessFlags3KHR-dstAccessMask3-parameter
    dstAccessMask3 **必须** 是 VkAccessFlagBits3KHR 值的有效组合

VkMemoryBarrierAccessFlags3KHRsrcAccessMask3dstAccessMask3 成员中 **可以** 设置的位,用于指定访问行为,如下所示

// Provided by VK_KHR_maintenance8
// Flag bits for VkAccessFlagBits3KHR
typedef VkFlags64 VkAccessFlagBits3KHR;
static const VkAccessFlagBits3KHR VK_ACCESS_3_NONE_KHR = 0ULL;
  • VK_ACCESS_3_NONE_KHR 指定没有额外的访问。

VkAccessFlags3KHR 是一种位掩码类型,用于设置零个或多个 VkAccessFlagBits3KHR 的掩码

// Provided by VK_KHR_maintenance8
typedef VkFlags64 VkAccessFlags3KHR;

VkMemoryBarrierAccessFlags3KHR 结构链接到 VkMemoryBarrier2VkBufferMemoryBarrier2VkImageMemoryBarrier2pNext 字段中时,将考虑 srcAccessMask3dstAccessMask3 字段中指定的标志,以及 srcAccessMaskdstAccessMask 字段中的标志,以便允许为第一个或第二个访问范围最多指定 128 种总访问类型。

注意

VkAccessFlagBits3KHRVkAccessFlagBits2 一起使用时,这两组 64 个标志位组合成 128 个标志位(实际上是将它们进行或运算)。这与 VkAccessFlagBits2VkAccessFlagBits 不同,其中 64 位 VkAccessFlagBits2 扩展并 *替换* 了 32 位 VkAccessFlagBits

VkSubpassDependencyVkSubpassDependency2VkMemoryBarrierVkBufferMemoryBarrierVkImageMemoryBarriersrcAccessMaskdstAccessMask 成员中 **可以** 设置的位,用于指定访问行为,如下所示

// Provided by VK_VERSION_1_0
typedef enum VkAccessFlagBits {
    VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001,
    VK_ACCESS_INDEX_READ_BIT = 0x00000002,
    VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004,
    VK_ACCESS_UNIFORM_READ_BIT = 0x00000008,
    VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010,
    VK_ACCESS_SHADER_READ_BIT = 0x00000020,
    VK_ACCESS_SHADER_WRITE_BIT = 0x00000040,
    VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080,
    VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100,
    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200,
    VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400,
    VK_ACCESS_TRANSFER_READ_BIT = 0x00000800,
    VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000,
    VK_ACCESS_HOST_READ_BIT = 0x00002000,
    VK_ACCESS_HOST_WRITE_BIT = 0x00004000,
    VK_ACCESS_MEMORY_READ_BIT = 0x00008000,
    VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000,
  // Provided by VK_VERSION_1_3
    VK_ACCESS_NONE = 0,
  // Provided by VK_EXT_transform_feedback
    VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000,
  // Provided by VK_EXT_transform_feedback
    VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000,
  // Provided by VK_EXT_transform_feedback
    VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000,
  // Provided by VK_EXT_conditional_rendering
    VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000,
  // Provided by VK_EXT_blend_operation_advanced
    VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000,
  // Provided by VK_KHR_acceleration_structure
    VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000,
  // Provided by VK_KHR_acceleration_structure
    VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000,
  // Provided by VK_EXT_fragment_density_map
    VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000,
  // Provided by VK_KHR_fragment_shading_rate
    VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000,
  // Provided by VK_NV_device_generated_commands
    VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000,
  // Provided by VK_NV_device_generated_commands
    VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000,
  // Provided by VK_NV_shading_rate_image
    VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,
  // Provided by VK_NV_ray_tracing
    VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
  // Provided by VK_KHR_synchronization2
    VK_ACCESS_NONE_KHR = VK_ACCESS_NONE,
  // Provided by VK_EXT_device_generated_commands
    VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV,
  // Provided by VK_EXT_device_generated_commands
    VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV,
} VkAccessFlagBits;

这些值都具有与 VkAccessFlags2 的等效命名值相同的含义。

  • VK_ACCESS_NONE 指定无访问。

  • VK_ACCESS_MEMORY_READ_BIT 指定所有读取访问。它在任何访问掩码中始终有效,并且被视为等效于设置所有在其使用位置有效的 READ 访问标志。

  • VK_ACCESS_MEMORY_WRITE_BIT 指定所有写入访问。它在任何访问掩码中始终有效,并且被视为等效于设置所有在其使用位置有效的 WRITE 访问标志。

  • VK_ACCESS_INDIRECT_COMMAND_READ_BIT 指定对间接命令数据的读取访问,该数据作为间接构建、跟踪、绘制或调度命令的一部分读取。这种访问发生在 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT 管线阶段。

  • VK_ACCESS_INDEX_READ_BIT 指定对索引缓冲区的读取访问,该缓冲区作为索引绘制命令的一部分,由 vkCmdBindIndexBuffer2vkCmdBindIndexBuffer 绑定。这种访问发生在 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 管线阶段。

  • VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT 指定对顶点缓冲区的读取访问,该缓冲区作为绘制命令的一部分,由 vkCmdBindVertexBuffers 绑定。这种访问发生在 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 管线阶段。

  • VK_ACCESS_UNIFORM_READ_BIT 指定在任何着色器管线阶段中对uniform 缓冲区的读取访问。

  • VK_ACCESS_INPUT_ATTACHMENT_READ_BIT 指定在子通道着色或片段着色期间,在渲染通道内对输入附件的读取访问。这种访问发生在 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 管线阶段。

  • VK_ACCESS_SHADER_READ_BIT 指定在任何着色器管线阶段对uniform texel buffer采样图像存储缓冲区物理存储缓冲区着色器绑定表存储纹理缓冲区存储图像的读取访问权限。

  • VK_ACCESS_SHADER_WRITE_BIT 指定在任何着色器管线阶段对存储缓冲区物理存储缓冲区存储纹理缓冲区存储图像的写入访问权限。

  • VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 指定在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段,通过混合(除了高级混合操作之外)、逻辑操作或某些渲染通道加载操作,或者在 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 管线阶段通过片段着色器 tile 图像读取颜色附件的读取访问权限。

  • VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT 指定在渲染通道期间,或者通过某些渲染通道的加载存储操作,对颜色、解析或深度/模板解析附件的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段。

  • VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT 指定在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 管线阶段,通过深度或模板操作或某些渲染通道加载操作,或者在 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 管线阶段通过片段着色器 tile 图像读取,对深度/模板附件的读取访问权限。

  • VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 指定通过深度或模板操作或某些渲染通道的加载存储操作,对深度/模板附件的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 管线阶段。

  • VK_ACCESS_TRANSFER_READ_BIT 指定在复制操作中对图像或缓冲区的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT 管线阶段。

  • VK_ACCESS_TRANSFER_WRITE_BIT 指定在清除复制操作中对图像或缓冲区的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT 管线阶段。

  • VK_ACCESS_HOST_READ_BIT 指定主机操作的读取访问权限。此类型的访问不是通过资源执行的,而是直接在内存上执行的。这种访问发生在 VK_PIPELINE_STAGE_HOST_BIT 管线阶段。

  • VK_ACCESS_HOST_WRITE_BIT 指定主机操作的写入访问权限。此类型的访问不是通过资源执行的,而是直接在内存上执行的。这种访问发生在 VK_PIPELINE_STAGE_HOST_BIT 管线阶段。

  • VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT 指定作为条件渲染一部分的谓词的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT 管线阶段。

  • VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT 指定当变换反馈处于活动状态时对变换反馈缓冲区的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT 指定当 vkCmdBeginTransformFeedbackEXT 执行时读取的变换反馈计数器缓冲区的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT 指定当 vkCmdEndTransformFeedbackEXT 执行时写入的变换反馈计数器缓冲区的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT 管线阶段。

  • VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV 指定从 vkCmdPreprocessGeneratedCommandsNV 的缓冲区输入读取数据。这种访问发生在 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV 管线阶段。

  • VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV 指定在 vkCmdPreprocessGeneratedCommandsNV 中写入目标命令缓冲区预处理输出。这种访问发生在 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV 管线阶段。

  • VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT 指定从 vkCmdPreprocessGeneratedCommandsEXT 的缓冲区输入读取数据。这种访问发生在 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT 指定在 vkCmdPreprocessGeneratedCommandsEXT 中写入目标命令缓冲区预处理输出。这种访问发生在 VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT 指定对颜色附件的读取访问权限,包括高级混合操作。这种访问发生在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管线阶段。

  • VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI 指定在 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI 管线阶段中对调用掩码图像的读取访问。

  • VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR 指定在跟踪、构建或复制命令中对加速结构的读取访问权限,或者在构建命令中对加速结构暂存缓冲区的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR 管线阶段或 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段。

  • VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR 指定在构建或复制命令中对加速结构或加速结构暂存缓冲区的写入访问权限。这种访问发生在 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR 管线阶段。

  • VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT 指定在动态片段密度图操作期间对片段密度图附件的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT 管线阶段。

  • VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR 指定在光栅化期间对片段着色率附件的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 管线阶段。

  • VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV 指定在光栅化期间对着色率图像的读取访问权限。这种访问发生在 VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV 管线阶段。它等同于 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

某些访问类型仅由流水线阶段的子集执行。任何同时使用阶段掩码和访问掩码的同步命令都使用两者来定义访问范围 - 只有由指定阶段执行的指定访问类型才包含在访问范围内。如果同步命令中不包含能够执行该类型访问的对应阶段掩码中的流水线阶段,则应用程序必须不指定访问标志。下表列出了每个访问标志,哪些流水线阶段可以执行该类型的访问。

表 2. 支持的访问类型
访问标志 支持的流水线阶段

VK_ACCESS_2_NONE

任意

VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT

VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

VK_ACCESS_2_INDEX_READ_BIT

VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT

VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT

VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT

VK_ACCESS_2_UNIFORM_READ_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

VK_ACCESS_2_SHADER_READ_BIT

VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT, VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_SHADER_WRITE_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT

VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT

VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT

VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT

VK_ACCESS_2_TRANSFER_READ_BIT

VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT, VK_PIPELINE_STAGE_2_COPY_BIT, VK_PIPELINE_STAGE_2_RESOLVE_BIT, VK_PIPELINE_STAGE_2_BLIT_BIT, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR, VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

VK_ACCESS_2_TRANSFER_WRITE_BIT

VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT, VK_PIPELINE_STAGE_2_COPY_BIT, VK_PIPELINE_STAGE_2_RESOLVE_BIT, VK_PIPELINE_STAGE_2_BLIT_BIT, VK_PIPELINE_STAGE_2_CLEAR_BIT, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR, VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

VK_ACCESS_2_HOST_READ_BIT

VK_PIPELINE_STAGE_2_HOST_BIT

VK_ACCESS_2_HOST_WRITE_BIT

VK_PIPELINE_STAGE_2_HOST_BIT

VK_ACCESS_2_MEMORY_READ_BIT

任意

VK_ACCESS_2_MEMORY_WRITE_BIT

任意

VK_ACCESS_2_SHADER_SAMPLED_READ_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_SHADER_STORAGE_READ_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR

VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR

VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR

VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR

VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT

VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT

VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT

VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT

VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV

VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV

VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_EXT

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT

VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_EXT

VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_EXT

VK_ACCESS_2_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR

VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR

VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR

VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT

VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT

VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT

VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT

VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI, VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI

VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI

VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

VK_ACCESS_2_MICROMAP_READ_BIT_EXT

VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT, VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT

VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV

VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV

VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

// Provided by VK_VERSION_1_0
typedef VkFlags VkAccessFlags;

VkAccessFlags 是一个位掩码类型,用于设置零个或多个 VkAccessFlagBits 的掩码。

如果内存对象不具有 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 属性,则必须调用 vkFlushMappedMemoryRanges,以保证主机对内存对象的写入对主机域可用,在那里它们可以通过域操作进一步对设备域可用。类似地,必须调用 vkInvalidateMappedMemoryRanges,以保证对主机域可用的写入对主机操作可见。

如果内存对象确实具有 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 属性标志,则主机对内存对象的写入会自动对主机域可用。类似地,对主机域可用的写入会自动对主机可见。

队列提交命令会自动为命令执行之前执行的所有写入执行从主机到设备的域操作,因此在大多数情况下,这种情况不需要显式的内存屏障。在主机写入和设备读取访问之间没有提交的少数情况下,可以通过使用显式的内存屏障使写入可用。

帧缓冲区区域依赖

在帧缓冲区上或相对于帧缓冲区操作的流水线阶段统称为帧缓冲区空间流水线阶段。这些阶段是

  • VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT

  • VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT

  • VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT

对于这些流水线阶段,从第一组操作到第二组操作的执行或内存依赖可以是单个帧缓冲区全局依赖,也可以拆分为多个帧缓冲区局部依赖。具有非帧缓冲区空间流水线阶段的依赖关系既不是帧缓冲区全局依赖,也不是帧缓冲区局部依赖。

帧缓冲区区域是整个帧缓冲区的子集,可以

  • 样本区域,这是一组样本(x、y、层、样本)坐标,是整个帧缓冲区的子集,或

  • 片段区域,这是一组片段(x、y、层)坐标,是整个帧缓冲区的子集。

帧缓冲局部依赖的同步范围都只包括在相应帧缓冲区域内执行的操作(如下定义)。对于帧缓冲局部依赖,不保证不同帧缓冲区域之间的顺序。

帧缓冲全局依赖的同步范围包括对所有帧缓冲区域的操作。

如果第一个同步范围包括对具有 N 个样本的像素/片段的操作,而第二个同步范围包括对具有 M 个样本的像素/片段的操作,其中 N 不等于 M,则第一个同步范围中包含给定 (x, y, layer) 坐标处所有样本的帧缓冲区域对应于第二个同步范围中相同坐标处包含所有样本的区域。换句话说,帧缓冲区域是一个片段区域,它是一个像素粒度的依赖。如果 N 等于 M,并且 VkSubpassDescription::flags 没有指定 VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM 标志,则第一个同步范围中包含单个 (x, y, layer, sample) 坐标的帧缓冲区域对应于第二个同步范围中相同坐标的相同样本的区域。换句话说,帧缓冲区域是一个样本区域,它是一个样本粒度的依赖。

如果执行操作的管线是使用 VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXTVK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXTVK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT 创建的,则帧缓冲区域是一个片段区域,它是一个像素粒度的依赖。

由于片段着色器调用的运行没有指定任何特定的分组,因此帧缓冲区域的大小是实现相关的,应用程序不知道,并且必须假设不大于上述指定的大小。

实际上,像素与样本粒度依赖关系意味着,如果输入附件的样本数量与管线的 rasterizationSamples 不同,则片段可以访问输入附件像素中的任何样本,即使它只使用帧缓冲局部依赖。如果输入附件的样本数量相同,则片段只能访问其输入 SampleMask 中覆盖的样本(即,对于片段覆盖的每个样本,片段操作会在帧缓冲局部依赖之后发生)。要访问未覆盖的样本,需要 VkSubpassDescription::flags VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM 标志,或者需要帧缓冲全局依赖。

如果同步命令包含 dependencyFlags 参数,并指定了 VK_DEPENDENCY_BY_REGION_BIT 标志,则它为该同步命令中所有帧缓冲区域的帧缓冲空间管线阶段定义帧缓冲局部依赖。如果没有包含 dependencyFlags 参数,或者没有指定 VK_DEPENDENCY_BY_REGION_BIT 标志,则为这些阶段指定帧缓冲全局依赖。VK_DEPENDENCY_BY_REGION_BIT 标志不影响非帧缓冲空间管线阶段之间的依赖关系,也不影响帧缓冲空间和非帧缓冲空间管线阶段之间的依赖关系。

帧缓冲局部依赖对于大多数架构来说更有效率;特别是基于瓦片的架构 - 它可以将帧缓冲区域完全保存在片上寄存器中,从而避免跨此类依赖的外部带宽。在渲染中包含帧缓冲全局依赖通常会强制所有实现将数据刷新到内存或更高级别的缓存,从而破坏任何潜在的局部性优化。

视图局部依赖

在启用多视图的渲染通道实例中,依赖关系可以是视图局部的或视图全局的。

视图局部依赖仅包括来自第一个同步范围中源子通道的单个源视图的操作,并且仅包括来自第二个同步范围中目标子通道的单个目标视图的操作。视图全局依赖包括相应同步范围中源子通道和目标子通道的视图掩码中的所有视图。

如果同步命令包含 dependencyFlags 参数并指定了 VK_DEPENDENCY_VIEW_LOCAL_BIT 标志,则它为该同步命令的所有视图定义视图局部依赖。如果没有包含 dependencyFlags 参数,或者没有指定 VK_DEPENDENCY_VIEW_LOCAL_BIT 标志,则指定视图全局依赖。

设备局部依赖

依赖关系可以是设备局部的或非设备局部的。设备局部依赖充当多个单独的依赖关系,每个依赖关系对应一个执行同步命令的物理设备,其中每个依赖关系仅包括来自该物理设备在两个同步范围内的操作。非设备局部依赖是单个依赖,其中两个同步范围都包括来自参与同步命令的所有物理设备的操作。对于子通道依赖,VkDeviceGroupRenderPassBeginInfo::deviceMask 中的所有物理设备都参与依赖,对于管线屏障,命令缓冲区当前设备掩码中设置的所有物理设备都参与依赖。

如果同步命令包含 dependencyFlags 参数并指定了 VK_DEPENDENCY_DEVICE_GROUP_BIT 标志,则它为该同步命令定义非设备局部依赖。如果没有包含 dependencyFlags 参数,或者没有指定 VK_DEPENDENCY_DEVICE_GROUP_BIT 标志,则它为该同步命令定义设备局部依赖,适用于所有参与的物理设备。

信号量和事件依赖是设备局部的,并且只在执行依赖的一个物理设备上执行。

隐式同步保证

Vulkan 提供少量隐式排序保证,确保命令提交的顺序是有意义的,并避免常见操作中不必要的复杂性。

提交顺序是 Vulkan 中的基本排序,它使记录和提交到单个队列的操作和同步命令的顺序具有意义。Vulkan 中命令之间的显式和隐式排序保证都基于此排序是有意义的前提。此顺序本身不定义任何执行或内存依赖关系;同步命令和 API 内的其他排序使用此排序来定义其范围。

任何给定命令集的提交顺序取决于它们被记录到命令缓冲区然后被提交的顺序。 此顺序确定方式如下

  1. 初始顺序由主机上单个队列中 vkQueueSubmitvkQueueSubmit2 命令的执行顺序(从先到后)决定。

  2. VkSubmitInfo 结构在 vkQueueSubmitpSubmits 参数中指定的顺序,或 VkSubmitInfo2 结构在 vkQueueSubmit2pSubmits 参数中指定的顺序,按索引从小到大排列。

  3. 命令缓冲区在 VkSubmitInfoVkSubmitInfo2pCommandBuffers 成员中指定的顺序,按索引从小到大排列。

  4. 在渲染通道之外的命令被记录到主机上的命令缓冲区的顺序,从先到后。

  5. 在单个子通道内,命令被记录到主机上的命令缓冲区的顺序,从先到后。

当使用具有多个子通道的渲染通道对象时,不同子通道中的命令彼此之间没有定义的提交顺序,无论子通道的记录顺序如何。子通道内的命令仍然相对于同一子通道内以及渲染通道之外的其他命令排序。

状态命令不会在设备上执行任何操作,而是在主机上执行时按照它们记录的顺序设置命令缓冲区的状态。动作命令在记录时会使用命令缓冲区的当前状态,并根据需要执行设备上的状态更改以匹配记录的状态。

给定命令内管线阶段的执行也具有松散的顺序,仅取决于单个命令。

信号操作顺序是 Vulkan 中的一个基本顺序,它赋予在提交到单个队列时发生信号量和栅栏信号操作顺序的意义。 队列操作的信号操作顺序确定方式如下

  1. 初始顺序由主机上单个队列中 vkQueueSubmitvkQueueSubmit2 命令的执行顺序(从先到后)决定。

  2. VkSubmitInfo 结构在 vkQueueSubmitpSubmits 参数中指定的顺序,或 VkSubmitInfo2 结构在 vkQueueSubmit2pSubmits 参数中指定的顺序,按索引从小到大排列。

  3. vkQueueSubmitvkQueueSubmit2vkQueueBindSparse 命令的 fence 参数定义的栅栏信号操作在由该命令定义的所有信号量信号操作之后排序。

由单个 VkSubmitInfoVkSubmitInfo2VkBindSparseInfo 结构定义的信号量信号操作相对于在同一结构中定义的其他信号量信号操作是无序的。

vkSignalSemaphore 命令不在队列上执行,而是从主机执行信号操作。 执行 vkSignalSemaphore 命令定义的信号量信号操作在 vkSignalSemaphore 命令被调用之后发生,并在命令返回之前发生。

在信号时间线信号量时,应用程序有责任确保它们按严格递增的信号量值进行排序。 因为信号量信号操作的第一个同步范围包含所有在提交顺序中较早发生的信号量信号操作,因此保证任何给定批次中包含的所有信号量信号操作都发生在任何先前批次中包含的所有信号量信号操作之后。 但是,在单个批次中定义的信号量信号操作之间不提供排序保证。 这与时间线信号量值严格增加的要求相结合,意味着在单个批次中两次信号同一时间线信号量是无效的。

如果应用程序希望确保某些信号量信号操作在某些其他信号量信号操作之后发生,则可以提交一个单独的批次,其中仅包含信号量信号操作,这些操作将在任何较早批次中的信号量信号操作之后发生。

当从主机发送信号量信号时,唯一的排序保证是信号操作发生在调用vkSignalSemaphore之后,并在返回之前发生。 因此,如果队列提交的信号量上有任何未完成的信号操作,除非这些队列提交具有某些依赖关系,确保它们发生在主机信号操作之后,否则调用 vkSignalSemaphore 是无效的。 一个例子是,如果挂起的信号操作本身正在以较低的值等待同一信号量,并且对 vkSignalSemaphore 的调用会发出该较低值的信号。此外,如果有两个或多个进程或线程从主机发出同一时间线信号量的信号,应用程序必须确保较低信号量值的 vkSignalSemaphore 在调用较高值的 vkSignalSemaphore 之前返回。

栅栏

栅栏是一种同步原语,可以用于插入从队列到主机的依赖项。栅栏有两种状态 - 已发出信号和未发出信号。作为执行队列提交命令的一部分,栅栏可以发出信号。可以使用 vkResetFences 在主机上取消栅栏信号。可以使用 vkWaitForFences 命令由主机等待栅栏,并且可以使用vkGetFenceStatus查询当前状态。

栅栏的内部数据可能包含对与在该栅栏对象上执行的信号或取消信号操作相关的任何资源和待处理工作的引用,统称为栅栏的有效负载。提供了将内部数据导入和导出到栅栏的机制 下面。这些机制间接地使应用程序能够在进程和 API 边界上的两个或多个栅栏和其他同步原语之间共享栅栏状态。

栅栏由 VkFence 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence)

要创建栅栏,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateFence(
    VkDevice                                    device,
    const VkFenceCreateInfo*                    pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkFence*                                    pFence);
  • device 是创建栅栏的逻辑设备。

  • pCreateInfo 是指向 VkFenceCreateInfo 结构的指针,该结构包含有关如何创建栅栏的信息。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

  • pFence 是一个指针,指向一个句柄,函数会将生成的栅栏对象返回到该句柄中。

有效用法(隐式)
  • VUID-vkCreateFence-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkCreateFence-pCreateInfo-parameter
    pCreateInfo 必须 是一个指向有效 VkFenceCreateInfo 结构的有效指针

  • VUID-vkCreateFence-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateFence-pFence-parameter
    pFence 必须 是一个指向 VkFence 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkFenceCreateInfo 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkFenceCreateInfo {
    VkStructureType       sType;
    const void*           pNext;
    VkFenceCreateFlags    flags;
} VkFenceCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkFenceCreateFlagBits 的位掩码,指定栅栏的初始状态和行为。

有效用法(隐式)
  • VUID-VkFenceCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FENCE_CREATE_INFO

  • VUID-VkFenceCreateInfo-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkExportFenceCreateInfoVkExportFenceWin32HandleInfoKHR 的有效实例的指针

  • VUID-VkFenceCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkFenceCreateInfo-flags-parameter
    flags 必须VkFenceCreateFlagBits 值的有效组合

// Provided by VK_VERSION_1_0
typedef enum VkFenceCreateFlagBits {
    VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001,
} VkFenceCreateFlagBits;
  • VK_FENCE_CREATE_SIGNALED_BIT 指定栅栏对象以已发出信号状态创建。否则,它以未发出信号状态创建。

// Provided by VK_VERSION_1_0
typedef VkFlags VkFenceCreateFlags;

VkFenceCreateFlags 是一个位掩码类型,用于设置零个或多个 VkFenceCreateFlagBits 的掩码。

要创建其负载可以导出到外部句柄的栅栏,请将 VkExportFenceCreateInfo 结构添加到 VkFenceCreateInfo 结构的 pNext 链中。VkExportFenceCreateInfo 结构的定义如下:

// Provided by VK_VERSION_1_1
typedef struct VkExportFenceCreateInfo {
    VkStructureType                   sType;
    const void*                       pNext;
    VkExternalFenceHandleTypeFlags    handleTypes;
} VkExportFenceCreateInfo;

或等效的

// Provided by VK_KHR_external_fence
typedef VkExportFenceCreateInfo VkExportFenceCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • handleTypesVkExternalFenceHandleTypeFlagBits 的位掩码,指定应用程序可以从生成的栅栏导出一个或多个栅栏句柄类型。应用程序可以为同一个栅栏请求多个句柄类型。

有效使用
  • VUID-VkExportFenceCreateInfo-handleTypes-01446
    handleTypes 中的位必须受支持且兼容,如 VkExternalFenceProperties 报告的那样

有效用法(隐式)
  • VUID-VkExportFenceCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO

  • VUID-VkExportFenceCreateInfo-handleTypes-parameter
    handleTypes 必须VkExternalFenceHandleTypeFlagBits 值的有效组合

要指定从栅栏导出的 NT 句柄的其他属性,请将 VkExportFenceWin32HandleInfoKHR 结构添加到 VkFenceCreateInfo 结构的 pNext 链中。VkExportFenceWin32HandleInfoKHR 结构定义如下:

// Provided by VK_KHR_external_fence_win32
typedef struct VkExportFenceWin32HandleInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    const SECURITY_ATTRIBUTES*    pAttributes;
    DWORD                         dwAccess;
    LPCWSTR                       name;
} VkExportFenceWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pAttributes 是指向 Windows SECURITY_ATTRIBUTES 结构的指针,指定句柄的安全属性。

  • dwAccess 是一个 DWORD,指定句柄的访问权限。

  • name 是一个以 null 结尾的 UTF-16 字符串,用于与从创建的栅栏导出的 NT 句柄引用的底层同步原语关联。

如果 VkExportFenceCreateInfo 不包含在同一个 pNext 链中,则忽略此结构。

如果在 VkFenceCreateInfopNext 链中包含 VkExportFenceCreateInfo 并带有 Windows handleType,但 pNext 链中不包含 VkExportFenceWin32HandleInfoKHR,或者包含但 pAttributesNULL,则将使用默认安全描述符值,并且应用程序创建的子进程将不会继承该句柄,如 MSDN 文档“Synchronization Object Security and Access Rights”1中所述。此外,如果该结构不存在,则访问权限将为

DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE

对于以下类型的句柄

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT

有效使用
有效用法(隐式)
  • VUID-VkExportFenceWin32HandleInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR

  • VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter
    如果 pAttributes 不为 NULL,则 pAttributes 必须是指向有效的 SECURITY_ATTRIBUTES 值的有效指针

要导出表示栅栏状态的 Windows 句柄,请调用

// Provided by VK_KHR_external_fence_win32
VkResult vkGetFenceWin32HandleKHR(
    VkDevice                                    device,
    const VkFenceGetWin32HandleInfoKHR*         pGetWin32HandleInfo,
    HANDLE*                                     pHandle);
  • device 是创建正在导出的栅栏的逻辑设备。

  • pGetWin32HandleInfo 是指向 VkFenceGetWin32HandleInfoKHR 结构的指针,该结构包含导出操作的参数。

  • pHandle 将返回表示栅栏状态的 Windows 句柄。

对于定义为 NT 句柄的句柄类型,vkGetFenceWin32HandleKHR 返回的句柄由应用程序所有。为了避免资源泄漏,应用程序在不再需要它们时必须使用 CloseHandle 系统调用释放它们的所有权。

从栅栏导出 Windows 句柄可能会产生副作用,具体取决于指定句柄类型的转移,如 导入栅栏负载中所述。

有效用法(隐式)
  • VUID-vkGetFenceWin32HandleKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter
    pGetWin32HandleInfo 必须是一个指向有效的 VkFenceGetWin32HandleInfoKHR 结构的有效指针

  • VUID-vkGetFenceWin32HandleKHR-pHandle-parameter
    pHandle 必须是一个指向 HANDLE 值的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkFenceGetWin32HandleInfoKHR 结构定义如下

// Provided by VK_KHR_external_fence_win32
typedef struct VkFenceGetWin32HandleInfoKHR {
    VkStructureType                      sType;
    const void*                          pNext;
    VkFence                              fence;
    VkExternalFenceHandleTypeFlagBits    handleType;
} VkFenceGetWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • fence 是将要导出状态的栅栏。

  • handleType 是一个 VkExternalFenceHandleTypeFlagBits 值,指定请求的句柄类型。

返回的句柄的属性取决于 handleType 的值。 有关定义的外部栅栏句柄类型的属性的描述,请参阅 VkExternalFenceHandleTypeFlagBits

有效使用
  • VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448
    当创建 fence 的当前负载时,handleType 必须包含在 VkExportFenceCreateInfo::handleTypes

  • VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449
    如果 handleType 定义为 NT 句柄,则对于 fencehandleType 的每个有效唯一组合,必须最多调用一次 vkGetFenceWin32HandleKHR

  • VUID-VkFenceGetWin32HandleInfoKHR-fence-01450
    fence 必须不能将其负载替换为下面 导入栅栏负载 中所述的导入负载,除非该导入负载的句柄类型包含在 VkExternalFenceProperties::exportFromImportedHandleTypes 中,用于 handleType

  • VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451
    如果 handleType 指的是具有复制负载传输语义的句柄类型,则 fence 必须被触发,或者具有关联的 栅栏触发操作 等待执行

  • VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452
    handleType 必须定义为 NT 句柄或全局共享句柄

有效用法(隐式)
  • VUID-VkFenceGetWin32HandleInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR

  • VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter
    fence 必须是一个有效的 VkFence 句柄

  • VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter
    handleType 必须是一个有效的 VkExternalFenceHandleTypeFlagBits

要导出表示栅栏负载的 POSIX 文件描述符,请调用

// Provided by VK_KHR_external_fence_fd
VkResult vkGetFenceFdKHR(
    VkDevice                                    device,
    const VkFenceGetFdInfoKHR*                  pGetFdInfo,
    int*                                        pFd);
  • device 是创建正在导出的栅栏的逻辑设备。

  • pGetFdInfo 是一个指向 VkFenceGetFdInfoKHR 结构的指针,该结构包含导出操作的参数。

  • pFd 将返回表示栅栏负载的文件描述符。

每次调用 vkGetFenceFdKHR 必须创建一个新的文件描述符,并将所有权转移给应用程序。 为了避免资源泄漏,应用程序在不再需要文件描述符时必须释放文件描述符的所有权。

可以通过多种方式释放所有权。 例如,应用程序可以对文件描述符调用 close(),或通过使用文件描述符导入栅栏负载将所有权转回 Vulkan。

如果 pGetFdInfo->handleTypeVK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT 并且在调用 vkGetFenceFdKHR 时栅栏被触发,则 pFd 可以返回 -1 值而不是有效的文件描述符。

如果操作系统支持,则实现必须设置文件描述符在进行 execve 系统调用时自动关闭。

从栅栏导出文件描述符可能会产生副作用,具体取决于指定句柄类型的转移,如 导入栅栏状态中所述。

有效用法(隐式)
  • VUID-vkGetFenceFdKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetFenceFdKHR-pGetFdInfo-parameter
    pGetFdInfo 必须是一个指向有效的 VkFenceGetFdInfoKHR 结构的有效指针

  • VUID-vkGetFenceFdKHR-pFd-parameter
    pFd 必须是一个指向 int 值的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkFenceGetFdInfoKHR 结构定义如下

// Provided by VK_KHR_external_fence_fd
typedef struct VkFenceGetFdInfoKHR {
    VkStructureType                      sType;
    const void*                          pNext;
    VkFence                              fence;
    VkExternalFenceHandleTypeFlagBits    handleType;
} VkFenceGetFdInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • fence 是将要导出状态的栅栏。

  • handleType 是一个 VkExternalFenceHandleTypeFlagBits 值,指定请求的句柄类型。

返回的文件描述符的属性取决于 handleType 的值。 有关定义的外部栅栏句柄类型的属性的描述,请参阅 VkExternalFenceHandleTypeFlagBits

有效使用
  • VUID-VkFenceGetFdInfoKHR-handleType-01453
    当创建 fence 的当前负载时,handleType 必须包含在 VkExportFenceCreateInfo::handleTypes

  • VUID-VkFenceGetFdInfoKHR-handleType-01454
    如果 handleType 指的是具有复制负载传输语义的句柄类型,则 fence 必须被触发,或者具有关联的 栅栏触发操作 等待执行

  • VUID-VkFenceGetFdInfoKHR-fence-01455
    fence 必须不能将其负载替换为下面 导入栅栏负载 中所述的导入负载,除非该导入负载的句柄类型包含在 VkExternalFenceProperties::exportFromImportedHandleTypes 中,用于 handleType

  • VUID-VkFenceGetFdInfoKHR-handleType-01456
    handleType 必须定义为 POSIX 文件描述符句柄

有效用法(隐式)
  • VUID-VkFenceGetFdInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR

  • VUID-VkFenceGetFdInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkFenceGetFdInfoKHR-fence-parameter
    fence 必须是一个有效的 VkFence 句柄

  • VUID-VkFenceGetFdInfoKHR-handleType-parameter
    handleType 必须是一个有效的 VkExternalFenceHandleTypeFlagBits

要销毁一个栅栏,调用

// Provided by VK_VERSION_1_0
void vkDestroyFence(
    VkDevice                                    device,
    VkFence                                     fence,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁栅栏的逻辑设备。

  • fence 是要销毁的栅栏的句柄。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

有效使用
  • VUID-vkDestroyFence-fence-01120
    所有引用 fence队列提交命令必须已完成执行

  • VUID-vkDestroyFence-fence-01121
    如果在创建 fence 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyFence-fence-01122
    如果在创建 fence 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyFence-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkDestroyFence-fence-parameter
    如果 fence 不是 VK_NULL_HANDLE,则 fence 必须是一个有效的 VkFence 句柄

  • VUID-vkDestroyFence-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyFence-fence-parent
    如果 fence 是一个有效的句柄,它必须已从 device 创建、分配或检索

主机同步
  • fence 的主机访问必须进行外部同步

要从主机查询栅栏的状态,调用

// Provided by VK_VERSION_1_0
VkResult vkGetFenceStatus(
    VkDevice                                    device,
    VkFence                                     fence);
  • device 是拥有栅栏的逻辑设备。

  • fence 是要查询的栅栏的句柄。

成功后,vkGetFenceStatus 返回栅栏对象的状态,并具有以下返回代码

表 3. 栅栏对象状态代码
状态 含义

VK_SUCCESS

fence 指定的栅栏已发出信号。

VK_NOT_READY

fence 指定的栅栏未发出信号。

VK_ERROR_DEVICE_LOST

设备已丢失。请参阅丢失的设备

如果队列提交命令正在等待执行,则此命令返回的值可能会立即过时。

如果设备已丢失(请参阅丢失的设备),vkGetFenceStatus 可能会返回上述任何状态代码。如果设备已丢失并且重复调用 vkGetFenceStatus,它最终将返回 VK_SUCCESSVK_ERROR_DEVICE_LOST

有效用法(隐式)
  • VUID-vkGetFenceStatus-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetFenceStatus-fence-parameter
    fence 必须是一个有效的 VkFence 句柄

  • VUID-vkGetFenceStatus-fence-parent
    fence 必须已从 device 创建、分配或检索

返回值
成功
  • VK_SUCCESS

  • VK_NOT_READY

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

要从主机将栅栏的状态设置为未发出信号,调用

// Provided by VK_VERSION_1_0
VkResult vkResetFences(
    VkDevice                                    device,
    uint32_t                                    fenceCount,
    const VkFence*                              pFences);
  • device 是拥有栅栏的逻辑设备。

  • fenceCount 是要重置的栅栏的数量。

  • pFences 是指向要重置的栅栏句柄数组的指针。

如果 pFences 的任何成员当前已将其有效负载导入为临时持久性,则首先恢复该栅栏的先前永久有效负载。因此,其余描述的操作在恢复的有效负载上进行操作。

当在主机上执行 vkResetFences 时,它为每个栅栏定义一个栅栏未发出信号操作,该操作将栅栏重置为未发出信号的状态。

如果当执行 vkResetFences 时,pFences 的任何成员已处于未发出信号的状态,则 vkResetFences 对该栅栏无效。

有效使用
  • VUID-vkResetFences-pFences-01123
    pFences 的每个元素必须当前未与任何尚未在该队列上完成执行的队列命令关联

有效用法(隐式)
  • VUID-vkResetFences-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkResetFences-pFences-parameter
    pFences 必须是指向 fenceCount 个有效 VkFence 句柄的数组的有效指针

  • VUID-vkResetFences-fenceCount-arraylength
    fenceCount 必须大于 0

  • VUID-vkResetFences-pFences-parent
    pFences 的每个元素必须已从 device 创建、分配或检索

主机同步
  • pFences 的每个成员的主机访问必须进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_DEVICE_MEMORY

当一个栅栏作为队列提交命令的一部分提交到队列时,它定义了对作为该命令一部分提交的批次的内存依赖性,并定义了栅栏发出信号操作,该操作将栅栏设置为已发出信号的状态。

第一个同步范围包括在同一个队列提交命令中提交的每个批次。由 vkQueueSubmitvkQueueSubmit2 定义的栅栏发出信号操作还包括在第一个同步范围内的所有在提交顺序中较早发生的命令。由 vkQueueSubmitvkQueueSubmit2vkQueueBindSparse 定义的栅栏发出信号操作还包括在第一个同步范围内的任何在信号操作顺序中较早发生的信号量和栅栏发出信号操作。

第二个同步范围仅包括栅栏发出信号操作。

第一个访问范围包括设备执行的所有内存访问。

第二个访问范围为空。

要在主机上等待一个或多个栅栏进入已发出信号的状态,调用

// Provided by VK_VERSION_1_0
VkResult vkWaitForFences(
    VkDevice                                    device,
    uint32_t                                    fenceCount,
    const VkFence*                              pFences,
    VkBool32                                    waitAll,
    uint64_t                                    timeout);
  • device 是拥有栅栏的逻辑设备。

  • fenceCount 是要等待的栅栏的数量。

  • pFences 是指向 fenceCount 个栅栏句柄的数组的指针。

  • waitAll 是要成功解除阻塞等待必须满足的条件。如果 waitAllVK_TRUE,则条件是 pFences 中的所有栅栏都已发出信号。否则,条件是 pFences 中至少有一个栅栏已发出信号。

  • timeout 是以纳秒为单位的超时时间。timeout 会调整为实现定义的超时精度所允许的最接近的值,该值可能比一纳秒长得多,并且可能比请求的时间长。

如果在调用 vkWaitForFences 时满足条件,则 vkWaitForFences 会立即返回。如果在调用 vkWaitForFences 时未满足条件,则 vkWaitForFences 将会阻塞并等待,直到条件满足或 timeout 过期,以较早者为准。

如果 timeout 为零,则 vkWaitForFences 不会等待,而只是返回栅栏的当前状态。如果未满足条件,即使没有执行实际等待,在这种情况下也会返回 VK_TIMEOUT

如果在 timeout 过期之前满足条件,则 vkWaitForFences 返回 VK_SUCCESS。否则,vkWaitForFencestimeout 过期后返回 VK_TIMEOUT

如果设备丢失(参见设备丢失)发生在超时时间到期之前,vkWaitForFences 必须在有限的时间内返回,返回值为 VK_SUCCESSVK_ERROR_DEVICE_LOST

虽然我们保证 vkWaitForFences 必须在有限的时间内返回,但不能保证它在设备丢失后立即返回。不过,应用程序可以合理地预期延迟将在几秒钟的量级,并且调用 vkWaitForFences 不会导致进程永久(或看似永久)死锁。

有效用法(隐式)
  • VUID-vkWaitForFences-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkWaitForFences-pFences-parameter
    pFences 必须是指向 fenceCount 个有效 VkFence 句柄的数组的有效指针

  • VUID-vkWaitForFences-fenceCount-arraylength
    fenceCount 必须大于 0

  • VUID-vkWaitForFences-pFences-parent
    pFences 的每个元素必须已从 device 创建、分配或检索

返回值
成功
  • VK_SUCCESS

  • VK_TIMEOUT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

执行依赖性是通过等待栅栏变为已发出信号状态来定义的,可以通过 vkWaitForFences 或轮询 vkGetFenceStatus 来实现。

第一个同步范围仅包括栅栏信号操作。

第二个同步范围包括主机操作 vkWaitForFencesvkGetFenceStatus,它们指示栅栏已变为已发出信号状态。

发出栅栏信号并在主机上等待并不能保证内存访问的结果对主机可见,因为栅栏定义的内存依赖关系的访问范围仅包括设备访问。必须使用内存屏障或其他内存依赖性来保证这一点。有关更多信息,请参见主机访问类型的描述。

发出栅栏信号的替代方法

除了将栅栏作为队列提交命令的一部分提交到队列之外,当设备或显示器上发生特定事件时,可以发出栅栏信号。

要创建一个当设备上发生事件时将发出信号的栅栏,请调用

// Provided by VK_EXT_display_control
VkResult vkRegisterDeviceEventEXT(
    VkDevice                                    device,
    const VkDeviceEventInfoEXT*                 pDeviceEventInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkFence*                                    pFence);
  • device 是一个逻辑设备,事件可能在该设备上发生。

  • pDeviceEventInfo 是一个指向 VkDeviceEventInfoEXT 结构的指针,该结构描述了应用程序感兴趣的事件。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

  • pFence 是一个指针,指向一个句柄,函数会将生成的栅栏对象返回到该句柄中。

有效用法(隐式)
  • VUID-vkRegisterDeviceEventEXT-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter
    pDeviceEventInfo 必须是指向有效 VkDeviceEventInfoEXT 结构的有效指针

  • VUID-vkRegisterDeviceEventEXT-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkRegisterDeviceEventEXT-pFence-parameter
    pFence 必须 是一个指向 VkFence 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkDeviceEventInfoEXT 结构定义如下

// Provided by VK_EXT_display_control
typedef struct VkDeviceEventInfoEXT {
    VkStructureType         sType;
    const void*             pNext;
    VkDeviceEventTypeEXT    deviceEvent;
} VkDeviceEventInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • device 是一个 VkDeviceEventTypeEXT 值,指定何时发出栅栏信号。

有效用法(隐式)
  • VUID-VkDeviceEventInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT

  • VUID-VkDeviceEventInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDeviceEventInfoEXT-deviceEvent-parameter
    deviceEvent 必须是有效的 VkDeviceEventTypeEXT

VkDeviceEventInfoEXT::device 的可能值,指定何时发出栅栏信号,如下所示

// Provided by VK_EXT_display_control
typedef enum VkDeviceEventTypeEXT {
    VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT = 0,
} VkDeviceEventTypeEXT;
  • VK_DEVICE_EVENT_TYPE_DISPLAY_HOTPLUG_EXT 指定当显示器插入或拔出指定设备时发出栅栏信号。应用程序可以使用此通知来确定何时需要重新枚举设备上可用的显示器。

要创建一个当 VkDisplayKHR 对象上发生事件时将发出信号的栅栏,请调用

// Provided by VK_EXT_display_control
VkResult vkRegisterDisplayEventEXT(
    VkDevice                                    device,
    VkDisplayKHR                                display,
    const VkDisplayEventInfoEXT*                pDisplayEventInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkFence*                                    pFence);
  • device 是与 display 关联的逻辑设备

  • display 是事件可能发生的显示器。

  • pDisplayEventInfo 是一个指向 VkDisplayEventInfoEXT 结构的指针,该结构描述了应用程序感兴趣的事件。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

  • pFence 是一个指针,指向一个句柄,函数会将生成的栅栏对象返回到该句柄中。

有效用法(隐式)
  • VUID-vkRegisterDisplayEventEXT-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkRegisterDisplayEventEXT-display-parameter
    display 必须是有效的 VkDisplayKHR 句柄

  • VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter
    pDisplayEventInfo 必须是指向有效 VkDisplayEventInfoEXT 结构的有效指针

  • VUID-vkRegisterDisplayEventEXT-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkRegisterDisplayEventEXT-pFence-parameter
    pFence 必须 是一个指向 VkFence 句柄的有效指针

  • VUID-vkRegisterDisplayEventEXT-commonparent
    devicedisplay必须是从同一个 VkPhysicalDevice 创建、分配或检索的。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkDisplayEventInfoEXT 结构定义如下

// Provided by VK_EXT_display_control
typedef struct VkDisplayEventInfoEXT {
    VkStructureType          sType;
    const void*              pNext;
    VkDisplayEventTypeEXT    displayEvent;
} VkDisplayEventInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • displayEvent 是一个 VkDisplayEventTypeEXT,指定何时发出栅栏信号。

有效用法(隐式)
  • VUID-VkDisplayEventInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT

  • VUID-VkDisplayEventInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDisplayEventInfoEXT-displayEvent-parameter
    displayEvent 必须是有效的 VkDisplayEventTypeEXT

VkDisplayEventInfoEXT::displayEvent 的可能值,指定何时发出栅栏信号,如下所示

// Provided by VK_EXT_display_control
typedef enum VkDisplayEventTypeEXT {
    VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT = 0,
} VkDisplayEventTypeEXT;
  • VK_DISPLAY_EVENT_TYPE_FIRST_PIXEL_OUT_EXT 指定当下一个显示刷新周期的第一个像素离开显示引擎到达显示器时发出栅栏信号。

导入栅栏负载

应用程序可以使用外部栅栏句柄将栅栏负载导入到现有的栅栏中。导入操作的效果将是临时的或永久的,具体取决于应用程序的指定。如果导入是临时的,则下次将栅栏传递给 vkResetFences 时,栅栏将恢复到其永久状态。

将栅栏恢复到其之前的永久负载与重置栅栏负载是不同的操作。有关更多详细信息,请参见 vkResetFences

在重置栅栏之前对栅栏执行后续的临时导入不会对此要求产生任何影响;栅栏的下一个未发出信号状态必须仍然恢复其最后一个永久状态。永久负载导入的行为就像目标栅栏被销毁,并且创建了一个具有相同句柄但导入了负载的新栅栏。由于临时或永久导入栅栏负载会将现有负载从栅栏中分离,因此任何导入栅栏负载的命令都适用与 vkDestroyFence 类似的用法限制。使用哪种导入类型称为导入操作的持久性。每种句柄类型都支持一种或两种类型的持久性。

实现必须根据指定的外部栅栏句柄的类型,通过引用或复制该句柄所引用的负载来执行导入操作。所使用的导入方法称为句柄类型的转移。当使用具有引用转移的句柄类型时,将负载导入栅栏会将该栅栏添加到共享该负载的所有栅栏的集合中。此集合包括从中导出负载的栅栏。对集合中的任何栅栏执行的栅栏信号发送、等待和重置操作必须表现得好像该集合是一个单独的栅栏。使用具有复制转移的句柄类型导入负载会在导入时创建负载的重复副本,但不再引用它。对复制导入的目标执行的栅栏信号发送、等待和重置操作必须不影响任何其他栅栏或负载。

导出操作具有与指定句柄类型的导入操作相同的转移方式。此外,将栅栏负载导出到具有复制转移的句柄会对源栅栏的负载产生与执行栅栏重置操作相同的副作用。如果栅栏使用的是临时导入的负载,则该栅栏之前的永久负载将被恢复。

VkImportFenceWin32HandleInfoKHR 支持的句柄类型VkImportFenceFdInfoKHR 支持的句柄类型定义了每个句柄类型的持久性和转移方式。

外部同步允许实现修改对象的内部状态,即负载,而无需内部同步。然而,对于跨进程共享负载的栅栏,满足 VkFence 参数的外部同步要求(就好像集合中的所有栅栏都是同一个对象)有时是不可行的。同样,满足栅栏状态的有效使用约束将需要进程之间不切实际的协调或信任级别。因此,这些约束仅适用于特定的栅栏句柄,而不适用于其负载。对于共享负载的不同栅栏对象

  • 如果同时调用多个排队信号操作或取消信号栅栏的命令,行为将如同这些命令以任意顺序依次调用。

  • 如果使用正在共享负载的栅栏调用队列提交命令,并且该负载已与另一个尚未完成执行的队列命令关联,则其中一个或两个命令将在完成执行时导致栅栏变为已信号状态。

  • 如果栅栏负载在与尚未完成执行的队列命令关联时被重置,则该负载将变为未信号状态,但可能在命令完成执行时再次变为已信号状态。

  • 在上述情况下,与共享负载的栅栏关联的任何设备可能会丢失,或者任何队列提交或栅栏重置命令可能会返回 VK_ERROR_INITIALIZATION_FAILED

除了这些不确定的结果外,行为是明确定义的。特别是

  • 实现必须不崩溃或进入内部不一致的状态,在这种状态下,未来有效的 Vulkan 命令可能会导致未定义的结果,

  • 未来对共享负载的栅栏的等待命令的超时必须有效。

这些规则允许进程同步对共享内存的访问,而无需相互信任。然而,这些进程仍然必须小心,不要将共享栅栏用于除同步对共享内存的访问之外的用途。例如,一个进程不应使用具有共享负载的栅栏来判断其提交到队列的命令何时完成,以及这些命令使用的对象何时可以被销毁,因为另一个进程可能会意外或恶意地导致栅栏在命令实际完成之前发出信号。

当栅栏使用导入的负载时,它的VkExportFenceCreateInfo::handleTypes值是在创建从中导出负载的栅栏时指定的,而不是在创建栅栏时指定的。此外,VkExternalFenceProperties::exportFromImportedHandleTypes会根据用于导入当前负载的特定句柄类型,限制可以从此类栅栏导出的句柄类型。将栅栏传递给vkAcquireNextImageKHR等同于将栅栏负载临时导入该栅栏。

由于导入的栅栏的可导出句柄类型与其当前导入的负载相对应,并且vkAcquireNextImageKHR的行为与临时导入操作相同,其中源栅栏对应用程序是不透明的,因此应用程序无法确定是否可以从处于此状态的栅栏导出任何外部句柄类型。因此,应用程序必须不要尝试从使用来自vkAcquireNextImageKHR的临时导入负载的栅栏导出句柄。

当导入栅栏负载时,应用程序有责任确保外部句柄满足所有有效的使用要求。然而,实现必须对外部句柄执行充分的验证,以确保该操作产生有效的栅栏,该栅栏在按照其导入参数允许使用时,不会导致程序终止、设备丢失、队列停滞、主机线程停滞或损坏其他资源。如果提供的外部句柄不满足这些要求,实现必须使用错误代码 VK_ERROR_INVALID_EXTERNAL_HANDLE 使栅栏负载导入操作失败。

要从 Windows 句柄导入栅栏负载,请调用

// Provided by VK_KHR_external_fence_win32
VkResult vkImportFenceWin32HandleKHR(
    VkDevice                                    device,
    const VkImportFenceWin32HandleInfoKHR*      pImportFenceWin32HandleInfo);
  • device 是创建栅栏的逻辑设备。

  • pImportFenceWin32HandleInfo 是指向 VkImportFenceWin32HandleInfoKHR 结构的指针,该结构指定栅栏和导入参数。

从 Windows 句柄导入栅栏负载不会将句柄的所有权转移给 Vulkan 实现。对于定义为 NT 句柄的句柄类型,当不再需要该句柄时,应用程序必须使用 CloseHandle 系统调用释放所有权。

应用程序可以将相同的栅栏负载导入到 Vulkan 的多个实例中,导入到从中导出它的同一实例中,以及多次导入到给定的 Vulkan 实例中。

有效使用
  • VUID-vkImportFenceWin32HandleKHR-fence-04448
    fence 必须不与该队列上任何尚未完成执行的队列命令关联

有效用法(隐式)
  • VUID-vkImportFenceWin32HandleKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter
    pImportFenceWin32HandleInfo 必须是指向有效 VkImportFenceWin32HandleInfoKHR 结构的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

VkImportFenceWin32HandleInfoKHR 结构定义为

// Provided by VK_KHR_external_fence_win32
typedef struct VkImportFenceWin32HandleInfoKHR {
    VkStructureType                      sType;
    const void*                          pNext;
    VkFence                              fence;
    VkFenceImportFlags                   flags;
    VkExternalFenceHandleTypeFlagBits    handleType;
    HANDLE                               handle;
    LPCWSTR                              name;
} VkImportFenceWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • fence 是将状态导入其中的栅栏。

  • flagsVkFenceImportFlagBits 的位掩码,指定栅栏负载导入操作的其他参数。

  • handleType 是一个 VkExternalFenceHandleTypeFlagBits 值,指定 handle 的类型。

  • handleNULL 或要导入的外部句柄。

  • nameNULL 或一个以 null 结尾的 UTF-16 字符串,命名要导入的底层同步原语。

handleType 支持的句柄类型为

表 4. VkImportFenceWin32HandleInfoKHR 支持的句柄类型
句柄类型 转移方式 支持的持久性

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT

参考

临时,永久

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT

参考

临时,永久

有效使用
  • VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457
    handleType 必须VkImportFenceWin32HandleInfoKHR 支持的句柄类型表中包含的值

  • VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459
    如果 handleType 不是 VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT,则 name 必须NULL

  • VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460
    如果 handleNULL,则 name 必须命名一个由 handleType 指定类型的有效同步原语

  • VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461
    如果 nameNULL,则 handle 必须是由 handleType 指定类型的有效句柄

  • VUID-VkImportFenceWin32HandleInfoKHR-handle-01462
    如果 handle 不为 NULL,则 name 必须NULL

  • VUID-VkImportFenceWin32HandleInfoKHR-handle-01539
    如果 handle 不为 NULL,它必须遵守外部栅栏句柄类型兼容性中为 handleType 列出的任何要求

  • VUID-VkImportFenceWin32HandleInfoKHR-name-01540
    如果 name 不为 NULL,它必须遵守外部栅栏句柄类型兼容性中为 handleType 列出的任何要求

有效用法(隐式)
  • VUID-VkImportFenceWin32HandleInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR

  • VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter
    fence 必须是一个有效的 VkFence 句柄

  • VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter
    flags 必须VkFenceImportFlagBits值的有效组合

主机同步
  • fence 的主机访问必须进行外部同步

要从 POSIX 文件描述符导入栅栏有效负载,请调用

// Provided by VK_KHR_external_fence_fd
VkResult vkImportFenceFdKHR(
    VkDevice                                    device,
    const VkImportFenceFdInfoKHR*               pImportFenceFdInfo);
  • device 是创建栅栏的逻辑设备。

  • pImportFenceFdInfo 是指向 VkImportFenceFdInfoKHR 结构的指针,该结构指定栅栏和导入参数。

从文件描述符导入栅栏有效负载会将文件描述符的所有权从应用程序转移到 Vulkan 实现。在成功导入后,应用程序必须不对文件描述符执行任何操作。

应用程序可以将相同的栅栏负载导入到 Vulkan 的多个实例中,导入到从中导出它的同一实例中,以及多次导入到给定的 Vulkan 实例中。

有效使用
  • VUID-vkImportFenceFdKHR-fence-01463
    fence 必须不与该队列上任何尚未完成执行的队列命令关联

有效用法(隐式)
  • VUID-vkImportFenceFdKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter
    pImportFenceFdInfo 必须是指向有效VkImportFenceFdInfoKHR结构的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

VkImportFenceFdInfoKHR 结构定义如下

// Provided by VK_KHR_external_fence_fd
typedef struct VkImportFenceFdInfoKHR {
    VkStructureType                      sType;
    const void*                          pNext;
    VkFence                              fence;
    VkFenceImportFlags                   flags;
    VkExternalFenceHandleTypeFlagBits    handleType;
    int                                  fd;
} VkImportFenceFdInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • fence 是将导入有效负载的栅栏。

  • flagsVkFenceImportFlagBits 的位掩码,指定栅栏负载导入操作的其他参数。

  • handleType 是一个 VkExternalFenceHandleTypeFlagBits 值,指定 fd 的类型。

  • fd 是要导入的外部句柄。

handleType 支持的句柄类型为

表 5. VkImportFenceFdInfoKHR 支持的句柄类型
句柄类型 转移方式 支持的持久性

VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT

参考

临时,永久

VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT

复制

临时

有效使用
  • VUID-VkImportFenceFdInfoKHR-handleType-01464
    handleType 必须VkImportFenceFdInfoKHR 支持的句柄类型表中包含的值

  • VUID-VkImportFenceFdInfoKHR-fd-01541
    fd 必须遵守外部栅栏句柄类型兼容性中为 handleType 列出的任何要求

  • VUID-VkImportFenceFdInfoKHR-handleType-07306
    如果 handleType 指的是具有复制有效负载传输语义的句柄类型,则 flags 必须包含 VK_FENCE_IMPORT_TEMPORARY_BIT

如果 handleTypeVK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,则 fd 的特殊值 -1 被视为指向已发出信号的对象的有效同步文件描述符。导入操作将成功,并且 VkFence 将具有临时导入的有效负载,就像提供了有效的文件描述符一样。

导入无效的同步文件描述符的这种特殊行为允许更容易地与其他系统 API 互操作,这些系统 API 使用无效的同步文件描述符表示已完成且不需要等待的工作的约定。这与实现从已发出信号的 VkFence 导出 VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT 时返回 -1 文件描述符的选项一致。

有效用法(隐式)
  • VUID-VkImportFenceFdInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR

  • VUID-VkImportFenceFdInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkImportFenceFdInfoKHR-fence-parameter
    fence 必须是一个有效的 VkFence 句柄

  • VUID-VkImportFenceFdInfoKHR-flags-parameter
    flags 必须VkFenceImportFlagBits值的有效组合

  • VUID-VkImportFenceFdInfoKHR-handleType-parameter
    handleType 必须是一个有效的 VkExternalFenceHandleTypeFlagBits

主机同步
  • fence 的主机访问必须进行外部同步

可在以下项中设置的位

指定栅栏导入操作的其他参数是

// Provided by VK_VERSION_1_1
typedef enum VkFenceImportFlagBits {
    VK_FENCE_IMPORT_TEMPORARY_BIT = 0x00000001,
  // Provided by VK_KHR_external_fence
    VK_FENCE_IMPORT_TEMPORARY_BIT_KHR = VK_FENCE_IMPORT_TEMPORARY_BIT,
} VkFenceImportFlagBits;

或等效的

// Provided by VK_KHR_external_fence
typedef VkFenceImportFlagBits VkFenceImportFlagBitsKHR;
  • VK_FENCE_IMPORT_TEMPORARY_BIT 指定栅栏有效负载将仅临时导入,如导入栅栏有效负载中所述,而与 handleType 的持久性无关。

// Provided by VK_VERSION_1_1
typedef VkFlags VkFenceImportFlags;

或等效的

// Provided by VK_KHR_external_fence
typedef VkFenceImportFlags VkFenceImportFlagsKHR;

VkFenceImportFlags 是一种位掩码类型,用于设置零个或多个 VkFenceImportFlagBits 的掩码。

信号量

信号量是一种同步原语,可以用于在队列操作之间或队列操作与主机之间插入依赖关系。 二元信号量有两种状态 - 已触发和未触发。时间线信号量有一个严格递增的 64 位无符号整数有效负载,并根据特定的参考值触发。 队列操作执行完成后,可以触发信号量,队列操作可以等待信号量被触发后才开始执行。此外,时间线信号量可以通过主机使用 vkSignalSemaphore 命令触发,并使用 vkWaitSemaphores 命令从主机等待。

信号量的内部数据可能包括对与在该信号量对象上执行的触发或未触发操作相关的任何资源和待处理工作的引用,这些统称为信号量的有效负载。下面提供了将该内部数据导入和导出到信号量的机制。这些机制间接地使应用程序能够在两个或多个信号量以及跨进程和 API 边界的其他同步原语之间共享信号量状态。

信号量由 VkSemaphore 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore)

要创建信号量,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateSemaphore(
    VkDevice                                    device,
    const VkSemaphoreCreateInfo*                pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkSemaphore*                                pSemaphore);
  • device 是创建信号量的逻辑设备。

  • pCreateInfo 是指向 VkSemaphoreCreateInfo 结构的指针,该结构包含有关如何创建信号量的信息。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

  • pSemaphore 是指向句柄的指针,其中返回生成的信号量对象。

有效用法(隐式)
  • VUID-vkCreateSemaphore-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkCreateSemaphore-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkSemaphoreCreateInfo 结构的有效指针

  • VUID-vkCreateSemaphore-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateSemaphore-pSemaphore-parameter
    pSemaphore 必须是指向 VkSemaphore 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkSemaphoreCreateInfo 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkSemaphoreCreateInfo {
    VkStructureType           sType;
    const void*               pNext;
    VkSemaphoreCreateFlags    flags;
} VkSemaphoreCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 保留供将来使用。

有效使用
  • VUID-VkSemaphoreCreateInfo-pNext-06789
    如果 pNext 链包含 VkExportMetalObjectCreateInfoEXT 结构,则其 exportObjectType 成员必须VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT

有效用法(隐式)
// Provided by VK_VERSION_1_0
typedef VkFlags VkSemaphoreCreateFlags;

VkSemaphoreCreateFlags 是用于设置掩码的位掩码类型,但目前保留供将来使用。

VkSemaphoreTypeCreateInfo 结构定义如下

// Provided by VK_VERSION_1_2
typedef struct VkSemaphoreTypeCreateInfo {
    VkStructureType    sType;
    const void*        pNext;
    VkSemaphoreType    semaphoreType;
    uint64_t           initialValue;
} VkSemaphoreTypeCreateInfo;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreTypeCreateInfo VkSemaphoreTypeCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphoreType 是一个 VkSemaphoreType 值,用于指定信号量的类型。

  • 如果 semaphoreTypeVK_SEMAPHORE_TYPE_TIMELINE,则 initialValue 为初始有效负载值。

要创建特定类型的信号量,请将 VkSemaphoreTypeCreateInfo 结构添加到 VkSemaphoreCreateInfo::pNext 链。

如果 VkSemaphoreCreateInfopNext 链中未包含 VkSemaphoreTypeCreateInfo 结构,则创建的信号量将具有默认的 VkSemaphoreType VK_SEMAPHORE_TYPE_BINARY

有效使用
  • VUID-VkSemaphoreTypeCreateInfo-timelineSemaphore-03252
    如果未启用 timelineSemaphore 功能,则 semaphoreType 必须不等于 VK_SEMAPHORE_TYPE_TIMELINE

  • VUID-VkSemaphoreTypeCreateInfo-semaphoreType-03279
    如果 semaphoreTypeVK_SEMAPHORE_TYPE_BINARY,则 initialValue 必须为零

有效用法(隐式)
  • VUID-VkSemaphoreTypeCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO

  • VUID-VkSemaphoreTypeCreateInfo-semaphoreType-parameter
    semaphoreType 必须为有效的 VkSemaphoreType

以下是 VkSemaphoreTypeCreateInfo::semaphoreType 的可能值,用于指定信号量的类型:

// Provided by VK_VERSION_1_2
typedef enum VkSemaphoreType {
    VK_SEMAPHORE_TYPE_BINARY = 0,
    VK_SEMAPHORE_TYPE_TIMELINE = 1,
  // Provided by VK_KHR_timeline_semaphore
    VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY,
  // Provided by VK_KHR_timeline_semaphore
    VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE,
} VkSemaphoreType;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreType VkSemaphoreTypeKHR;
  • VK_SEMAPHORE_TYPE_BINARY 指定二元信号量类型,该类型具有一个布尔有效负载,指示信号量当前是已触发还是未触发。创建时,信号量处于未触发状态。

  • VK_SEMAPHORE_TYPE_TIMELINE 指定时间线信号量类型,该类型具有严格递增的 64 位无符号整数有效负载,指示信号量是否相对于特定的参考值触发。创建时,信号量有效负载的值由 VkSemaphoreTypeCreateInfoinitialValue 字段给出。

要创建一个可以将其有效负载导出到外部句柄的信号量,请将 VkExportSemaphoreCreateInfo 结构添加到 VkSemaphoreCreateInfo 结构的 pNext 链。VkExportSemaphoreCreateInfo 结构定义如下

// Provided by VK_VERSION_1_1
typedef struct VkExportSemaphoreCreateInfo {
    VkStructureType                       sType;
    const void*                           pNext;
    VkExternalSemaphoreHandleTypeFlags    handleTypes;
} VkExportSemaphoreCreateInfo;

或等效的

// Provided by VK_KHR_external_semaphore
typedef VkExportSemaphoreCreateInfo VkExportSemaphoreCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • handleTypesVkExternalSemaphoreHandleTypeFlagBits 的位掩码,指定应用程序可以从生成的信号量导出的一个或多个信号量句柄类型。应用程序可以为同一个信号量请求多个句柄类型。

有效使用
  • VUID-VkExportSemaphoreCreateInfo-handleTypes-01124
    handleTypes 中的位必须是受支持且兼容的,如 VkExternalSemaphoreProperties 报告的那样

有效用法(隐式)
  • VUID-VkExportSemaphoreCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO

  • VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter
    handleTypes 必须VkExternalSemaphoreHandleTypeFlagBits 值的有效组合

要指定从信号量导出的 NT 句柄的附加属性,请将 VkExportSemaphoreWin32HandleInfoKHR 结构添加到 VkSemaphoreCreateInfo 结构的 pNext 链。VkExportSemaphoreWin32HandleInfoKHR 结构定义如下

// Provided by VK_KHR_external_semaphore_win32
typedef struct VkExportSemaphoreWin32HandleInfoKHR {
    VkStructureType               sType;
    const void*                   pNext;
    const SECURITY_ATTRIBUTES*    pAttributes;
    DWORD                         dwAccess;
    LPCWSTR                       name;
} VkExportSemaphoreWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pAttributes 是指向 Windows SECURITY_ATTRIBUTES 结构的指针,指定句柄的安全属性。

  • dwAccess 是一个 DWORD,指定句柄的访问权限。

  • name 是一个以 null 结尾的 UTF-16 字符串,用于与从创建的信号量导出的 NT 句柄引用的底层同步原语关联。

如果 VkExportSemaphoreCreateInfo 未包含在同一个 pNext 链中,则忽略此结构。

如果 VkExportSemaphoreCreateInfo 包含在带有 Windows handleTypeVkSemaphoreCreateInfopNext 链中,但 VkExportSemaphoreWin32HandleInfoKHR 未包含在 pNext 链中,或者它被包含但 pAttributesNULL,则将使用默认的安全描述符值,并且应用程序创建的子进程将不会继承该句柄,如 MSDN 文档“同步对象安全和访问权限”1 中所述。此外,如果该结构不存在,则使用的访问权限取决于句柄类型。

对于以下类型的句柄

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT

实现必须确保访问权限允许对信号量执行信号和等待操作。

对于以下类型的句柄

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT

访问权限必须

GENERIC_ALL

有效使用
  • VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125
    如果 VkExportSemaphoreCreateInfo::handleTypes 不包含 VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BITVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,则 VkExportSemaphoreWin32HandleInfoKHR 必须不包含在 VkSemaphoreCreateInfopNext 链中

有效用法(隐式)
  • VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR

  • VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter
    如果 pAttributes 不为 NULL,则 pAttributes 必须是指向有效的 SECURITY_ATTRIBUTES 值的有效指针

要导出表示信号量有效负载的 Windows 句柄,请调用

// Provided by VK_KHR_external_semaphore_win32
VkResult vkGetSemaphoreWin32HandleKHR(
    VkDevice                                    device,
    const VkSemaphoreGetWin32HandleInfoKHR*     pGetWin32HandleInfo,
    HANDLE*                                     pHandle);
  • device 是创建要导出的信号量的逻辑设备。

  • pGetWin32HandleInfo 是指向 VkSemaphoreGetWin32HandleInfoKHR 结构的指针,该结构包含导出操作的参数。

  • pHandle 将返回表示信号量状态的 Windows 句柄。

对于定义为 NT 句柄的句柄类型,vkGetSemaphoreWin32HandleKHR 返回的句柄归应用程序所有。为了避免资源泄漏,当不再需要这些句柄时,应用程序必须使用 CloseHandle 系统调用释放它们的所有权。

从信号量导出 Windows 句柄可能具有副作用,具体取决于指定句柄类型的转移,如导入信号量有效负载中所述。

有效用法(隐式)
  • VUID-vkGetSemaphoreWin32HandleKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter
    pGetWin32HandleInfo 必须是指向有效的 VkSemaphoreGetWin32HandleInfoKHR 结构的有效指针

  • VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter
    pHandle 必须是一个指向 HANDLE 值的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkSemaphoreGetWin32HandleInfoKHR 结构定义如下

// Provided by VK_KHR_external_semaphore_win32
typedef struct VkSemaphoreGetWin32HandleInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
} VkSemaphoreGetWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要从中导出状态的信号量。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定请求的句柄类型。

返回的句柄的属性取决于 handleType 的值。有关定义的外部信号量句柄类型的属性描述,请参阅 VkExternalSemaphoreHandleTypeFlagBits

有效使用
  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126
    当创建 semaphore 的当前有效负载时,handleType 必须已包含在 VkExportSemaphoreCreateInfo::handleTypes

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127
    如果 handleType 定义为 NT 句柄,则对于 semaphorehandleType 的每个有效唯一组合,必须最多调用一次 vkGetSemaphoreWin32HandleKHR

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128
    semaphore 当前必须没有被导入的有效负载替换其有效负载,如下面的 导入信号量有效负载中所述,除非该导入的有效负载的句柄类型包含在 VkExternalSemaphoreProperties::exportFromImportedHandleTypes 中,用于 handleType

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型(如下面的 导入信号量有效负载中所定义),则必须没有队列等待 semaphore

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型,则 semaphore 必须已发出信号,或者具有关联的 信号量信号操作等待执行

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131
    handleType 必须定义为 NT 句柄或全局共享句柄

有效用法(隐式)
  • VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter
    handleType 必须是有效的 VkExternalSemaphoreHandleTypeFlagBits

VkQueryLowLatencySupportNV 结构定义如下

// Provided by VK_NV_low_latency
typedef struct VkQueryLowLatencySupportNV {
    VkStructureType    sType;
    const void*        pNext;
    void*              pQueriedLowLatencyData;
} VkQueryLowLatencySupportNV;

此结构描述以下功能

  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pQueriedLowLatencyData 用于 NVIDIA Reflex 支持。

有效用法(隐式)
  • VUID-VkQueryLowLatencySupportNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUERY_LOW_LATENCY_SUPPORT_NV

  • VUID-VkQueryLowLatencySupportNV-pQueriedLowLatencyData-parameter
    pQueriedLowLatencyData 必须是指针值

要导出表示信号量有效负载的 POSIX 文件描述符,请调用

// Provided by VK_KHR_external_semaphore_fd
VkResult vkGetSemaphoreFdKHR(
    VkDevice                                    device,
    const VkSemaphoreGetFdInfoKHR*              pGetFdInfo,
    int*                                        pFd);
  • device 是创建要导出的信号量的逻辑设备。

  • pGetFdInfo 是指向 VkSemaphoreGetFdInfoKHR 结构的指针,该结构包含导出操作的参数。

  • pFd 将返回表示信号量负载的文件描述符。

每次调用 vkGetSemaphoreFdKHR **必须** 创建一个新的文件描述符,并将所有权转移给应用程序。为了避免资源泄漏,应用程序在不再需要文件描述符时**必须**释放其所有权。

所有权可以通过多种方式释放。例如,应用程序可以对文件描述符调用 close(),或者通过使用文件描述符导入信号量负载将所有权转移回 Vulkan。

如果操作系统支持,则实现必须设置文件描述符在进行 execve 系统调用时自动关闭。

从信号量导出文件描述符**可能**会产生副作用,具体取决于指定句柄类型的转移,如 导入信号量状态 中所述。

有效用法(隐式)
  • VUID-vkGetSemaphoreFdKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter
    pGetFdInfo **必须**是指向有效的 VkSemaphoreGetFdInfoKHR 结构的有效指针。

  • VUID-vkGetSemaphoreFdKHR-pFd-parameter
    pFd 必须是一个指向 int 值的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkSemaphoreGetFdInfoKHR 结构定义如下:

// Provided by VK_KHR_external_semaphore_fd
typedef struct VkSemaphoreGetFdInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
} VkSemaphoreGetFdInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要从中导出状态的信号量。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定请求的句柄类型。

返回的文件描述符的属性取决于 handleType 的值。有关定义的外部信号量句柄类型的属性的描述,请参阅 VkExternalSemaphoreHandleTypeFlagBits

有效使用
  • VUID-VkSemaphoreGetFdInfoKHR-handleType-01132
    当创建 semaphore 的当前负载时,handleType **必须**包含在 VkExportSemaphoreCreateInfo::handleTypes 中。

  • VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133
    semaphore 当前必须没有被导入的有效负载替换其有效负载,如下面的 导入信号量有效负载中所述,除非该导入的有效负载的句柄类型包含在 VkExternalSemaphoreProperties::exportFromImportedHandleTypes 中,用于 handleType

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-01134
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型(如下面的 导入信号量有效负载中所定义),则必须没有队列等待 semaphore

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-01135
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型,则 semaphore 必须已发出信号,或者具有关联的 信号量信号操作等待执行

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-01136
    handleType 必须定义为 POSIX 文件描述符句柄

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-03253
    如果 handleType 引用具有复制负载传输语义的句柄类型,则 semaphore **必须**使用 VK_SEMAPHORE_TYPE_BINARYVkSemaphoreType 创建。

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-03254
    如果 handleType 引用具有复制负载传输语义的句柄类型,则 semaphore **必须**具有关联的信号量信号操作,该操作已提交执行,并且其所依赖的任何信号量信号操作**必须**也已提交执行。

有效用法(隐式)
  • VUID-VkSemaphoreGetFdInfoKHR-sType-sType
    sType **必须**是 VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR

  • VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter
    handleType 必须是有效的 VkExternalSemaphoreHandleTypeFlagBits

要导出表示信号量负载的 Zircon 事件句柄,请调用

// Provided by VK_FUCHSIA_external_semaphore
VkResult vkGetSemaphoreZirconHandleFUCHSIA(
    VkDevice                                    device,
    const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
    zx_handle_t*                                pZirconHandle);
  • device 是创建要导出的信号量的逻辑设备。

  • pGetZirconHandleInfo 是指向 VkSemaphoreGetZirconHandleInfoFUCHSIA 结构的指针,该结构包含导出操作的参数。

  • pZirconHandle 将返回表示信号量负载的 Zircon 事件句柄。

每次调用 vkGetSemaphoreZirconHandleFUCHSIA **必须** 创建一个 Zircon 事件句柄,并将所有权转移给应用程序。为了避免资源泄漏,应用程序在不再需要 Zircon 事件句柄时**必须**释放其所有权。

所有权可以通过多种方式释放。例如,应用程序可以对文件描述符调用 zx_handle_close(),或者通过使用文件描述符导入信号量负载将所有权转移回 Vulkan。

从信号量导出 Zircon 事件句柄**可能**会产生副作用,具体取决于指定句柄类型的转移,如 导入信号量状态 中所述。

有效用法(隐式)
  • VUID-vkGetSemaphoreZirconHandleFUCHSIA-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetSemaphoreZirconHandleFUCHSIA-pGetZirconHandleInfo-parameter
    pGetZirconHandleInfo **必须**是指向有效的 VkSemaphoreGetZirconHandleInfoFUCHSIA 结构的有效指针。

  • VUID-vkGetSemaphoreZirconHandleFUCHSIA-pZirconHandle-parameter
    pZirconHandle **必须**是指向 zx_handle_t 值的有效指针。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkSemaphoreGetZirconHandleInfoFUCHSIA 结构定义如下:

// Provided by VK_FUCHSIA_external_semaphore
typedef struct VkSemaphoreGetZirconHandleInfoFUCHSIA {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
} VkSemaphoreGetZirconHandleInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要从中导出状态的信号量。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定请求的句柄类型。

返回的 Zircon 事件句柄的属性取决于 handleType 的值。有关定义的外部信号量句柄类型的属性的描述,请参阅 VkExternalSemaphoreHandleTypeFlagBits

有效使用
  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04758
    当创建 semaphore 的当前负载时,handleType **必须**包含在 VkExportSemaphoreCreateInfo::handleTypes 中。

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04759
    semaphore 当前必须没有被导入的有效负载替换其有效负载,如下面的 导入信号量有效负载中所述,除非该导入的有效负载的句柄类型包含在 VkExternalSemaphoreProperties::exportFromImportedHandleTypes 中,用于 handleType

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04760
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型(如下面的 导入信号量有效负载中所定义),则必须没有队列等待 semaphore

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04761
    如果 handleType 指的是具有复制有效负载转移语义的句柄类型,则 semaphore 必须已发出信号,或者具有关联的 信号量信号操作等待执行

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-04762
    handleType **必须**定义为 Zircon 事件句柄。

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-04763
    semaphore **必须**使用 VK_SEMAPHORE_TYPE_BINARYVkSemaphoreType 创建。

有效用法(隐式)
  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-sType-sType
    sType **必须**是 VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkSemaphoreGetZirconHandleInfoFUCHSIA-handleType-parameter
    handleType 必须是有效的 VkExternalSemaphoreHandleTypeFlagBits

要销毁信号量,请调用

// Provided by VK_VERSION_1_0
void vkDestroySemaphore(
    VkDevice                                    device,
    VkSemaphore                                 semaphore,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁信号量的逻辑设备。

  • semaphore 是要销毁的信号量的句柄。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

有效使用
  • VUID-vkDestroySemaphore-semaphore-05149
    所有引用 semaphore 的已提交批处理**必须**已完成执行。

  • VUID-vkDestroySemaphore-semaphore-01138
    如果在创建 semaphore 时提供了 VkAllocationCallbacks,则此处**必须**提供一组兼容的回调。

  • VUID-vkDestroySemaphore-semaphore-01139
    如果在创建 semaphore 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroySemaphore-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkDestroySemaphore-semaphore-parameter
    如果 semaphore 不是 VK_NULL_HANDLE,则 semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-vkDestroySemaphore-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroySemaphore-semaphore-parent
    如果 semaphore 是有效的句柄,它必须是从 device 创建、分配或检索的

主机同步
  • semaphore 的主机访问必须进行外部同步

信号量发出信号

当通过 队列提交 将批次提交到队列时,如果它包含要发出信号的信号量,则它定义了对该批次的内存依赖关系,并定义了将信号量设置为已发出信号状态的信号量发出信号操作

如果信号量是使用 VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType 创建的,则该信号量被认为相对于在 VkTimelineSemaphoreSubmitInfoVkSemaphoreSignalInfo 中指定的要发出信号的计数器值而发出信号。

第一个 同步范围 包括在同一批次中提交的每个命令。对于 vkQueueSubmit2,第一个同步范围被限制为 VkSemaphoreSubmitInfo::stageMask 指定的管线阶段。由 vkQueueSubmitvkQueueSubmit2 定义的信号量发出信号操作还包括在 提交顺序 中较早发生的所有命令。由 vkQueueSubmitvkQueueSubmit2vkQueueBindSparse 定义的信号量发出信号操作还在第一个同步范围中包括在 信号操作顺序 中较早发生的任何信号量和栅栏发出信号操作。

第二个 同步范围 仅包括信号量发出信号操作。

第一个访问范围包括设备执行的所有内存访问。

第二个访问范围为空。

信号量等待

当通过 队列提交 将批次提交到队列时,如果它包含要等待的信号量,则它定义了先前的信号量发出信号操作与该批次之间的内存依赖关系,并定义了信号量等待操作

此类信号量等待操作将使用 VK_SEMAPHORE_TYPE_BINARYVkSemaphoreType 创建的信号量设置为未发出信号状态。如果信号量是使用 VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType 创建的,则如果信号量发出信号的值大于或等于信号量等待的值,则先前的信号量发出信号操作将定义与信号量等待操作的内存依赖关系,因此,该信号量将继续被认为相对于在 VkTimelineSemaphoreSubmitInfo 中指定的等待计数器值而发出信号。

第一个 同步范围 包括此批次等待的每个信号量的一个 信号量发出信号操作。每个信号量等待的特定发出信号操作必须满足以下条件

  • 对于二进制信号量,发出信号操作要么在同一队列上的 提交顺序 中较早发生,要么由主机操作发生在主机上提交此批次之前的命令提交

  • 对于二进制信号量,不存在发生在发出信号操作之后和此等待操作之前的等待操作

  • 不保证发出信号操作在此批次的信号量等待操作之后发生

  • 对于时间线信号量,发出信号的值大于或等于等待值

如果多个信号量发出信号操作满足这些条件,则可以包括这些操作中的任何一个作为第一个 同步范围。在等待二进制信号量时,应用程序必须确保只有一个信号量发出信号操作满足这些条件。

第二个 同步范围 包括在同一批次中提交的每个命令。对于 vkQueueSubmit,第二个同步范围被限制为由 pWaitDstStageMask 的相应元素指定的目标阶段掩码确定的管线阶段上的操作。对于 vkQueueSubmit2,第二个同步范围被限制为 VkSemaphoreSubmitInfo::stageMask 指定的管线阶段。此外,无论是 vkQueueSubmit2 还是 vkQueueSubmit,第二个同步范围还包括在 提交顺序 中较晚发生的所有命令。

第一个 访问范围 为空。

第二个 访问范围 包括设备执行的所有内存访问。

信号量等待操作发生在执行依赖关系中的第一组操作之后,并且发生在执行依赖关系中的第二组操作之前。

与时间线信号量、栅栏或事件不同,等待二进制信号量也会在等待完成后取消该信号量的信号。应用程序必须确保在两个此类等待操作之间,该信号量再次发出信号,并使用执行依赖关系来确保这些操作按顺序发生。因此,二进制信号量等待和发出信号应成对离散地发生。

pWaitDstStageMaskVK_PIPELINE_STAGE_ALL_COMMANDS_BIT 以外的值一起使用的常见场景是,将窗口系统演示操作与渲染下一帧的后续命令缓冲区同步。在这种情况下,演示图像在演示操作完成之前必须不被覆盖,但其他管线阶段可以在无需等待的情况下执行。VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 的掩码可防止后续的颜色附件写入在信号量发出信号之前执行。某些实现可能能够在信号量发出信号之前执行传输操作和/或预光栅化工作。

如果在可演示图像在帧缓冲区中使用之前需要对其执行图像布局转换,则该转换可以作为获取图像后提交到队列的第一个操作执行,并且不应阻止其他工作与演示操作重叠。例如,VkImageMemoryBarrier 可以使用

  • srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT

  • srcAccessMask = 0

  • dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT

  • dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT

  • oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

  • newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

或者,如果不需要保留图像的内容,则 oldLayout 可以VK_IMAGE_LAYOUT_UNDEFINED

此屏障在之前的呈现操作和后续的颜色附件输出操作之间建立了一个依赖链,并在其间执行布局转换,并且不会在之前的工作和任何光栅化前着色器阶段之间引入依赖关系。更准确地说,信号量会在呈现操作完成后发出信号,信号量等待会阻塞 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 阶段,并且从同一阶段到自身存在一个依赖关系,并在其间执行布局转换。

等待操作的信号量状态要求

在等待信号量之前,应用程序必须确保信号量处于等待操作的有效状态。具体而言,当一个信号量等待操作被提交到队列时

  • 二进制信号量必须被发出信号,或者具有关联的信号量发出信号操作,该操作正在等待执行。

  • 任何等待执行的二进制信号量发出信号操作所依赖的信号量发出信号操作必须也已完成或正在等待执行。

  • 当操作执行时,必须没有其他队列在等待同一个二进制信号量。

信号量上的主机操作

除了提交到设备队列的信号量发出信号操作信号量等待操作之外,时间线信号量还支持以下主机操作

要从主机查询使用VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType创建的信号量的当前计数器值,请调用

// Provided by VK_VERSION_1_2
VkResult vkGetSemaphoreCounterValue(
    VkDevice                                    device,
    VkSemaphore                                 semaphore,
    uint64_t*                                   pValue);

或等效命令

// Provided by VK_KHR_timeline_semaphore
VkResult vkGetSemaphoreCounterValueKHR(
    VkDevice                                    device,
    VkSemaphore                                 semaphore,
    uint64_t*                                   pValue);
  • device是拥有该信号量的逻辑设备。

  • semaphore是要查询的信号量的句柄。

  • pValue是指向一个64位整数值的指针,该整数值将返回信号量的当前计数器值。

如果队列提交命令正在等待执行,则此命令返回的值可能会立即过时。

有效使用
  • VUID-vkGetSemaphoreCounterValue-semaphore-03255
    semaphore必须已使用 VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType 创建

有效用法(隐式)
  • VUID-vkGetSemaphoreCounterValue-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetSemaphoreCounterValue-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-vkGetSemaphoreCounterValue-pValue-parameter
    pValue必须是指向uint64_t值的有效指针

  • VUID-vkGetSemaphoreCounterValue-semaphore-parent
    semaphore必须已从device创建、分配或检索

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

要等待使用VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType创建的一组信号量在主机上达到特定的计数器值,请调用

// Provided by VK_VERSION_1_2
VkResult vkWaitSemaphores(
    VkDevice                                    device,
    const VkSemaphoreWaitInfo*                  pWaitInfo,
    uint64_t                                    timeout);

或等效命令

// Provided by VK_KHR_timeline_semaphore
VkResult vkWaitSemaphoresKHR(
    VkDevice                                    device,
    const VkSemaphoreWaitInfo*                  pWaitInfo,
    uint64_t                                    timeout);
  • device是拥有信号量的逻辑设备。

  • pWaitInfo是指向VkSemaphoreWaitInfo结构的指针,该结构包含有关等待条件的信息。

  • timeout 是以纳秒为单位的超时时间。timeout 会调整为实现定义的超时精度所允许的最接近的值,该值可能比一纳秒长得多,并且可能比请求的时间长。

如果在调用vkWaitSemaphores时条件已满足,则vkWaitSemaphores会立即返回。如果在调用vkWaitSemaphores时条件未满足,则vkWaitSemaphores会阻塞并等待直到条件满足或timeout过期,以较早者为准。

如果timeout为零,则vkWaitSemaphores不会等待,而只是返回有关信号量当前状态的信息。如果条件未满足,则在这种情况下会返回VK_TIMEOUT,即使没有执行实际的等待。

如果条件在timeout过期之前满足,则vkWaitSemaphores会返回VK_SUCCESS。否则,vkWaitSemaphores会在timeout过期后返回VK_TIMEOUT

如果在超时过期之前发生设备丢失(请参阅丢失设备),则vkWaitSemaphores必须在有限的时间内返回VK_SUCCESSVK_ERROR_DEVICE_LOST

有效用法(隐式)
  • VUID-vkWaitSemaphores-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkWaitSemaphores-pWaitInfo-parameter
    pWaitInfo必须是指向有效的VkSemaphoreWaitInfo结构的有效指针

返回值
成功
  • VK_SUCCESS

  • VK_TIMEOUT

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

VkSemaphoreWaitInfo结构定义如下

// Provided by VK_VERSION_1_2
typedef struct VkSemaphoreWaitInfo {
    VkStructureType         sType;
    const void*             pNext;
    VkSemaphoreWaitFlags    flags;
    uint32_t                semaphoreCount;
    const VkSemaphore*      pSemaphores;
    const uint64_t*         pValues;
} VkSemaphoreWaitInfo;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreWaitInfo VkSemaphoreWaitInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkSemaphoreWaitFlagBits的位掩码,用于指定信号量等待操作的附加参数。

  • semaphoreCount是要等待的信号量的数量。

  • pSemaphores是指向要等待的semaphoreCount信号量句柄数组的指针。

  • pValues是指向semaphoreCount时间线信号量值数组的指针。

有效使用
  • VUID-VkSemaphoreWaitInfo-pSemaphores-03256
    pSemaphores的所有元素必须引用使用VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType创建的信号量

有效用法(隐式)
  • VUID-VkSemaphoreWaitInfo-sType-sType
    sType必须VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO

  • VUID-VkSemaphoreWaitInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkSemaphoreWaitInfo-flags-parameter
    flags必须VkSemaphoreWaitFlagBits值的有效组合

  • VUID-VkSemaphoreWaitInfo-pSemaphores-parameter
    pSemaphores必须是指向semaphoreCount个有效VkSemaphore句柄的数组的有效指针

  • VUID-VkSemaphoreWaitInfo-pValues-parameter
    pValues必须是指向semaphoreCountuint64_t值的数组的有效指针

  • VUID-VkSemaphoreWaitInfo-semaphoreCount-arraylength
    semaphoreCount 必须 大于 0

VkSemaphoreWaitInfo::flags可以设置的位,用于指定信号量等待操作的附加参数,包括:

// Provided by VK_VERSION_1_2
typedef enum VkSemaphoreWaitFlagBits {
    VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001,
  // Provided by VK_KHR_timeline_semaphore
    VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT,
} VkSemaphoreWaitFlagBits;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreWaitFlagBits VkSemaphoreWaitFlagBitsKHR;
  • VK_SEMAPHORE_WAIT_ANY_BIT 指定信号量等待条件为 VkSemaphoreWaitInfo::pSemaphores 中的至少一个信号量已达到 VkSemaphoreWaitInfo::pValues 的相应元素指定的值。如果未设置 VK_SEMAPHORE_WAIT_ANY_BIT,则信号量等待条件为 VkSemaphoreWaitInfo::pSemaphores 中的所有信号量都已达到 VkSemaphoreWaitInfo::pValues 的相应元素指定的值。

// Provided by VK_VERSION_1_2
typedef VkFlags VkSemaphoreWaitFlags;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreWaitFlags VkSemaphoreWaitFlagsKHR;

VkSemaphoreWaitFlags 是一种位掩码类型,用于设置零个或多个 VkSemaphoreWaitFlagBits 的掩码。

要在主机上使用特定的计数器值来发出 VkSemaphoreTypeVK_SEMAPHORE_TYPE_TIMELINE 的信号量信号,请调用

// Provided by VK_VERSION_1_2
VkResult vkSignalSemaphore(
    VkDevice                                    device,
    const VkSemaphoreSignalInfo*                pSignalInfo);

或等效命令

// Provided by VK_KHR_timeline_semaphore
VkResult vkSignalSemaphoreKHR(
    VkDevice                                    device,
    const VkSemaphoreSignalInfo*                pSignalInfo);
  • device是拥有该信号量的逻辑设备。

  • pSignalInfo 是指向 VkSemaphoreSignalInfo 结构的指针,该结构包含有关信号操作的信息。

当在主机上执行 vkSignalSemaphore 时,它会定义并立即执行一个 信号量信号操作,该操作将时间线信号量设置为给定值。

第一个同步范围由主机执行模型定义,但包括在主机上执行 vkSignalSemaphore 以及它之前发生的任何事情。

第二个同步范围为空。

有效用法(隐式)
  • VUID-vkSignalSemaphore-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkSignalSemaphore-pSignalInfo-parameter
    pSignalInfo 必须 是指向有效 VkSemaphoreSignalInfo 结构的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkSemaphoreSignalInfo 结构定义如下:

// Provided by VK_VERSION_1_2
typedef struct VkSemaphoreSignalInfo {
    VkStructureType    sType;
    const void*        pNext;
    VkSemaphore        semaphore;
    uint64_t           value;
} VkSemaphoreSignalInfo;

或等效的

// Provided by VK_KHR_timeline_semaphore
typedef VkSemaphoreSignalInfo VkSemaphoreSignalInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要发出信号的信号量的句柄。

  • value 是要发出的信号的值。

有效使用
  • VUID-VkSemaphoreSignalInfo-semaphore-03257
    semaphore必须已使用 VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType 创建

  • VUID-VkSemaphoreSignalInfo-value-03258
    value 必须 大于信号量的当前值

  • VUID-VkSemaphoreSignalInfo-value-03259
    value 必须 小于任何挂起的信号量信号操作的值

  • VUID-VkSemaphoreSignalInfo-value-03260
    value 的值必须与信号量的当前值或 semaphore 上任何未完成的信号量等待或信号操作的值之间的差值不超过 maxTimelineSemaphoreValueDifference

有效用法(隐式)
  • VUID-VkSemaphoreSignalInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO

  • VUID-VkSemaphoreSignalInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkSemaphoreSignalInfo-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

导入信号量有效负载

应用程序可以使用外部信号量句柄将信号量有效负载导入到现有信号量中。导入操作的效果将是临时的或永久的,由应用程序指定。如果导入是临时的,则在提交下一个信号量等待操作后,实现必须将信号量恢复到其先前的永久状态。在执行信号量等待之前,对信号量执行后续的临时导入对此要求没有影响;对信号量提交的下一个等待必须仍然恢复其最后一个永久状态。永久有效负载导入的行为就像目标信号量被销毁,并且创建了一个具有相同句柄但导入有效负载的新信号量。由于临时或永久导入信号量有效负载会将现有有效负载与信号量分离,因此任何导入信号量有效负载的命令都将应用与 vkDestroySemaphore 应用的类似使用限制。这些导入类型中的哪一种被使用被称为导入操作的持久性。每种句柄类型都支持一种或两种持久性类型。

实现必须通过引用或复制指定的外部信号量句柄所引用的有效负载来执行导入操作,具体取决于句柄的类型。所使用的导入方法被称为句柄类型的传递。当使用具有引用传递的句柄类型时,将有效负载导入到信号量会将该信号量添加到共享该有效负载的所有信号量集中。此集合包括从中导出有效负载的信号量。对集合中的任何信号量执行的信号量发出信号和等待操作的必须行为就像集合是一个信号量一样。使用具有复制传递的句柄类型导入有效负载会在导入时创建有效负载的重复副本,但不再引用它。对复制导入的目标执行的信号量发出信号和等待操作的必须不影响任何其他信号量或有效负载。

导出操作具有与指定句柄类型的导入操作相同的传递。此外,将信号量有效负载导出到具有复制传递的句柄会对源信号量的有效负载产生与执行信号量等待操作相同的副作用。如果信号量正在使用临时导入的有效负载,则信号量的先前永久有效负载将恢复。

外部同步 允许实现修改对象的内部状态(即有效负载),而无需内部同步。但是,对于跨进程共享有效负载的信号量,满足 VkSemaphore 参数的外部同步要求(就像集合中的所有信号量都是同一对象一样)有时是不可行的。满足等待操作状态要求同样需要在进程之间进行不切实际的协调或信任级别。因此,这些约束仅适用于特定的信号量句柄,而不适用于其有效负载。对于共享有效负载的不同信号量对象,如果信号量同时传递给单独的队列提交命令,则行为将如同命令以任意顺序调用一样。如果等待操作状态要求被队列提交命令违反了共享有效负载,或者如果为已经发出信号或有挂起信号操作的共享有效负载排队了一个信号操作,则效果必须限于以下一项或多项:

  • 从导致违规的命令返回 VK_ERROR_INITIALIZATION_FAILED

  • 立即或在未来某个时间丢失发生违规的逻辑设备,导致后续命令(包括导致违规的命令)返回 VK_ERROR_DEVICE_LOST 错误。

  • 在实现相关的超时后,继续执行违规的命令或操作,如同信号量等待成功完成一样。在这种情况下,负载的状态变为未定义,并且对共享负载的信号量的未来操作将遵守相同的规则。信号量必须被销毁或其负载被导入操作替换,才能再次具有明确定义的状态。

这些规则允许进程同步对共享内存的访问,而无需彼此信任。但是,这些进程仍然必须小心,不要将共享信号量用于同步访问共享内存之外的其他用途。例如,如果进程不信任其他共享信号量负载的进程,则不应将共享信号量用作执行依赖链的一部分,该依赖链在完成时会导致对象被销毁。

当信号量使用导入的负载时,其 VkExportSemaphoreCreateInfo::handleTypes 值是在创建导出负载的信号量时指定的,而不是在创建信号量时指定的。此外,VkExternalSemaphoreProperties::exportFromImportedHandleTypes 限制了哪些句柄类型可以从这样的信号量导出,这取决于用于导入当前负载的特定句柄类型。将信号量传递给 vkAcquireNextImageKHR 等效于临时将信号量负载导入到该信号量中。

由于导入信号量的可导出句柄类型与其当前导入的负载相对应,并且 vkAcquireNextImageKHR 的行为与临时导入操作相同,其中源信号量对应用程序是不透明的,因此应用程序无法确定是否可以从处于此状态的信号量导出任何外部句柄类型。因此,应用程序必须不要尝试从使用 vkAcquireNextImageKHR 临时导入的负载的信号量导出外部句柄。

导入信号量负载时,应用程序有责任确保外部句柄满足所有有效的使用要求。但是,实现必须对外部句柄执行充分的验证,以确保该操作产生有效的信号量,该信号量在使用时不会导致程序终止、设备丢失、队列停滞或破坏其他资源(根据其导入参数允许使用,并排除违反 等待操作的有效信号量状态 规则所允许的副作用)。如果提供的外部句柄不满足这些要求,则实现必须使用错误代码 VK_ERROR_INVALID_EXTERNAL_HANDLE 来使信号量负载导入操作失败。

此外,当导入与信号量创建时对应的 VkSemaphoreType 的负载类型不兼容的信号量负载时,实现可能会使用错误代码 VK_ERROR_INVALID_EXTERNAL_HANDLE 使信号量负载导入操作失败。

由于外部信号量句柄类型 VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT 的引入早于时间线信号量,因此为了向后兼容,保留了将该类型的外部句柄中的信号量负载导入到(隐式或显式)使用 VK_SEMAPHORE_TYPE_BINARYVkSemaphoreType 创建的信号量中的支持。但是,应用程序应该更喜欢将此类句柄类型导入到使用 VK_SEMAPHORE_TYPE_TIMELINEVkSemaphoreType 创建的信号量中。

要从 Windows 句柄导入信号量负载,请调用

// Provided by VK_KHR_external_semaphore_win32
VkResult vkImportSemaphoreWin32HandleKHR(
    VkDevice                                    device,
    const VkImportSemaphoreWin32HandleInfoKHR*  pImportSemaphoreWin32HandleInfo);
  • device 是创建信号量的逻辑设备。

  • pImportSemaphoreWin32HandleInfo 是指向 VkImportSemaphoreWin32HandleInfoKHR 结构的指针,该结构指定信号量和导入参数。

从 Windows 句柄导入信号量负载不会将句柄的所有权转移到 Vulkan 实现。对于定义为 NT 句柄的句柄类型,应用程序必须在不再需要该句柄时使用 CloseHandle 系统调用释放所有权。

应用程序可以将同一信号量负载导入到 Vulkan 的多个实例中,导入到导出它的同一实例中,以及多次导入到给定的 Vulkan 实例中。

有效用法(隐式)
  • VUID-vkImportSemaphoreWin32HandleKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter
    pImportSemaphoreWin32HandleInfo 必须是指向有效 VkImportSemaphoreWin32HandleInfoKHR 结构的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

VkImportSemaphoreWin32HandleInfoKHR 结构定义如下

// Provided by VK_KHR_external_semaphore_win32
typedef struct VkImportSemaphoreWin32HandleInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkSemaphoreImportFlags                   flags;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
    HANDLE                                   handle;
    LPCWSTR                                  name;
} VkImportSemaphoreWin32HandleInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要将负载导入的信号量。

  • flags 是一个 VkSemaphoreImportFlagBits 的位掩码,指定信号量负载导入操作的其他参数。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定 handle 的类型。

  • handleNULL 或要导入的外部句柄。

  • nameNULL 或一个以 null 结尾的 UTF-16 字符串,命名要导入的底层同步原语。

handleType 支持的句柄类型为

表 6. VkImportSemaphoreWin32HandleInfoKHR 支持的句柄类型
句柄类型 转移方式 支持的持久性

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT

参考

临时,永久

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT

参考

临时,永久

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT

参考

临时,永久

有效使用
  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140
    handleType 必须VkImportSemaphoreWin32HandleInfoKHR 支持的句柄类型 表中包含的值

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466
    如果 handleType 不是 VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BITVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT,则 name 必须NULL

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467
    如果 handleNULL,则 name 必须命名一个由 handleType 指定类型的有效同步原语

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468
    如果 nameNULL,则 handle 必须是由 handleType 指定类型的有效句柄

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469
    如果 handle 不为 NULL,则 name 必须NULL

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542
    如果 handle 不是 NULL,它必须遵守 外部信号量句柄类型兼容性 中为 handleType 列出的任何要求

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543
    如果 name 不是 NULL,它必须遵守 外部信号量句柄类型兼容性 中为 handleType 列出的任何要求

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03261
    如果 handleTypeVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BITVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,则 VkSemaphoreCreateInfo::flags 字段必须与从中导出 handlename 的信号量的该字段匹配

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03262
    如果 handleTypeVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BITVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,则 VkSemaphoreTypeCreateInfo::semaphoreType 字段必须与从中导出 handlename 的信号量的该字段匹配

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-03322
    如果 flags 包含 VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,则导出 handlename 的信号量的 VkSemaphoreTypeCreateInfo::semaphoreType 字段必须不是 VK_SEMAPHORE_TYPE_TIMELINE

有效用法(隐式)
  • VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter
    flags 必须VkSemaphoreImportFlagBits 值的有效组合。

主机同步
  • semaphore 的主机访问必须进行外部同步

要从 POSIX 文件描述符导入信号量有效负载,请调用

// Provided by VK_KHR_external_semaphore_fd
VkResult vkImportSemaphoreFdKHR(
    VkDevice                                    device,
    const VkImportSemaphoreFdInfoKHR*           pImportSemaphoreFdInfo);
  • device 是创建信号量的逻辑设备。

  • pImportSemaphoreFdInfo 是一个指向 VkImportSemaphoreFdInfoKHR 结构的指针,该结构指定信号量和导入参数。

从文件描述符导入信号量有效负载会将文件描述符的所有权从应用程序转移到 Vulkan 实现。成功导入后,应用程序必须不对文件描述符执行任何操作。

应用程序可以将同一信号量负载导入到 Vulkan 的多个实例中,导入到导出它的同一实例中,以及多次导入到给定的 Vulkan 实例中。

有效使用
  • VUID-vkImportSemaphoreFdKHR-semaphore-01142
    semaphore必须没有与任何尚未在该队列上完成执行的队列命令关联。

有效用法(隐式)
  • VUID-vkImportSemaphoreFdKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter
    pImportSemaphoreFdInfo 必须是指向有效 VkImportSemaphoreFdInfoKHR 结构的有效指针。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

VkImportSemaphoreFdInfoKHR 结构定义如下:

// Provided by VK_KHR_external_semaphore_fd
typedef struct VkImportSemaphoreFdInfoKHR {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkSemaphoreImportFlags                   flags;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
    int                                      fd;
} VkImportSemaphoreFdInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要将负载导入的信号量。

  • flags 是一个 VkSemaphoreImportFlagBits 的位掩码,指定信号量负载导入操作的其他参数。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定 fd 的类型。

  • fd 是要导入的外部句柄。

handleType 支持的句柄类型为

表 7. VkImportSemaphoreFdInfoKHR 支持的句柄类型
句柄类型 转移方式 支持的持久性

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT

参考

临时,永久

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT

复制

临时

有效使用
  • VUID-VkImportSemaphoreFdInfoKHR-handleType-01143
    handleType 必须VkImportSemaphoreFdInfoKHR 支持的句柄类型 表中包含的值。

  • VUID-VkImportSemaphoreFdInfoKHR-fd-01544
    fd 必须遵守外部信号量句柄类型兼容性中为 handleType 列出的任何要求。

  • VUID-VkImportSemaphoreFdInfoKHR-handleType-03263
    如果 handleTypeVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,则 VkSemaphoreCreateInfo::flags 字段必须与导出 fd 的信号量的字段匹配。

  • VUID-VkImportSemaphoreFdInfoKHR-handleType-07307
    如果 handleType 引用具有复制有效负载传输语义的句柄类型,则 flags 必须包含 VK_SEMAPHORE_IMPORT_TEMPORARY_BIT

  • VUID-VkImportSemaphoreFdInfoKHR-handleType-03264
    如果 handleTypeVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,则 VkSemaphoreTypeCreateInfo::semaphoreType 字段必须与导出 fd 的信号量的字段匹配。

  • VUID-VkImportSemaphoreFdInfoKHR-flags-03323
    如果 flags 包含 VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,则导出 fd 的信号量的 VkSemaphoreTypeCreateInfo::semaphoreType 字段必须不是 VK_SEMAPHORE_TYPE_TIMELINE

如果 handleTypeVK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,则 fd 的特殊值 -1 将被视为引用已发出信号的对象的有效同步文件描述符。导入操作将成功,并且 VkSemaphore 将具有临时导入的有效负载,就像已提供有效的文件描述符一样。

导入无效同步文件描述符的这种特殊行为可以更容易地与其他系统 API 互操作,这些 API 使用无效同步文件描述符表示已完成且无需等待的工作的约定。这与实现返回一个 -1 文件描述符的情况是一致的,这种情况发生在从已发出信号的 VkSemaphore 导出 VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT 时。

有效用法(隐式)
  • VUID-VkImportSemaphoreFdInfoKHR-sType-sType
    sType必须VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR

  • VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkImportSemaphoreFdInfoKHR-flags-parameter
    flags 必须VkSemaphoreImportFlagBits 值的有效组合。

  • VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter
    handleType 必须是有效的 VkExternalSemaphoreHandleTypeFlagBits

主机同步
  • semaphore 的主机访问必须进行外部同步

要从 Zircon 事件句柄导入信号量有效负载,请调用

// Provided by VK_FUCHSIA_external_semaphore
VkResult vkImportSemaphoreZirconHandleFUCHSIA(
    VkDevice                                    device,
    const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo);

从 Zircon 事件句柄导入信号量有效负载会将句柄的所有权从应用程序转移到 Vulkan 实现。成功导入后,应用程序必须不对该句柄执行任何操作。

应用程序可以将同一信号量负载导入到 Vulkan 的多个实例中,导入到导出它的同一实例中,以及多次导入到给定的 Vulkan 实例中。

有效使用
  • VUID-vkImportSemaphoreZirconHandleFUCHSIA-semaphore-04764
    semaphore必须没有与任何尚未在该队列上完成执行的队列命令关联。

有效用法(隐式)
  • VUID-vkImportSemaphoreZirconHandleFUCHSIA-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkImportSemaphoreZirconHandleFUCHSIA-pImportSemaphoreZirconHandleInfo-parameter
    pImportSemaphoreZirconHandleInfo必须是指向有效 VkImportSemaphoreZirconHandleInfoFUCHSIA 结构的有效指针。

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_INVALID_EXTERNAL_HANDLE

VkImportSemaphoreZirconHandleInfoFUCHSIA 结构定义如下:

// Provided by VK_FUCHSIA_external_semaphore
typedef struct VkImportSemaphoreZirconHandleInfoFUCHSIA {
    VkStructureType                          sType;
    const void*                              pNext;
    VkSemaphore                              semaphore;
    VkSemaphoreImportFlags                   flags;
    VkExternalSemaphoreHandleTypeFlagBits    handleType;
    zx_handle_t                              zirconHandle;
} VkImportSemaphoreZirconHandleInfoFUCHSIA;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • semaphore 是要将负载导入的信号量。

  • flags 是一个 VkSemaphoreImportFlagBits 的位掩码,指定信号量负载导入操作的其他参数。

  • handleType 是一个 VkExternalSemaphoreHandleTypeFlagBits 值,指定 zirconHandle 的类型。

  • zirconHandle 是要导入的外部句柄。

handleType 支持的句柄类型为

表 8. VkImportSemaphoreZirconHandleInfoFUCHSIA 支持的句柄类型
句柄类型 转移方式 支持的持久性

VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_ZIRCON_EVENT_BIT_FUCHSIA

参考

临时,永久

有效使用
  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-handleType-04765
    handleType 必须VkImportSemaphoreZirconHandleInfoFUCHSIA 支持的句柄类型 表中包含的值。

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04766
    zirconHandle 必须遵守外部信号量句柄类型兼容性中为 handleType 列出的任何要求。

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-zirconHandle-04767
    zirconHandle 必须 具有 ZX_RIGHTS_BASICZX_RIGHTS_SIGNAL 权限

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-semaphoreType-04768
    VkSemaphoreTypeCreateInfo::semaphoreType 字段必须不是 VK_SEMAPHORE_TYPE_TIMELINE

有效用法(隐式)
  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-pNext-pNext
    pNext 必须NULL

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-semaphore-parameter
    semaphore 必须是有效的 VkSemaphore 句柄

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-flags-parameter
    flags 必须VkSemaphoreImportFlagBits 值的有效组合。

  • VUID-VkImportSemaphoreZirconHandleInfoFUCHSIA-handleType-parameter
    handleType 必须是有效的 VkExternalSemaphoreHandleTypeFlagBits

主机同步
  • semaphore 的主机访问必须进行外部同步

可在以下项中设置的位

指定信号量导入操作的附加参数为

// Provided by VK_VERSION_1_1
typedef enum VkSemaphoreImportFlagBits {
    VK_SEMAPHORE_IMPORT_TEMPORARY_BIT = 0x00000001,
  // Provided by VK_KHR_external_semaphore
    VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,
} VkSemaphoreImportFlagBits;

或等效的

// Provided by VK_KHR_external_semaphore
typedef VkSemaphoreImportFlagBits VkSemaphoreImportFlagBitsKHR;

这些位具有以下含义

  • VK_SEMAPHORE_IMPORT_TEMPORARY_BIT 指定信号量有效载荷将仅临时导入,如导入信号量有效载荷中所述,无论 handleType 的持久性如何。

// Provided by VK_VERSION_1_1
typedef VkFlags VkSemaphoreImportFlags;

或等效的

// Provided by VK_KHR_external_semaphore
typedef VkSemaphoreImportFlags VkSemaphoreImportFlagsKHR;

VkSemaphoreImportFlags 是一种位掩码类型,用于设置零个或多个 VkSemaphoreImportFlagBits 的掩码。

事件

事件是一种同步原语,可以用于在提交到同一队列的命令之间,或在主机和队列之间插入细粒度的依赖关系。事件必须不用于在提交到不同队列的命令之间插入依赖关系。事件有两种状态 - 已发出信号和未发出信号。应用程序可以在主机或设备上发出信号或取消发出事件信号。可以使设备在执行进一步操作之前等待事件变为已发出信号。没有命令可以等待主机上事件变为已发出信号,但是可以查询事件的当前状态。

事件由 VkEvent 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent)

要创建事件,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateEvent(
    VkDevice                                    device,
    const VkEventCreateInfo*                    pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkEvent*                                    pEvent);
  • device 是创建事件的逻辑设备。

  • pCreateInfo 是指向 VkEventCreateInfo 结构的指针,其中包含有关如何创建事件的信息。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

  • pEvent 是指向返回的结果事件对象的句柄的指针。

创建时,事件对象处于未发出信号的状态。

有效使用
有效用法(隐式)
  • VUID-vkCreateEvent-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkCreateEvent-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkEventCreateInfo 结构的有效指针

  • VUID-vkCreateEvent-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateEvent-pEvent-parameter
    pEvent 必须是指向 VkEvent 句柄的有效指针

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkEventCreateInfo 结构定义如下

// Provided by VK_VERSION_1_0
typedef struct VkEventCreateInfo {
    VkStructureType       sType;
    const void*           pNext;
    VkEventCreateFlags    flags;
} VkEventCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkEventCreateFlagBits 的位掩码,定义了额外的创建参数。

有效使用
  • VUID-VkEventCreateInfo-pNext-06790
    如果 pNext 链包含 VkExportMetalObjectCreateInfoEXT 结构,则其 exportObjectType 成员必须VK_EXPORT_METAL_OBJECT_TYPE_METAL_SHARED_EVENT_BIT_EXT

有效用法(隐式)
// Provided by VK_VERSION_1_0
typedef enum VkEventCreateFlagBits {
  // Provided by VK_VERSION_1_3
    VK_EVENT_CREATE_DEVICE_ONLY_BIT = 0x00000001,
  // Provided by VK_KHR_synchronization2
    VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT,
} VkEventCreateFlagBits;
  • VK_EVENT_CREATE_DEVICE_ONLY_BIT 指定主机事件命令不会与此事件一起使用。

// Provided by VK_VERSION_1_0
typedef VkFlags VkEventCreateFlags;

VkEventCreateFlags 是一种位掩码类型,用于设置 VkEventCreateFlagBits 的掩码。

要销毁事件,请调用

// Provided by VK_VERSION_1_0
void vkDestroyEvent(
    VkDevice                                    device,
    VkEvent                                     event,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁事件的逻辑设备。

  • event 是要销毁的事件的句柄。

  • pAllocator 控制主机内存分配,具体描述请参考内存分配章节。

有效使用
  • VUID-vkDestroyEvent-event-01145
    所有引用 event 的已提交命令必须已完成执行

  • VUID-vkDestroyEvent-event-01146
    如果在创建 event 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyEvent-event-01147
    如果在创建 event 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyEvent-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkDestroyEvent-event-parameter
    如果 event 不是 VK_NULL_HANDLE,则 event 必须是有效的 VkEvent 句柄

  • VUID-vkDestroyEvent-pAllocator-parameter
    如果 pAllocator 不为 NULL,则 pAllocator 必须 是一个指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroyEvent-event-parent
    如果 event 是有效句柄,则它必须已从 device 创建、分配或检索

主机同步
  • event 的主机访问必须进行外部同步

要从主机查询事件的状态,请调用

// Provided by VK_VERSION_1_0
VkResult vkGetEventStatus(
    VkDevice                                    device,
    VkEvent                                     event);
  • device 是拥有事件的逻辑设备。

  • event 是要查询的事件的句柄。

成功后,vkGetEventStatus 返回事件对象的状态,并带有以下返回码

表 9. 事件对象状态码
状态 含义

VK_EVENT_SET

event 指定的事件已发出信号。

VK_EVENT_RESET

event 指定的事件被设置为未信号状态。

如果 vkCmdSetEventvkCmdResetEvent 命令在一个处于挂起状态的命令缓冲区中,则此命令返回的值可能会立即过时。

事件的状态可以由主机更新。事件的状态会立即更改,并且随后对 vkGetEventStatus 的调用将返回新的状态。如果事件已处于请求的状态,则将其更新为相同的状态无效。

有效使用
  • VUID-vkGetEventStatus-event-03940
    event必须不是使用 VK_EVENT_CREATE_DEVICE_ONLY_BIT 创建的

有效用法(隐式)
  • VUID-vkGetEventStatus-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetEventStatus-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkGetEventStatus-event-parent
    event必须已从 device 创建、分配或检索

返回值
成功
  • VK_EVENT_SET

  • VK_EVENT_RESET

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

要将事件的状态从主机设置为信号状态,请调用

// Provided by VK_VERSION_1_0
VkResult vkSetEvent(
    VkDevice                                    device,
    VkEvent                                     event);
  • device 是拥有事件的逻辑设备。

  • event 是要设置的事件。

当在主机上执行 vkSetEvent 时,它会定义一个事件信号操作,该操作将事件设置为信号状态。

如果 event 在执行 vkSetEvent 时已处于信号状态,则 vkSetEvent 不会产生任何影响,并且不会发生事件信号操作。

如果命令缓冲区正在等待主机发出事件信号,则应用程序必须在提交命令缓冲区之前发出事件信号,如队列前进部分所述。

有效使用
  • VUID-vkSetEvent-event-03941
    event必须不是使用 VK_EVENT_CREATE_DEVICE_ONLY_BIT 创建的

  • VUID-vkSetEvent-event-09543
    event必须不能被处于挂起状态的命令缓冲区等待

有效用法(隐式)
  • VUID-vkSetEvent-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkSetEvent-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkSetEvent-event-parent
    event必须已从 device 创建、分配或检索

主机同步
  • event 的主机访问必须进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

要将事件的状态从主机设置为未信号状态,请调用

// Provided by VK_VERSION_1_0
VkResult vkResetEvent(
    VkDevice                                    device,
    VkEvent                                     event);
  • device 是拥有事件的逻辑设备。

  • event是要重置的事件。

当在主机上执行 vkResetEvent 时,它会定义一个事件未信号操作,该操作将事件重置为未信号状态。

如果 event 在执行 vkResetEvent 时已处于未信号状态,则 vkResetEvent 不会产生任何影响,并且不会发生事件未信号操作。

有效使用
  • VUID-vkResetEvent-event-03821
    vkResetEvent 的执行与任何在其 pEvents 参数中包含 eventvkCmdWaitEvents 的执行之间必须存在执行依赖关系

  • VUID-vkResetEvent-event-03822
    vkResetEvent 的执行与任何在其 pEvents 参数中包含 eventvkCmdWaitEvents2 的执行之间必须存在执行依赖关系

  • VUID-vkResetEvent-event-03823
    event必须不是使用 VK_EVENT_CREATE_DEVICE_ONLY_BIT 创建的

有效用法(隐式)
  • VUID-vkResetEvent-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkResetEvent-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkResetEvent-event-parent
    event必须已从 device 创建、分配或检索

主机同步
  • event 的主机访问必须进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_DEVICE_MEMORY

事件的状态可以通过插入到命令缓冲区中的命令在设备上更新。

要从设备发出事件信号,请调用

// Provided by VK_VERSION_1_3
void vkCmdSetEvent2(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    const VkDependencyInfo*                     pDependencyInfo);

或等效命令

// Provided by VK_KHR_synchronization2
void vkCmdSetEvent2KHR(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    const VkDependencyInfo*                     pDependencyInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • event 是将被信号化的事件。

  • pDependencyInfo 是指向 VkDependencyInfo 结构的指针,该结构定义此操作的第一个作用域。

vkCmdSetEvent2 提交到队列时,它会定义 pDependencyInfo 定义的内存依赖关系的第一部分,以及将事件设置为信号状态的事件信号操作。在事件信号操作和按提交顺序较早发生的命令之间定义了内存依赖关系。

第一个同步作用域访问作用域pDependencyInfo定义的所有内存依赖关系的并集定义,并且应用于所有在提交顺序中较早发生的操作。队列族所有权转移pDependencyInfo 定义的图像布局转换也包含在第一个作用域中。

第二个同步作用域仅包括事件信号操作,以及pDependencyInfo定义的任何队列族所有权转移图像布局转换

未来的 vkCmdWaitEvents2 命令依赖于 pDependencyInfo 中每个元素的所有值与用于信号化相应事件的值完全匹配。vkCmdWaitEvents 必须不能用于等待 vkCmdSetEvent2 定义的信号操作的结果。

vkCmdSetEvent 相比,vkCmdSetEvent2 提供的额外信息允许实现更有效地调度满足请求依赖关系所需的操作。使用 vkCmdSetEvent,直到记录 vkCmdWaitEvents 时才知道完整的依赖关系信息,这迫使实现程序在该点而不是之前插入所需的操作。

如果 event 在设备上执行 vkCmdSetEvent2 时已处于信号状态,则 vkCmdSetEvent2 不会产生任何影响,不会发生事件信号操作,也不会生成依赖关系。

有效使用
  • VUID-vkCmdSetEvent2-synchronization2-03824
    必须启用synchronization2 功能

  • VUID-vkCmdSetEvent2-dependencyFlags-03825
    pDependencyInfodependencyFlags 成员必须0

  • VUID-vkCmdSetEvent2-srcStageMask-09391
    pDependencyInfopMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员中任何元素的 srcStageMask 成员必须不包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-vkCmdSetEvent2-dstStageMask-09392
    pDependencyInfopMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员中任何元素的 dstStageMask 成员必须不包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-vkCmdSetEvent2-commandBuffer-03826
    commandBuffer 的当前设备掩码必须只包含一个物理设备。

  • VUID-vkCmdSetEvent2-srcStageMask-03827
    pDependencyInfopMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员中任何元素的 srcStageMask 成员必须仅包含用于创建 commandBuffer 分配的命令池的队列族有效的管线阶段。

  • VUID-vkCmdSetEvent2-dstStageMask-03828
    pDependencyInfopMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员中任何元素的 dstStageMask 成员必须仅包含用于创建 commandBuffer 分配的命令池的队列族有效的管线阶段。

有效用法(隐式)
  • VUID-vkCmdSetEvent2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdSetEvent2-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkCmdSetEvent2-pDependencyInfo-parameter
    pDependencyInfo 必须是指向有效的 VkDependencyInfo 结构的有效指针。

  • VUID-vkCmdSetEvent2-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdSetEvent2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdSetEvent2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdSetEvent2-commonparent
    commandBufferevent必须是从同一个 VkDevice 创建、分配或检索的。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

外部

两者

图形
计算
解码
编码

同步

VkDependencyInfo 结构定义如下

// Provided by VK_VERSION_1_3
typedef struct VkDependencyInfo {
    VkStructureType                  sType;
    const void*                      pNext;
    VkDependencyFlags                dependencyFlags;
    uint32_t                         memoryBarrierCount;
    const VkMemoryBarrier2*          pMemoryBarriers;
    uint32_t                         bufferMemoryBarrierCount;
    const VkBufferMemoryBarrier2*    pBufferMemoryBarriers;
    uint32_t                         imageMemoryBarrierCount;
    const VkImageMemoryBarrier2*     pImageMemoryBarriers;
} VkDependencyInfo;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkDependencyInfo VkDependencyInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • dependencyFlagsVkDependencyFlagBits 的位掩码,用于指定如何形成执行和内存依赖项。

  • memoryBarrierCountpMemoryBarriers 数组的长度。

  • pMemoryBarriers 是指向 VkMemoryBarrier2 结构数组的指针,这些结构定义了任何内存访问之间的内存依赖项。

  • bufferMemoryBarrierCountpBufferMemoryBarriers 数组的长度。

  • pBufferMemoryBarriers 是指向 VkBufferMemoryBarrier2 结构数组的指针,这些结构定义了缓冲区范围之间的内存依赖项。

  • imageMemoryBarrierCountpImageMemoryBarriers 数组的长度。

  • pImageMemoryBarriers 是指向 VkImageMemoryBarrier2 结构数组的指针,这些结构定义了图像子资源之间的内存依赖项。

pMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 的每个成员都定义了一个单独的内存依赖项

有效用法(隐式)
  • VUID-VkDependencyInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEPENDENCY_INFO

  • VUID-VkDependencyInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkDependencyInfo-dependencyFlags-parameter
    dependencyFlags 必须VkDependencyFlagBits 值的有效组合。

  • VUID-VkDependencyInfo-pMemoryBarriers-parameter
    如果 memoryBarrierCount 不为 0,则 pMemoryBarriers 必须是指向 memoryBarrierCount 个有效的 VkMemoryBarrier2 结构数组的有效指针。

  • VUID-VkDependencyInfo-pBufferMemoryBarriers-parameter
    如果 bufferMemoryBarrierCount 不为 0,则 pBufferMemoryBarriers 必须是指向 bufferMemoryBarrierCount 个有效的 VkBufferMemoryBarrier2 结构数组的有效指针。

  • VUID-VkDependencyInfo-pImageMemoryBarriers-parameter
    如果 imageMemoryBarrierCount 不为 0,则 pImageMemoryBarriers 必须是指向 imageMemoryBarrierCount 个有效的 VkImageMemoryBarrier2 结构数组的有效指针。

要将事件状态从设备设置为已发出信号,请调用

// Provided by VK_VERSION_1_0
void vkCmdSetEvent(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags                        stageMask);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • event 是将被信号化的事件。

  • stageMask 指定用于确定第一个同步范围源阶段掩码

vkCmdSetEvent 的行为与 vkCmdSetEvent2 相同,但它不定义访问范围,并且必须仅与 vkCmdWaitEvents 一起使用,而不是与 vkCmdWaitEvents2 一起使用。

有效使用
  • VUID-vkCmdSetEvent-stageMask-04090
    如果未启用geometryShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdSetEvent-stageMask-04091
    如果未启用tessellationShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdSetEvent-stageMask-04092
    如果未启用conditionalRendering特性,则stageMask必须不包含VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdSetEvent-stageMask-04093
    如果未启用fragmentDensityMap特性,则stageMask必须不包含VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdSetEvent-stageMask-04094
    如果未启用transformFeedback特性,则stageMask必须不包含VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdSetEvent-stageMask-04095
    如果未启用meshShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdSetEvent-stageMask-04096
    如果未启用taskShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdSetEvent-stageMask-07318
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则stageMask必须不包含VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdSetEvent-stageMask-03937
    如果未启用synchronization2特性,则stageMask必须不为0

  • VUID-vkCmdSetEvent-stageMask-07949
    如果既未启用VK_NV_ray_tracing扩展,也未启用rayTracingPipeline特性,则stageMask必须不包含VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdSetEvent-stageMask-06457
    stageMask中包含的任何管线阶段必须由用于创建commandBuffer分配的VkCommandPoolVkCommandPoolCreateInfo结构的queueFamilyIndex成员指定的队列族的功能所支持,如受支持的管线阶段表中所指定。

  • VUID-vkCmdSetEvent-stageMask-01149
    stageMask必须不包含VK_PIPELINE_STAGE_HOST_BIT

  • VUID-vkCmdSetEvent-commandBuffer-01152
    commandBuffer 的当前设备掩码必须只包含一个物理设备。

有效用法(隐式)
  • VUID-vkCmdSetEvent-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdSetEvent-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkCmdSetEvent-stageMask-parameter
    stageMask必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdSetEvent-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdSetEvent-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdSetEvent-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdSetEvent-commonparent
    commandBufferevent必须是从同一个 VkDevice 创建、分配或检索的。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

外部

两者

图形
计算
解码
编码

同步

要从设备取消事件的信号,请调用

// Provided by VK_VERSION_1_3
void vkCmdResetEvent2(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags2                       stageMask);

或等效命令

// Provided by VK_KHR_synchronization2
void vkCmdResetEvent2KHR(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags2                       stageMask);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • event是将被取消信号的事件。

  • stageMaskVkPipelineStageFlags2掩码,用于确定第一个同步范围

vkCmdResetEvent2提交到队列时,它定义了对之前提交的命令的执行依赖关系,并定义了一个事件取消信号操作,该操作将事件重置为未信号状态。

第一个同步范围包括在提交顺序中较早发生的所有命令。同步范围被限制为stageMask的操作或逻辑上早于stageMask的阶段。

第二个同步范围仅包括事件取消信号操作。

如果当vkCmdResetEvent2在设备上执行时,event已经处于未信号状态,则此命令不起作用,不发生事件取消信号操作,也不会生成执行依赖关系。

有效使用
  • VUID-vkCmdResetEvent2-stageMask-03929
    如果未启用geometryShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-vkCmdResetEvent2-stageMask-03930
    如果未启用tessellationShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdResetEvent2-stageMask-03931
    如果未启用conditionalRendering特性,则stageMask必须不包含VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdResetEvent2-stageMask-03932
    如果未启用 fragmentDensityMap 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdResetEvent2-stageMask-03933
    如果未启用 transformFeedback 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdResetEvent2-stageMask-03934
    如果未启用 meshShader 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-vkCmdResetEvent2-stageMask-03935
    如果未启用 taskShader 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-vkCmdResetEvent2-stageMask-07316
    如果 shadingRateImageattachmentFragmentShadingRate 功能均未启用,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdResetEvent2-stageMask-04957
    如果未启用 subpassShading 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-vkCmdResetEvent2-stageMask-04995
    如果未启用 invocationMask 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-vkCmdResetEvent2-stageMask-07946
    如果未启用 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能,则 stageMask 必须 不包含 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdResetEvent2-synchronization2-03829
    必须启用synchronization2 功能

  • VUID-vkCmdResetEvent2-stageMask-03830
    stageMask 必须 不包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-vkCmdResetEvent2-event-03831
    vkCmdResetEvent2 的执行和任何在其 pEvents 参数中包含 eventvkCmdWaitEvents 的执行之间必须存在执行依赖关系

  • VUID-vkCmdResetEvent2-event-03832
    vkCmdResetEvent2 的执行和任何在其 pEvents 参数中包含 eventvkCmdWaitEvents2 的执行之间必须存在执行依赖关系

  • VUID-vkCmdResetEvent2-commandBuffer-03833
    commandBuffer 当前的设备掩码必须只包含一个物理设备

有效用法(隐式)
  • VUID-vkCmdResetEvent2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdResetEvent2-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkCmdResetEvent2-stageMask-parameter
    stageMask 必须VkPipelineStageFlagBits2 值的有效组合

  • VUID-vkCmdResetEvent2-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdResetEvent2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdResetEvent2-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdResetEvent2-commonparent
    commandBufferevent必须是从同一个 VkDevice 创建、分配或检索的。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

外部

两者

图形
计算
解码
编码

同步

要将事件的状态从设备设置为未发出信号,请调用

// Provided by VK_VERSION_1_0
void vkCmdResetEvent(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags                        stageMask);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • event是将被取消信号的事件。

  • stageMask 是一个 VkPipelineStageFlagBits 的位掩码,指定用于确定 event 何时未发出信号的源阶段掩码

vkCmdResetEvent 的行为与 vkCmdResetEvent2 完全相同。

有效使用
  • VUID-vkCmdResetEvent-stageMask-04090
    如果未启用geometryShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdResetEvent-stageMask-04091
    如果未启用tessellationShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdResetEvent-stageMask-04092
    如果未启用conditionalRendering特性,则stageMask必须不包含VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdResetEvent-stageMask-04093
    如果未启用fragmentDensityMap特性,则stageMask必须不包含VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdResetEvent-stageMask-04094
    如果未启用transformFeedback特性,则stageMask必须不包含VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdResetEvent-stageMask-04095
    如果未启用meshShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdResetEvent-stageMask-04096
    如果未启用taskShader特性,则stageMask必须不包含VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdResetEvent-stageMask-07318
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则stageMask必须不包含VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdResetEvent-stageMask-03937
    如果未启用synchronization2特性,则stageMask必须不为0

  • VUID-vkCmdResetEvent-stageMask-07949
    如果既未启用VK_NV_ray_tracing扩展,也未启用rayTracingPipeline特性,则stageMask必须不包含VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdResetEvent-stageMask-06458
    stageMask中包含的任何管线阶段必须由用于创建commandBuffer分配的VkCommandPoolVkCommandPoolCreateInfo结构的queueFamilyIndex成员指定的队列族的功能所支持,如受支持的管线阶段表中所指定。

  • VUID-vkCmdResetEvent-stageMask-01153
    stageMask必须不包含VK_PIPELINE_STAGE_HOST_BIT

  • VUID-vkCmdResetEvent-event-03834
    vkCmdResetEvent 的执行和任何在其 pEvents 参数中包含 eventvkCmdWaitEvents 的执行之间必须存在执行依赖关系

  • VUID-vkCmdResetEvent-event-03835
    vkCmdResetEvent 的执行和任何在其 pEvents 参数中包含 eventvkCmdWaitEvents2 的执行之间必须存在执行依赖关系

  • VUID-vkCmdResetEvent-commandBuffer-01157
    commandBuffer 当前的设备掩码必须只包含一个物理设备

有效用法(隐式)
  • VUID-vkCmdResetEvent-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdResetEvent-event-parameter
    event必须是有效的 VkEvent 句柄

  • VUID-vkCmdResetEvent-stageMask-parameter
    stageMask必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdResetEvent-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdResetEvent-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdResetEvent-renderpass
    此命令必须仅在渲染通道实例之外调用。

  • VUID-vkCmdResetEvent-commonparent
    commandBufferevent必须是从同一个 VkDevice 创建、分配或检索的。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

外部

两者

图形
计算
解码
编码

同步

要等待一个或多个事件在设备上进入已触发状态,请调用

// Provided by VK_VERSION_1_3
void vkCmdWaitEvents2(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    eventCount,
    const VkEvent*                              pEvents,
    const VkDependencyInfo*                     pDependencyInfos);

或等效命令

// Provided by VK_KHR_synchronization2
void vkCmdWaitEvents2KHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    eventCount,
    const VkEvent*                              pEvents,
    const VkDependencyInfo*                     pDependencyInfos);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • eventCountpEvents 数组的长度。

  • pEvents 是指向一个 eventCount 个事件的数组的指针,这些事件将被等待。

  • pDependencyInfos 是指向一个 eventCountVkDependencyInfo 结构的数组的指针,定义了第二个同步范围

vkCmdWaitEvents2 被提交到队列时,它会根据 pDependencyInfos 的元素和 pEvents 的每个对应元素插入内存依赖关系。vkCmdWaitEvents2 **必须** 不用于等待发生在其他队列上的事件触发操作,或由 vkCmdSetEvent 执行的触发操作。

pDependencyInfos 的任何元素 i 定义的每个内存依赖关系的第一个同步范围访问范围,应用于在提交顺序中早于 pEvents 的元素 i 上的最后一个事件触发操作的操作。

只有在以下情况下,才会包含索引为 i 的事件的触发操作

  • 该事件是由 vkCmdSetEvent2 命令触发的,该命令在提交顺序中较早发生,并且 dependencyInfo 参数与 pDependencyInfos 中索引为 i 的元素完全相同;或者

  • 该事件是在没有 VK_EVENT_CREATE_DEVICE_ONLY_BIT 的情况下创建的,并且 pDependencyInfos 中索引为 i 的元素定义的第一个同步范围仅包括主机操作 (VK_PIPELINE_STAGE_2_HOST_BIT)。

pDependencyInfos 的任何元素 i 定义的每个内存依赖关系的第二个同步范围访问范围,应用于在提交顺序中晚于 vkCmdWaitEvents2 的操作。

vkCmdWaitEvents2vkCmdSetEvent2 一起使用,以定义两组操作命令之间的内存依赖关系,大致与管道屏障的方式相同,但分为两个命令,以便两者之间进行的工作**可能**不受阻碍地执行。

应用程序在使用事件时应小心避免竞争条件。vkCmdSetEvent2vkCmdResetEvent2vkCmdResetEventvkCmdSetEvent 之间没有直接的排序保证。需要另一个执行依赖关系(例如,带有 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT 的管道屏障或信号量)来防止此类竞争条件。

有效使用
  • VUID-vkCmdWaitEvents2-synchronization2-03836
    必须启用synchronization2 功能

  • VUID-vkCmdWaitEvents2-pEvents-03837
    pEvents 的成员 **必须** 未被 vkCmdSetEvent 触发。

  • VUID-vkCmdWaitEvents2-pEvents-03838
    对于 pEvents 的任何元素 i,如果该事件由 vkCmdSetEvent2 触发,则该命令的 dependencyInfo 参数 **必须** 与 pDependencyInfos 的第 i 个元素完全相同。

  • VUID-vkCmdWaitEvents2-pEvents-03839
    对于 pEvents 的任何元素 i,如果该事件由 vkSetEvent 触发,则 pDependencyInfos 的第 i 个元素中的屏障 **必须** 在其第一个 同步范围 中仅包括主机操作。

  • VUID-vkCmdWaitEvents2-pEvents-03840
    对于 pEvents 的任何元素 i,如果 pDependencyInfos 的第 i 个元素中的屏障仅包括主机操作,则 pEvents 的第 i 个元素 **必须** 在执行 vkCmdWaitEvents2 之前被触发。

  • VUID-vkCmdWaitEvents2-pEvents-03841
    对于 pEvents 的任何元素 i,如果 pDependencyInfos 的第 i 个元素中的屏障不包括主机操作,则 pEvents 的第 i 个元素 **必须** 由相应的 vkCmdSetEvent2 触发,该命令在 提交顺序 中较早发生。

  • VUID-vkCmdWaitEvents2-srcStageMask-03842
    pDependencyInfospMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员的任何元素的 srcStageMask 成员 **必须** 仅包含用于创建分配 commandBuffer 的命令池的队列系列有效的管道阶段。

  • VUID-vkCmdWaitEvents2-dstStageMask-03843
    pDependencyInfospMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员的任何元素的 dstStageMask 成员 **必须** 仅包含用于创建分配 commandBuffer 的命令池的队列系列有效的管道阶段。

  • VUID-vkCmdWaitEvents2-dependencyFlags-10394
    pDependencyInfo 的任何元素的 dependencyFlags 成员 **必须** 为 0

  • VUID-vkCmdWaitEvents2-dependencyFlags-03844
    如果在渲染过程实例内部调用 vkCmdWaitEvents2,则 pDependencyInfospMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 成员的任何元素的 srcStageMask 成员 **必须** 不包括 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-vkCmdWaitEvents2-commandBuffer-03846
    commandBuffer 当前的设备掩码必须只包含一个物理设备

  • VUID-vkCmdWaitEvents2-maintenance8-10205
    如果未启用 maintenance8 功能,则 pDependencyInfos 的任何元素的 dependencyFlags 成员 **必须** 不包括 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR

有效用法(隐式)
  • VUID-vkCmdWaitEvents2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWaitEvents2-pEvents-parameter
    pEvents 必须是指向 eventCount 个有效 VkEvent 句柄数组的有效指针

  • VUID-vkCmdWaitEvents2-pDependencyInfos-parameter
    pDependencyInfos 必须是指向 eventCount 个有效 VkDependencyInfo 结构体数组的有效指针

  • VUID-vkCmdWaitEvents2-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdWaitEvents2-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdWaitEvents2-eventCount-arraylength
    eventCount 必须大于 0

  • VUID-vkCmdWaitEvents2-commonparent
    commandBufferpEvents 的元素都必须是从同一个 VkDevice 创建、分配或检索的

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

两者

两者

图形
计算
解码
编码

同步

要等待一个或多个事件在设备上进入已触发状态,请调用

// Provided by VK_VERSION_1_0
void vkCmdWaitEvents(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    eventCount,
    const VkEvent*                              pEvents,
    VkPipelineStageFlags                        srcStageMask,
    VkPipelineStageFlags                        dstStageMask,
    uint32_t                                    memoryBarrierCount,
    const VkMemoryBarrier*                      pMemoryBarriers,
    uint32_t                                    bufferMemoryBarrierCount,
    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
    uint32_t                                    imageMemoryBarrierCount,
    const VkImageMemoryBarrier*                 pImageMemoryBarriers);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • eventCountpEvents 数组的长度。

  • pEvents 是指向要等待的事件对象句柄数组的指针。

  • srcStageMask 是一个 VkPipelineStageFlagBits 的位掩码,指定源阶段掩码

  • dstStageMask 是一个 VkPipelineStageFlagBits 的位掩码,指定目标阶段掩码

  • memoryBarrierCountpMemoryBarriers 数组的长度。

  • pMemoryBarriers 是指向 VkMemoryBarrier 结构体数组的指针。

  • bufferMemoryBarrierCountpBufferMemoryBarriers 数组的长度。

  • pBufferMemoryBarriers 是指向 VkBufferMemoryBarrier 结构体数组的指针。

  • imageMemoryBarrierCountpImageMemoryBarriers 数组的长度。

  • pImageMemoryBarriers 是指向 VkImageMemoryBarrier 结构体数组的指针。

vkCmdWaitEvents 在很大程度上与 vkCmdWaitEvents2 相似,但只能等待由 vkCmdSetEvent 定义的信号操作。由于 vkCmdSetEvent 没有定义任何访问范围,vkCmdWaitEvents 除了自己的访问范围外,还为每个事件信号操作定义了第一个访问范围。

由于 vkCmdSetEvent 除了阶段掩码之外没有任何依赖信息,因此实现没有与 vkCmdSetEvent2vkCmdWaitEvents2 相同的机会来提前执行可用性和可见性操作图像布局转换

vkCmdWaitEvents 提交到队列时,它会在同一队列或主机上的先前事件信号操作与后续命令之间定义一个内存依赖关系。不能使用 vkCmdWaitEvents 来等待发生在其他队列上的事件信号操作。

第一个同步范围仅包括对 pEvents 成员进行操作的事件信号操作,以及发生在事件信号操作之前的操作。如果它们的 stageMask 参数中的逻辑上最新的管线阶段逻辑上早于或等于 srcStageMask 中的逻辑上最新的管线阶段,则由 vkCmdSetEvent 执行的在提交顺序中较早发生的事件信号操作包含在第一个同步范围中。如果 VK_PIPELINE_STAGE_HOST_BIT 包含在 srcStageMask 中,则只有由 vkSetEvent 执行的事件信号操作才包含在第一个同步范围中。

第二个同步范围包括在提交顺序中稍后发生的所有命令。第二个同步范围仅限于由 dstStageMask 指定的目标阶段掩码确定的管线阶段的操作。

第一个访问范围仅限于由 srcStageMask 指定的源阶段掩码确定的管线阶段中的访问。其中,第一个访问范围仅包括由 pMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 数组的元素定义的第一个访问范围,它们每个都定义了一组内存屏障。如果未指定任何内存屏障,则第一个访问范围不包含任何访问。

第二个访问范围仅限于由 dstStageMask 指定的目标阶段掩码确定的管线阶段中的访问。其中,第二个访问范围仅包括由 pMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 数组的元素定义的第二个访问范围,它们每个都定义了一组内存屏障。如果未指定任何内存屏障,则第二个访问范围不包含任何访问。

有效使用
  • VUID-vkCmdWaitEvents-srcStageMask-04090
    如果未启用geometryShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWaitEvents-srcStageMask-04091
    如果未启用tessellationShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWaitEvents-srcStageMask-04092
    如果未启用conditionalRendering 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWaitEvents-srcStageMask-04093
    如果未启用fragmentDensityMap 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWaitEvents-srcStageMask-04094
    如果未启用transformFeedback 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWaitEvents-srcStageMask-04095
    如果未启用meshShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWaitEvents-srcStageMask-04096
    如果未启用taskShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWaitEvents-srcStageMask-07318
    如果 shadingRateImage attachmentFragmentShadingRate 功能均未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWaitEvents-srcStageMask-03937
    如果 synchronization2 功能未启用,则 srcStageMask 必须 不为 0

  • VUID-vkCmdWaitEvents-srcStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能均未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWaitEvents-srcAccessMask-06257
    如果 rayQuery 功能未启用,并且内存屏障 srcAccessMask 包含 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须 不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWaitEvents-dstStageMask-04090
    如果 geometryShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWaitEvents-dstStageMask-04091
    如果 tessellationShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWaitEvents-dstStageMask-04092
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWaitEvents-dstStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWaitEvents-dstStageMask-04094
    如果 transformFeedback 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWaitEvents-dstStageMask-04095
    如果 meshShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWaitEvents-dstStageMask-04096
    如果 taskShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWaitEvents-dstStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能均未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWaitEvents-dstStageMask-03937
    如果 synchronization2 功能未启用,则 dstStageMask 必须 不为 0

  • VUID-vkCmdWaitEvents-dstStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能均未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWaitEvents-dstAccessMask-06257
    如果 rayQuery 功能未启用,并且内存屏障 dstAccessMask 包含 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 必须 不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWaitEvents-srcAccessMask-02815
    pMemoryBarriers 中每个元素的 srcAccessMask 成员必须仅包含 srcStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-dstAccessMask-02816
    pMemoryBarriers 中每个元素的 dstAccessMask 成员必须仅包含 dstStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-pBufferMemoryBarriers-02817
    对于 pBufferMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 srcQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 srcAccessMask 成员必须仅包含 srcStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-pBufferMemoryBarriers-02818
    对于 pBufferMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 dstQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 dstAccessMask 成员必须仅包含 dstStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-pImageMemoryBarriers-02819
    对于 pImageMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 srcQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 srcAccessMask 成员必须仅包含 srcStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-pImageMemoryBarriers-02820
    对于 pImageMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 dstQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 dstAccessMask 成员必须仅包含 dstStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdWaitEvents-srcStageMask-06459
    srcStageMask 中包含的任何管线阶段必须由用于创建分配 commandBufferVkCommandPoolVkCommandPoolCreateInfo 结构的 queueFamilyIndex 成员指定的队列族的功能支持,如支持的管线阶段表中所指定。

  • VUID-vkCmdWaitEvents-dstStageMask-06460
    dstStageMask 中包含的任何管线阶段必须由用于创建分配 commandBufferVkCommandPoolVkCommandPoolCreateInfo 结构的 queueFamilyIndex 成员指定的队列族的功能支持,如支持的管线阶段表中所指定。

  • VUID-vkCmdWaitEvents-srcStageMask-01158
    如果使用 vkSetEvent 设置了 pEvents 的任何元素,则 srcStageMask 必须是之前调用 vkCmdSetEvent 时使用的 stageMask 参数与 pEvents 的任何元素以及 VK_PIPELINE_STAGE_HOST_BIT 的按位或。

  • VUID-vkCmdWaitEvents-srcStageMask-07308
    如果在渲染过程实例中调用 vkCmdWaitEvents,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_HOST_BIT

  • VUID-vkCmdWaitEvents-srcQueueFamilyIndex-02803
    pBufferMemoryBarrierspImageMemoryBarriers 的任何元素的 srcQueueFamilyIndexdstQueueFamilyIndex 成员必须相等。

  • VUID-vkCmdWaitEvents-commandBuffer-01167
    commandBuffer 当前的设备掩码必须只包含一个物理设备

  • VUID-vkCmdWaitEvents-pEvents-03847
    pEvents 的元素必须不是由 vkCmdSetEvent2 发出的信号。

有效用法(隐式)
  • VUID-vkCmdWaitEvents-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdWaitEvents-pEvents-parameter
    pEvents 必须是指向 eventCount 个有效 VkEvent 句柄数组的有效指针

  • VUID-vkCmdWaitEvents-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdWaitEvents-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdWaitEvents-pMemoryBarriers-parameter
    如果 memoryBarrierCount 不为 0,则 pMemoryBarriers 必须是指向 memoryBarrierCount 个有效VkMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter
    如果 bufferMemoryBarrierCount 不为 0,则 pBufferMemoryBarriers 必须是指向 bufferMemoryBarrierCount 个有效VkBufferMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter
    如果 imageMemoryBarrierCount 不为 0,则 pImageMemoryBarriers 必须是指向 imageMemoryBarrierCount 个有效VkImageMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdWaitEvents-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdWaitEvents-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdWaitEvents-eventCount-arraylength
    eventCount 必须大于 0

  • VUID-vkCmdWaitEvents-commonparent
    commandBufferpEvents 的元素都必须是从同一个 VkDevice 创建、分配或检索的

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

两者

两者

图形
计算
解码
编码

同步

管线屏障

要记录管线屏障,请调用

// Provided by VK_VERSION_1_3
void vkCmdPipelineBarrier2(
    VkCommandBuffer                             commandBuffer,
    const VkDependencyInfo*                     pDependencyInfo);

或等效命令

// Provided by VK_KHR_synchronization2
void vkCmdPipelineBarrier2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkDependencyInfo*                     pDependencyInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pDependencyInfo 是指向 VkDependencyInfo 结构的指针,该结构定义了此操作的范围。

当将 vkCmdPipelineBarrier2 提交到队列时,它定义了在它之前提交到同一队列的命令与在它之后提交到同一队列的命令之间的内存依赖关系。

pDependencyInfo 定义的每个内存依赖的第一个同步范围访问范围应用于在提交顺序中较早发生的操作。

pDependencyInfo 定义的每个内存依赖的第二个同步范围访问范围应用于在提交顺序中较晚发生的操作。

如果在渲染过程实例中记录了 vkCmdPipelineBarrier2,则同步范围将限制为同一子过程或渲染过程实例中的操作子集。

有效使用
  • VUID-vkCmdPipelineBarrier2-None-07889
    如果 vkCmdPipelineBarrier2 在使用 VkRenderPass 对象的渲染过程中调用,则该渲染过程必须至少创建一个子通道依赖项,该依赖项表示从当前子通道到自身的依赖,如果此命令不包含 VK_DEPENDENCY_BY_REGION_BIT,则该依赖项也不包含此标志,如果此命令不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则该依赖项也不包含此标志,并且其 同步范围访问范围 必须都是此命令中定义的范围的超集。

  • VUID-vkCmdPipelineBarrier2-bufferMemoryBarrierCount-01178
    如果 vkCmdPipelineBarrier2 在使用 VkRenderPass 对象的渲染过程中调用,则它必须不包含任何缓冲区内存屏障。

  • VUID-vkCmdPipelineBarrier2-image-04073
    如果 vkCmdPipelineBarrier2 在使用 VkRenderPass 对象的渲染过程中调用,则此命令中包含的任何图像内存屏障的 image 成员必须是在当前子通道中作为输入附件以及颜色附件、颜色解析附件或深度/模板附件使用的附件。

  • VUID-vkCmdPipelineBarrier2-image-09373
    如果 vkCmdPipelineBarrier2 在使用 VkRenderPass 对象的渲染过程中调用,并且任何图像内存屏障的 image 成员是颜色解析附件,则对应的颜色附件必须VK_ATTACHMENT_UNUSED

  • VUID-vkCmdPipelineBarrier2-image-09374
    如果 vkCmdPipelineBarrier2 在使用 VkRenderPass 对象的渲染过程中调用,并且任何图像内存屏障的 image 成员是颜色解析附件,则它必须使用非零的 VkExternalFormatANDROID::externalFormat 值创建。

  • VUID-vkCmdPipelineBarrier2-oldLayout-01181
    如果 vkCmdPipelineBarrier2 在渲染过程中调用,则此命令中包含的任何图像内存屏障的 oldLayoutnewLayout 成员必须相等。

  • VUID-vkCmdPipelineBarrier2-srcQueueFamilyIndex-01182
    如果 vkCmdPipelineBarrier2 在渲染过程中调用,则此命令中包含的任何内存屏障的 srcQueueFamilyIndexdstQueueFamilyIndex 成员必须相等。

  • VUID-vkCmdPipelineBarrier2-None-07890
    如果 vkCmdPipelineBarrier2 在渲染过程中调用,并且任何内存屏障的源阶段掩码包含 帧缓冲空间阶段,则所有内存屏障的目标阶段掩码必须仅包含 帧缓冲空间阶段

  • VUID-vkCmdPipelineBarrier2-dependencyFlags-07891
    如果 vkCmdPipelineBarrier2 在渲染过程中调用,并且任何内存屏障的源阶段掩码包含 帧缓冲空间阶段,则 dependencyFlags 必须包含 VK_DEPENDENCY_BY_REGION_BIT

  • VUID-vkCmdPipelineBarrier2-None-07892
    如果 vkCmdPipelineBarrier2 在渲染过程中调用,则任何内存屏障的源阶段掩码和目标阶段掩码必须仅包含图形管线阶段。

  • VUID-vkCmdPipelineBarrier2-dependencyFlags-01186
    如果 vkCmdPipelineBarrier2 在渲染过程之外调用,则依赖项标志必须不包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-vkCmdPipelineBarrier2-None-07893
    如果 vkCmdPipelineBarrier2 在渲染过程内部调用,并且当前子通道中有多个视图,则依赖项标志必须包含 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-vkCmdPipelineBarrier2-None-09553
    如果未启用 shaderTileImageColorReadAccessshaderTileImageStencilReadAccessshaderTileImageDepthReadAccess 功能中的任何一个,并且未启用 dynamicRenderingLocalRead 功能,则必须不在使用 vkCmdBeginRendering 开始的渲染过程中调用 vkCmdPipelineBarrier2

  • VUID-vkCmdPipelineBarrier2-None-09554
    如果未启用 dynamicRenderingLocalRead 功能,并且 vkCmdPipelineBarrier2 在使用 vkCmdBeginRendering 开始的渲染过程中调用,则此命令必须不指定任何缓冲区或图像内存屏障。

  • VUID-vkCmdPipelineBarrier2-None-09586
    如果未启用 dynamicRenderingLocalRead 功能,并且 vkCmdPipelineBarrier2 在使用 vkCmdBeginRendering 开始的渲染过程中调用,则此命令指定的内存屏障必须在其访问掩码中仅包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BITVK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BITVK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BITVK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT

  • VUID-vkCmdPipelineBarrier2-image-09555
    如果 vkCmdPipelineBarrier2 在使用 vkCmdBeginRendering 开始的渲染过程中调用,并且任何图像内存屏障的 image 成员在当前渲染过程中用作附件,则它必须处于 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READVK_IMAGE_LAYOUT_GENERAL 布局中。

  • VUID-vkCmdPipelineBarrier2-srcStageMask-09556
    如果 vkCmdPipelineBarrier2 在使用 vkCmdBeginRendering 开始的渲染过程中调用,则此命令在 srcStageMaskdstStageMask必须仅指定 帧缓冲空间阶段

  • VUID-vkCmdPipelineBarrier2-synchronization2-03848
    必须启用synchronization2 功能

  • VUID-vkCmdPipelineBarrier2-srcStageMask-09673
    pDependencyInfopMemoryBarriers 成员的任何元素的 srcStageMask 成员必须仅包含用于创建分配 commandBuffer 的命令池的队列族有效的管线阶段。

  • VUID-vkCmdPipelineBarrier2-dstStageMask-09674
    pDependencyInfopMemoryBarriers 成员的任何元素的 dstStageMask 成员必须仅包含用于创建分配 commandBuffer 的命令池的队列族有效的管线阶段。

  • VUID-vkCmdPipelineBarrier2-srcStageMask-09675
    如果缓冲区或图像内存屏障没有指定获取操作,或者指定了但pDependencyInfo->dependencyFlags包含了VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,那么pDependencyInfopBufferMemoryBarrierspImageMemoryBarriers成员的元素的对应srcStageMask成员必须仅包含用于创建分配commandBuffer的命令池的队列族所有效的管线阶段。

  • VUID-vkCmdPipelineBarrier2-dstStageMask-09676
    如果缓冲区或图像内存屏障没有指定释放操作,或者指定了但pDependencyInfo->dependencyFlags包含了VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,那么pDependencyInfopBufferMemoryBarrierspImageMemoryBarriers成员的元素的对应dstStageMask成员必须仅包含用于创建分配commandBuffer的命令池的队列族所有效的管线阶段。

  • VUID-vkCmdPipelineBarrier2-srcQueueFamilyIndex-10387
    如果缓冲区或图像内存屏障指定了队列族所有权转移操作,则pDependencyInfopBufferMemoryBarrierspImageMemoryBarriers成员的元素的srcQueueFamilyIndexdstQueueFamilyIndex成员,以及用于创建分配commandBuffer的命令池的队列族索引必须相等。

有效用法(隐式)
  • VUID-vkCmdPipelineBarrier2-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdPipelineBarrier2-pDependencyInfo-parameter
    pDependencyInfo 必须是指向有效的 VkDependencyInfo 结构的有效指针。

  • VUID-vkCmdPipelineBarrier2-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdPipelineBarrier2-commandBuffer-cmdpool
    分配commandBufferVkCommandPool必须支持传输、图形、计算、解码或编码操作。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

两者

两者

传输
图形
计算
解码
编码

同步

要记录管线屏障,请调用

// Provided by VK_VERSION_1_0
void vkCmdPipelineBarrier(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlags                        srcStageMask,
    VkPipelineStageFlags                        dstStageMask,
    VkDependencyFlags                           dependencyFlags,
    uint32_t                                    memoryBarrierCount,
    const VkMemoryBarrier*                      pMemoryBarriers,
    uint32_t                                    bufferMemoryBarrierCount,
    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
    uint32_t                                    imageMemoryBarrierCount,
    const VkImageMemoryBarrier*                 pImageMemoryBarriers);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • srcStageMask是一个VkPipelineStageFlagBits的位掩码,指定源阶段

  • dstStageMask是一个VkPipelineStageFlagBits的位掩码,指定目标阶段

  • dependencyFlagsVkDependencyFlagBits 的位掩码,用于指定如何形成执行和内存依赖项。

  • memoryBarrierCountpMemoryBarriers 数组的长度。

  • pMemoryBarriers 是指向 VkMemoryBarrier 结构体数组的指针。

  • bufferMemoryBarrierCountpBufferMemoryBarriers 数组的长度。

  • pBufferMemoryBarriers 是指向 VkBufferMemoryBarrier 结构体数组的指针。

  • imageMemoryBarrierCountpImageMemoryBarriers 数组的长度。

  • pImageMemoryBarriers 是指向 VkImageMemoryBarrier 结构体数组的指针。

vkCmdPipelineBarrier 的操作几乎与 vkCmdPipelineBarrier2 相同,除了作用域和屏障被定义为直接参数,而不是由 VkDependencyInfo 定义。

vkCmdPipelineBarrier 提交到队列时,它定义了在其之前提交到同一队列的命令和在其之后提交到同一队列的命令之间的内存依赖关系。

如果 vkCmdPipelineBarrier 在渲染通道实例之外记录,则第一个同步范围包括在提交顺序中较早发生的所有命令。如果 vkCmdPipelineBarrier 在渲染通道实例内部记录,则第一个同步范围仅包括在同一子通道内的提交顺序中较早发生的命令。在任何一种情况下,第一个同步范围都限于由 srcStageMask 指定的源阶段掩码确定的管线阶段的操作。

如果 vkCmdPipelineBarrier 在渲染通道实例之外记录,则第二个同步范围包括在提交顺序中较晚发生的所有命令。如果 vkCmdPipelineBarrier 在渲染通道实例内部记录,则第二个同步范围仅包括在同一子通道内的提交顺序中较晚发生的命令。在任何一种情况下,第二个同步范围都限于由 dstStageMask 指定的目标阶段掩码确定的管线阶段的操作。

第一个访问范围仅限于由 srcStageMask 指定的源阶段掩码确定的管线阶段中的访问。其中,第一个访问范围仅包括由 pMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 数组的元素定义的第一个访问范围,它们每个都定义了一组内存屏障。如果未指定任何内存屏障,则第一个访问范围不包含任何访问。

第二个访问范围仅限于由 dstStageMask 指定的目标阶段掩码确定的管线阶段中的访问。其中,第二个访问范围仅包括由 pMemoryBarrierspBufferMemoryBarrierspImageMemoryBarriers 数组的元素定义的第二个访问范围,它们每个都定义了一组内存屏障。如果未指定任何内存屏障,则第二个访问范围不包含任何访问。

如果 dependencyFlags 包含 VK_DEPENDENCY_BY_REGION_BIT,则帧缓冲区空间管线阶段之间的任何依赖项都是帧缓冲区本地的 - 否则它是帧缓冲区全局的。

有效使用
  • VUID-vkCmdPipelineBarrier-srcStageMask-04090
    如果未启用geometryShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04091
    如果未启用tessellationShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04092
    如果未启用conditionalRendering 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04093
    如果未启用fragmentDensityMap 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04094
    如果未启用transformFeedback 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04095
    如果未启用meshShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdPipelineBarrier-srcStageMask-04096
    如果未启用taskShader 功能,则 srcStageMask 必须不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdPipelineBarrier-srcStageMask-07318
    如果 shadingRateImage attachmentFragmentShadingRate 功能均未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdPipelineBarrier-srcStageMask-03937
    如果 synchronization2 功能未启用,则 srcStageMask 必须 不为 0

  • VUID-vkCmdPipelineBarrier-srcStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能均未启用,则 srcStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdPipelineBarrier-srcAccessMask-06257
    如果 rayQuery 功能未启用,并且内存屏障 srcAccessMask 包含 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须 不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdPipelineBarrier-dstStageMask-04090
    如果 geometryShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04091
    如果 tessellationShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04092
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04093
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04094
    如果 transformFeedback 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04095
    如果 meshShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdPipelineBarrier-dstStageMask-04096
    如果 taskShader 功能未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdPipelineBarrier-dstStageMask-07318
    如果 shadingRateImageattachmentFragmentShadingRate 功能均未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdPipelineBarrier-dstStageMask-03937
    如果 synchronization2 功能未启用,则 dstStageMask 必须 不为 0

  • VUID-vkCmdPipelineBarrier-dstStageMask-07949
    如果 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能均未启用,则 dstStageMask 必须 不包含 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdPipelineBarrier-dstAccessMask-06257
    如果 rayQuery 功能未启用,并且内存屏障 dstAccessMask 包含 VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 必须 不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdPipelineBarrier-srcAccessMask-02815
    pMemoryBarriers 中每个元素的 srcAccessMask 成员必须仅包含 srcStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-dstAccessMask-02816
    pMemoryBarriers 中每个元素的 dstAccessMask 成员必须仅包含 dstStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02817
    对于 pBufferMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 srcQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 srcAccessMask 成员必须仅包含 srcStageMask 中的一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02818
    对于 pBufferMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 dstQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 dstAccessMask 成员必须仅包含 dstStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02819
    对于 pImageMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 srcQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 srcAccessMask 成员必须仅包含 srcStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02820
    对于 pImageMemoryBarriers 的任何元素,如果其 srcQueueFamilyIndexdstQueueFamilyIndex 成员相等,或者如果其 dstQueueFamilyIndex 是用于创建分配 commandBuffer 的命令池的队列族索引,则其 dstAccessMask 成员必须仅包含 dstStageMask 中一个或多个管线阶段支持的访问标志,如支持的访问类型表中所指定。

  • VUID-vkCmdPipelineBarrier-None-07889
    如果 vkCmdPipelineBarrier 在使用 VkRenderPass 对象的渲染过程实例中被调用,则该渲染过程必须至少使用一个子通道依赖项创建,该依赖项表达了从当前子通道到自身的依赖关系,如果此命令没有包含 VK_DEPENDENCY_BY_REGION_BIT,则不能包含,如果此命令没有包含 VK_DEPENDENCY_VIEW_LOCAL_BIT,则不能包含,并且其同步范围访问范围都必须是此命令中定义的范围的超集。

  • VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178
    如果 vkCmdPipelineBarrier 在使用 VkRenderPass 对象的渲染过程实例中被调用,则它必须不包含任何缓冲区内存屏障。

  • VUID-vkCmdPipelineBarrier-image-04073
    如果 vkCmdPipelineBarrier 在使用 VkRenderPass 对象的渲染过程实例中被调用,则此命令中包含的任何图像内存屏障的 image 成员必须是当前子通道中用作输入附件,以及用作颜色附件、颜色解析附件或深度/模板附件的附件。

  • VUID-vkCmdPipelineBarrier-image-09373
    如果 vkCmdPipelineBarrier 在使用 VkRenderPass 对象的渲染过程实例中被调用,并且任何图像内存屏障的 image 成员是颜色解析附件,则相应的颜色附件必须VK_ATTACHMENT_UNUSED

  • VUID-vkCmdPipelineBarrier-image-09374
    如果 vkCmdPipelineBarrier 在使用 VkRenderPass 对象的渲染过程实例中被调用,并且任何图像内存屏障的 image 成员是颜色解析附件,则它必须使用非零的VkExternalFormatANDROID::externalFormat 值创建。

  • VUID-vkCmdPipelineBarrier-oldLayout-01181
    如果 vkCmdPipelineBarrier 在渲染过程实例中被调用,则此命令中包含的任何图像内存屏障的 oldLayoutnewLayout 成员必须相等。

  • VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182
    如果 vkCmdPipelineBarrier 在渲染过程实例中被调用,则此命令中包含的任何内存屏障的 srcQueueFamilyIndexdstQueueFamilyIndex 成员必须相等。

  • VUID-vkCmdPipelineBarrier-None-07890
    如果 vkCmdPipelineBarrier 在渲染过程实例中被调用,并且任何内存屏障的源阶段掩码包括帧缓冲空间阶段,则所有内存屏障的目标阶段掩码必须仅包括帧缓冲空间阶段

  • VUID-vkCmdPipelineBarrier-dependencyFlags-07891
    如果 vkCmdPipelineBarrier 在渲染过程实例中被调用,并且任何内存屏障的源阶段掩码包括帧缓冲空间阶段,则 dependencyFlags 必须包括 VK_DEPENDENCY_BY_REGION_BIT

  • VUID-vkCmdPipelineBarrier-None-07892
    如果 vkCmdPipelineBarrier 在渲染过程实例中被调用,则任何内存屏障的源和目标阶段掩码必须仅包括图形管线阶段。

  • VUID-vkCmdPipelineBarrier-dependencyFlags-01186
    如果 vkCmdPipelineBarrier 在渲染过程实例之外被调用,则依赖标志必须不包括 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-vkCmdPipelineBarrier-None-07893
    如果 vkCmdPipelineBarrier 在渲染过程实例内被调用,并且当前子通道中有多个视图,则依赖标志必须包括 VK_DEPENDENCY_VIEW_LOCAL_BIT

  • VUID-vkCmdPipelineBarrier-None-09553
    如果 shaderTileImageColorReadAccess shaderTileImageStencilReadAccess shaderTileImageDepthReadAccess 功能均未启用,并且 dynamicRenderingLocalRead 功能未启用,则必须不在使用 vkCmdBeginRendering 启动的渲染过程实例中调用 vkCmdPipelineBarrier

  • VUID-vkCmdPipelineBarrier-None-09554
    如果未启用 dynamicRenderingLocalRead 功能,并且在用 vkCmdBeginRendering 启动的渲染过程实例中调用了 vkCmdPipelineBarrier,则此命令必须没有指定缓冲区或图像内存屏障。

  • VUID-vkCmdPipelineBarrier-None-09586
    如果未启用 dynamicRenderingLocalRead 功能,并且在以 vkCmdBeginRendering 启动的渲染过程实例中调用 vkCmdPipelineBarrier,则此命令指定的内存屏障的访问掩码中必须仅包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BITVK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BITVK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BITVK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT

  • VUID-vkCmdPipelineBarrier-image-09555
    如果在以 vkCmdBeginRendering 启动的渲染过程实例中调用 vkCmdPipelineBarrier,并且任何图像内存屏障的 image 成员在当前渲染过程实例中用作附件,则它必须处于 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READVK_IMAGE_LAYOUT_GENERAL 布局。

  • VUID-vkCmdPipelineBarrier-srcStageMask-09556
    如果在以 vkCmdBeginRendering 启动的渲染过程实例中调用 vkCmdPipelineBarrier,则此命令在 srcStageMaskdstStageMask必须仅指定 帧缓冲空间阶段

  • VUID-vkCmdPipelineBarrier-srcStageMask-06461
    srcStageMask 中包含的任何管线阶段必须由用于创建分配 commandBufferVkCommandPoolVkCommandPoolCreateInfo 结构的 queueFamilyIndex 成员指定的队列族的功能支持,如支持的管线阶段表中所指定。

  • VUID-vkCmdPipelineBarrier-dstStageMask-06462
    dstStageMask 中包含的任何管线阶段必须由用于创建分配 commandBufferVkCommandPoolVkCommandPoolCreateInfo 结构的 queueFamilyIndex 成员指定的队列族的功能支持,如支持的管线阶段表中所指定。

  • VUID-vkCmdPipelineBarrier-srcStageMask-09633
    如果 srcStageMaskdstStageMask 包括 VK_PIPELINE_STAGE_HOST_BIT,对于 pImageMemoryBarriers 的任何元素,srcQueueFamilyIndexdstQueueFamilyIndex 必须相等。

  • VUID-vkCmdPipelineBarrier-srcStageMask-09634
    如果 srcStageMaskdstStageMask 包括 VK_PIPELINE_STAGE_HOST_BIT,对于 pBufferMemoryBarriers 的任何元素,srcQueueFamilyIndexdstQueueFamilyIndex 必须相等。

  • VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-10388
    如果缓冲区或图像内存屏障指定一个队列族所有权转移操作,则 srcQueueFamilyIndexdstQueueFamilyIndex 成员,以及用于创建分配 commandBuffer 的命令池的队列族索引必须相等。

  • VUID-vkCmdPipelineBarrier-maintenance8-10206
    如果未启用 maintenance8 功能,则 dependencyFlags 必须不包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR

有效用法(隐式)
  • VUID-vkCmdPipelineBarrier-commandBuffer-parameter
    commandBuffer 必须是有效的 VkCommandBuffer 句柄。

  • VUID-vkCmdPipelineBarrier-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdPipelineBarrier-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits值的有效组合。

  • VUID-vkCmdPipelineBarrier-dependencyFlags-parameter
    dependencyFlags 必须VkDependencyFlagBits 值的有效组合。

  • VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter
    如果 memoryBarrierCount 不为 0,则 pMemoryBarriers 必须是指向 memoryBarrierCount 个有效VkMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter
    如果 bufferMemoryBarrierCount 不为 0,则 pBufferMemoryBarriers 必须是指向 bufferMemoryBarrierCount 个有效VkBufferMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter
    如果 imageMemoryBarrierCount 不为 0,则 pImageMemoryBarriers 必须是指向 imageMemoryBarrierCount 个有效VkImageMemoryBarrier结构的数组的有效指针。

  • VUID-vkCmdPipelineBarrier-commandBuffer-recording
    commandBuffer 必须处于录制状态

  • VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool
    分配commandBufferVkCommandPool必须支持传输、图形、计算、解码或编码操作。

主机同步
  • commandBuffer 的主机访问必须进行外部同步。

  • 对从中分配 commandBufferVkCommandPool 的主机访问必须进行外部同步。

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型

主要
辅助

两者

两者

传输
图形
计算
解码
编码

同步

vkCmdPipelineBarrier::dependencyFlags可以设置的位,指定执行和内存依赖关系如何形成,包括:

// Provided by VK_VERSION_1_0
typedef enum VkDependencyFlagBits {
    VK_DEPENDENCY_BY_REGION_BIT = 0x00000001,
  // Provided by VK_VERSION_1_1
    VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004,
  // Provided by VK_VERSION_1_1
    VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002,
  // Provided by VK_EXT_attachment_feedback_loop_layout
    VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0x00000008,
  // Provided by VK_KHR_maintenance8
    VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR = 0x00000020,
  // Provided by VK_KHR_multiview
    VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT,
  // Provided by VK_KHR_device_group
    VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT,
} VkDependencyFlagBits;
  • VK_DEPENDENCY_BY_REGION_BIT 指定依赖关系将是帧缓冲局部的。

  • VK_DEPENDENCY_VIEW_LOCAL_BIT 指定依赖关系将是视图局部的。

  • VK_DEPENDENCY_DEVICE_GROUP_BIT 指定依赖关系是非设备局部的。

  • VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT 指定渲染过程将使用 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT 布局写入并读取同一个图像。

  • VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR 指定在执行 队列族所有权转移时,不忽略源阶段和目标阶段。

// Provided by VK_VERSION_1_0
typedef VkFlags VkDependencyFlags;

VkDependencyFlags 是一个位掩码类型,用于设置零个或多个 VkDependencyFlagBits 的掩码。

内存屏障

内存屏障用于显式控制对缓冲区和图像子资源范围的访问。内存屏障用于 在队列族之间转移所有权更改图像布局,以及定义 可用性和可见性操作。它们显式定义 访问类型以及包含在由包含它们的同步命令创建的内存依赖关系的 访问范围 中的缓冲区和图像子资源范围。

全局内存屏障

全局内存屏障应用于执行时存在的所有内存对象的内存访问。

VkMemoryBarrier2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkMemoryBarrier2 {
    VkStructureType          sType;
    const void*              pNext;
    VkPipelineStageFlags2    srcStageMask;
    VkAccessFlags2           srcAccessMask;
    VkPipelineStageFlags2    dstStageMask;
    VkAccessFlags2           dstAccessMask;
} VkMemoryBarrier2;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkMemoryBarrier2 VkMemoryBarrier2KHR;

此结构定义一个影响所有设备内存的 内存依赖关系

此结构描述的第一个同步范围访问范围仅包含源阶段掩码和源访问掩码指定的操作和内存访问。

此结构描述的第二个同步范围访问范围仅包含目标阶段掩码和目标访问掩码指定的操作和内存访问。

有效使用
  • VUID-VkMemoryBarrier2-srcStageMask-03929
    如果未启用geometryShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkMemoryBarrier2-srcStageMask-03930
    如果未启用tessellationShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkMemoryBarrier2-srcStageMask-03931
    如果未启用conditionalRendering特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkMemoryBarrier2-srcStageMask-03932
    如果未启用fragmentDensityMap特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkMemoryBarrier2-srcStageMask-03933
    如果未启用transformFeedback特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkMemoryBarrier2-srcStageMask-03934
    如果未启用meshShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkMemoryBarrier2-srcStageMask-03935
    如果未启用taskShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkMemoryBarrier2-srcStageMask-07316
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkMemoryBarrier2-srcStageMask-04957
    如果未启用subpassShading特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-srcStageMask-04995
    如果未启用invocationMask特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-srcStageMask-07946
    如果未启用VK_NV_ray_tracing扩展或rayTracingPipeline特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-03900
    如果srcAccessMask包含VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03901
    如果srcAccessMask包含VK_ACCESS_2_INDEX_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03902
    如果srcAccessMask包含VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03903
    如果srcAccessMask包含VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03904
    如果srcAccessMask包含VK_ACCESS_2_UNIFORM_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03905
    如果srcAccessMask包含VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03906
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03907
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-07454
    如果srcAccessMask包含VK_ACCESS_2_SHADER_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03909
    如果srcAccessMask包含VK_ACCESS_2_SHADER_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03910
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03911
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03912
    如果srcAccessMask包含VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03913
    如果 srcAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03914
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03915
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03916
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03917
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03918
    如果 srcAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03919
    如果 srcAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03920
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-04747
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03922
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03923
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-04994
    如果 srcAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-srcAccessMask-03924
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03925
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03926
    如果 srcAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-03927
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,或其中一个 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段。

  • VUID-VkMemoryBarrier2-srcAccessMask-03928
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-srcAccessMask-06256
    如果 rayQuery 功能未启用,且 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-07272
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-04858
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-04859
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-04860
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-04861
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-07455
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkMemoryBarrier2-srcAccessMask-07456
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkMemoryBarrier2-srcAccessMask-07457
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkMemoryBarrier2-srcAccessMask-07458
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkMemoryBarrier2-srcAccessMask-08118
    如果 srcAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstStageMask-03929
    如果 geometryShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkMemoryBarrier2-dstStageMask-03930
    如果 tessellationShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkMemoryBarrier2-dstStageMask-03931
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkMemoryBarrier2-dstStageMask-03932
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkMemoryBarrier2-dstStageMask-03933
    如果 transformFeedback 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkMemoryBarrier2-dstStageMask-03934
    如果 meshShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkMemoryBarrier2-dstStageMask-03935
    如果 taskShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkMemoryBarrier2-dstStageMask-07316
    如果 shadingRateImage attachmentFragmentShadingRate 功能均未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkMemoryBarrier2-dstStageMask-04957
    如果 subpassShading 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-dstStageMask-04995
    如果 invocationMask 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-dstStageMask-07946
    如果未启用 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-03900
    如果 dstAccessMask 包含 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03901
    如果 dstAccessMask 包含 VK_ACCESS_2_INDEX_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03902
    如果 dstAccessMask 包含 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03903
    如果 dstAccessMask 包含 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03904
    如果 dstAccessMask 包含 VK_ACCESS_2_UNIFORM_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-03905
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-03906
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-03907
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-07454
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-03909
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkMemoryBarrier2-dstAccessMask-03910
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03911
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03912
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03913
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03914
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03915
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03916
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03917
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03918
    如果 dstAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03919
    如果 dstAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03920
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-04747
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03922
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03923
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-04994
    如果 dstAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkMemoryBarrier2-dstAccessMask-03924
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03925
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03926
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-03927
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

  • VUID-VkMemoryBarrier2-dstAccessMask-03928
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkMemoryBarrier2-dstAccessMask-06256
    如果未启用 rayQuery 功能,并且 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 不得 包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,但 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR 除外。

  • VUID-VkMemoryBarrier2-dstAccessMask-07272
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-04858
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-04859
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-04860
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-04861
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-07455
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkMemoryBarrier2-dstAccessMask-07456
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkMemoryBarrier2-dstAccessMask-07457
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkMemoryBarrier2-dstAccessMask-07458
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkMemoryBarrier2-dstAccessMask-08118
    如果 dstAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

有效用法(隐式)
  • VUID-VkMemoryBarrier2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MEMORY_BARRIER_2

  • VUID-VkMemoryBarrier2-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkMemoryBarrier2-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits2 值的有效组合。

  • VUID-VkMemoryBarrier2-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkMemoryBarrier2-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits2 值的有效组合。

VkMemoryBarrier 结构定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkMemoryBarrier {
    VkStructureType    sType;
    const void*        pNext;
    VkAccessFlags      srcAccessMask;
    VkAccessFlags      dstAccessMask;
} VkMemoryBarrier;

第一个 访问范围 被限制为 srcAccessMask 指定的源访问掩码中的访问类型,如果 pNext 中传递了 VkMemoryBarrierAccessFlags3KHR,则还包括 srcAccessMask3

第二个 访问范围 被限制为 dstAccessMask 指定的目标访问掩码中的访问类型,如果 pNext 中传递了 VkMemoryBarrierAccessFlags3KHR,则还包括 dstAccessMask3

有效用法(隐式)
  • VUID-VkMemoryBarrier-sType-sType
    sType 必须VK_STRUCTURE_TYPE_MEMORY_BARRIER

  • VUID-VkMemoryBarrier-pNext-pNext
    pNext 必须NULL

  • VUID-VkMemoryBarrier-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits 值的有效组合。

  • VUID-VkMemoryBarrier-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits 值的有效组合。

缓冲区内存屏障

缓冲区内存屏障仅适用于涉及特定缓冲区范围的内存访问。也就是说,由缓冲区内存屏障形成的内存依赖关系会限定为通过指定的缓冲区范围进行的访问。缓冲区内存屏障可以用于为指定的缓冲区范围定义队列族所有权转移

VkBufferMemoryBarrier2 结构定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkBufferMemoryBarrier2 {
    VkStructureType          sType;
    const void*              pNext;
    VkPipelineStageFlags2    srcStageMask;
    VkAccessFlags2           srcAccessMask;
    VkPipelineStageFlags2    dstStageMask;
    VkAccessFlags2           dstAccessMask;
    uint32_t                 srcQueueFamilyIndex;
    uint32_t                 dstQueueFamilyIndex;
    VkBuffer                 buffer;
    VkDeviceSize             offset;
    VkDeviceSize             size;
} VkBufferMemoryBarrier2;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkBufferMemoryBarrier2 VkBufferMemoryBarrier2KHR;

此结构定义了一个内存依赖关系,该依赖关系限定为一个缓冲区范围,并且可以为该范围定义一个队列族所有权转移操作

此结构描述的第一个同步范围访问范围仅包括源阶段掩码和源访问掩码指定的操作和内存访问。

此结构描述的第二个同步范围访问范围仅包括目标阶段掩码和目标访问掩码指定的操作和内存访问。

两个访问范围都被限制为仅对 bufferoffsetsize 定义的范围内的内存访问。

如果使用 VK_SHARING_MODE_EXCLUSIVE 创建 buffer,并且 srcQueueFamilyIndex 不等于 dstQueueFamilyIndex,则此内存屏障定义一个队列族所有权转移操作。在由 srcQueueFamilyIndex 标识的队列族中的队列上执行时,此屏障为指定的缓冲区范围定义一个队列族释放操作,并且如果 VkDependencyInfoKHR::dependencyFlags 未包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则第二个同步范围不适用于此操作。在由 dstQueueFamilyIndex 标识的队列族中的队列上执行时,此屏障为指定的缓冲区范围定义一个队列族获取操作,并且如果 VkDependencyInfoKHR::dependencyFlags 未包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则第一个同步范围不适用于此操作。

如果值不相等,且其中一个值是为外部内存所有权转移保留的特殊队列族值之一(如队列族所有权转移中所述),则还会定义队列族所有权转移操作。当 dstQueueFamilyIndex 是这些值之一时,会定义队列族释放操作;当 srcQueueFamilyIndex 是这些值之一时,会定义队列族获取操作

有效使用
  • VUID-VkBufferMemoryBarrier2-srcStageMask-03929
    如果未启用geometryShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03930
    如果未启用tessellationShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03931
    如果未启用conditionalRendering特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03932
    如果未启用fragmentDensityMap特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03933
    如果未启用transformFeedback特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03934
    如果未启用meshShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03935
    如果未启用taskShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-07316
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcStageMask-04957
    如果未启用subpassShading特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-srcStageMask-04995
    如果未启用invocationMask特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-srcStageMask-07946
    如果未启用VK_NV_ray_tracing扩展或rayTracingPipeline特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03900
    如果srcAccessMask包含VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03901
    如果srcAccessMask包含VK_ACCESS_2_INDEX_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03902
    如果srcAccessMask包含VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03903
    如果srcAccessMask包含VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03904
    如果srcAccessMask包含VK_ACCESS_2_UNIFORM_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03905
    如果srcAccessMask包含VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03906
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03907
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07454
    如果srcAccessMask包含VK_ACCESS_2_SHADER_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03909
    如果srcAccessMask包含VK_ACCESS_2_SHADER_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03910
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03911
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03912
    如果srcAccessMask包含VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03913
    如果 srcAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03914
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03915
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03916
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03917
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03918
    如果 srcAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03919
    如果 srcAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03920
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04747
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03922
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03923
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04994
    如果 srcAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03924
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03925
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03926
    如果 srcAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03927
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,或其中一个 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-03928
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-06256
    如果 rayQuery 功能未启用,且 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07272
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04858
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04859
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04860
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-04861
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07455
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07456
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07457
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-07458
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-08118
    如果 srcAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03929
    如果 geometryShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03930
    如果 tessellationShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03931
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03932
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03933
    如果 transformFeedback 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03934
    如果 meshShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-03935
    如果 taskShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstStageMask-07316
    如果 shadingRateImage attachmentFragmentShadingRate 功能均未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstStageMask-04957
    如果 subpassShading 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-dstStageMask-04995
    如果 invocationMask 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-dstStageMask-07946
    如果未启用 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03900
    如果 dstAccessMask 包含 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03901
    如果 dstAccessMask 包含 VK_ACCESS_2_INDEX_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03902
    如果 dstAccessMask 包含 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03903
    如果 dstAccessMask 包含 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03904
    如果 dstAccessMask 包含 VK_ACCESS_2_UNIFORM_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03905
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03906
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03907
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07454
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03909
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03910
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03911
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03912
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03913
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03914
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03915
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03916
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03917
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03918
    如果 dstAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03919
    如果 dstAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03920
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04747
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03922
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03923
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04994
    如果 dstAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03924
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03925
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03926
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03927
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-03928
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-06256
    如果未启用 rayQuery 功能,并且 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 不得 包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,但 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR 除外。

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07272
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04858
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04859
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04860
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-04861
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07455
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07456
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07457
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-07458
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-08118
    如果 dstAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

  • VUID-VkBufferMemoryBarrier2-offset-01187
    offset 必须 小于 buffer 的大小

  • VUID-VkBufferMemoryBarrier2-size-01188
    如果 size 不等于 VK_WHOLE_SIZE, size 必须 大于 0

  • VUID-VkBufferMemoryBarrier2-size-01189
    如果 size 不等于 VK_WHOLE_SIZE, size 必须 小于或等于 buffer 的大小减去 offset

  • VUID-VkBufferMemoryBarrier2-buffer-01931
    如果 buffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkBufferMemoryBarrier2-buffer-09095
    如果 buffer 是以 VK_SHARING_MODE_EXCLUSIVE 共享模式创建的,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 srcQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族

  • VUID-VkBufferMemoryBarrier2-buffer-09096
    如果 buffer 是以 VK_SHARING_MODE_EXCLUSIVE 共享模式创建的,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 dstQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族

  • VUID-VkBufferMemoryBarrier2-None-09097
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkBufferMemoryBarrier2-None-09098
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 dstQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkBufferMemoryBarrier2-srcQueueFamilyIndex-09099
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkBufferMemoryBarrier2-dstQueueFamilyIndex-09100
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 dstQueueFamilyIndex 必须 不能为 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkBufferMemoryBarrier2-srcStageMask-03851
    如果 srcStageMaskdstStageMask 中包含 VK_PIPELINE_STAGE_2_HOST_BIT,则 srcQueueFamilyIndexdstQueueFamilyIndex 必须 相等

有效用法(隐式)
  • VUID-VkBufferMemoryBarrier2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2

  • VUID-VkBufferMemoryBarrier2-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员 必须NULL 或指向 VkExternalMemoryAcquireUnmodifiedEXTVkMemoryBarrierAccessFlags3KHR 的有效实例的指针

  • VUID-VkBufferMemoryBarrier2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkBufferMemoryBarrier2-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkBufferMemoryBarrier2-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits2 值的有效组合。

  • VUID-VkBufferMemoryBarrier2-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkBufferMemoryBarrier2-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits2 值的有效组合。

  • VUID-VkBufferMemoryBarrier2-buffer-parameter
    buffer 必须 是有效的 VkBuffer 句柄

VkBufferMemoryBarrier 结构的定义如下

// Provided by VK_VERSION_1_0
typedef struct VkBufferMemoryBarrier {
    VkStructureType    sType;
    const void*        pNext;
    VkAccessFlags      srcAccessMask;
    VkAccessFlags      dstAccessMask;
    uint32_t           srcQueueFamilyIndex;
    uint32_t           dstQueueFamilyIndex;
    VkBuffer           buffer;
    VkDeviceSize       offset;
    VkDeviceSize       size;
} VkBufferMemoryBarrier;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • srcAccessMaskVkAccessFlagBits 的位掩码,指定一个源访问掩码

  • dstAccessMaskVkAccessFlagBits 的位掩码,指定一个目标访问掩码

  • srcQueueFamilyIndex 是用于队列族所有权转移的源队列族。

  • dstQueueFamilyIndex 是用于队列族所有权转移的目标队列族。

  • buffer 是一个句柄,指向其后备内存受屏障影响的缓冲区。

  • offsetbuffer 的后备内存中的字节偏移量;这是相对于绑定到缓冲区的基本偏移量(请参阅vkBindBufferMemory)。

  • sizebuffer 的后备内存受影响区域的大小(以字节为单位),或者 VK_WHOLE_SIZE 表示使用从 offset 到缓冲区末尾的范围。

第一个 访问范围 仅限于通过指定的缓冲区范围访问内存,通过 srcAccessMask 指定的源访问掩码中的访问类型,以及如果 pNext 中传递了 VkMemoryBarrierAccessFlags3KHR,则通过 srcAccessMask3。如果源访问掩码包括 VK_ACCESS_HOST_WRITE_BIT,则会执行内存域操作,其中主机域中的可用内存也会提供给设备域。

第二个 访问范围 仅限于通过指定的缓冲区范围访问内存,通过 dstAccessMask 指定的目标访问掩码中的访问类型,以及如果 pNext 中传递了 VkMemoryBarrierAccessFlags3KHR,则通过 dstAccessMask3。如果目标访问掩码包括 VK_ACCESS_HOST_WRITE_BITVK_ACCESS_HOST_READ_BIT,则会执行内存域操作,其中设备域中的可用内存也会提供给主机域。

当使用 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 时,主机域中的可用内存会自动对主机域可见,并且任何主机写入都会自动对主机域可用。

如果 srcQueueFamilyIndex 不等于 dstQueueFamilyIndex,并且 srcQueueFamilyIndex 等于当前队列族,则内存屏障为指定的缓冲区范围定义队列族释放操作,并且如果 dependencyFlags 未包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则调用命令的第二个同步范围不适用于此操作。

如果 dstQueueFamilyIndex 不等于 srcQueueFamilyIndex,并且 dstQueueFamilyIndex 等于当前队列族,则内存屏障为指定的缓冲区范围定义队列族获取操作,并且如果 dependencyFlags 未包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则调用命令的第一个同步范围不适用于此操作。

有效使用
  • VUID-VkBufferMemoryBarrier-offset-01187
    offset 必须 小于 buffer 的大小

  • VUID-VkBufferMemoryBarrier-size-01188
    如果 size 不等于 VK_WHOLE_SIZE, size 必须 大于 0

  • VUID-VkBufferMemoryBarrier-size-01189
    如果 size 不等于 VK_WHOLE_SIZE, size 必须 小于或等于 buffer 的大小减去 offset

  • VUID-VkBufferMemoryBarrier-buffer-01931
    如果 buffer 是非稀疏的,则它必须完整且连续地绑定到单个 VkDeviceMemory 对象

  • VUID-VkBufferMemoryBarrier-buffer-09095
    如果 buffer 是以 VK_SHARING_MODE_EXCLUSIVE 共享模式创建的,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 srcQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族

  • VUID-VkBufferMemoryBarrier-buffer-09096
    如果 buffer 是以 VK_SHARING_MODE_EXCLUSIVE 共享模式创建的,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 dstQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族

  • VUID-VkBufferMemoryBarrier-None-09097
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkBufferMemoryBarrier-None-09098
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 dstQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkBufferMemoryBarrier-srcQueueFamilyIndex-09099
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkBufferMemoryBarrier-dstQueueFamilyIndex-09100
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 dstQueueFamilyIndex 必须 不能为 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkBufferMemoryBarrier-None-09049
    如果未启用 synchronization2 特性,并且 buffer 是使用 VK_SHARING_MODE_CONCURRENT 的共享模式创建的,则 srcQueueFamilyIndexdstQueueFamilyIndex 中至少有一个 必须VK_QUEUE_FAMILY_IGNORED

  • VUID-VkBufferMemoryBarrier-None-09050
    如果未启用 synchronization2 特性,并且 buffer 是使用 VK_SHARING_MODE_CONCURRENT 的共享模式创建的,则 srcQueueFamilyIndex 必须VK_QUEUE_FAMILY_IGNOREDVK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkBufferMemoryBarrier-None-09051
    如果未启用 synchronization2 特性,并且 buffer 是使用 VK_SHARING_MODE_CONCURRENT 的共享模式创建的,则 dstQueueFamilyIndex 必须VK_QUEUE_FAMILY_IGNOREDVK_QUEUE_FAMILY_EXTERNAL

有效用法(隐式)
  • VUID-VkBufferMemoryBarrier-sType-sType
    sType 必须VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER

  • VUID-VkBufferMemoryBarrier-pNext-pNext
    pNext 必须NULL 或指向 VkExternalMemoryAcquireUnmodifiedEXT 的有效实例的指针

  • VUID-VkBufferMemoryBarrier-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkBufferMemoryBarrier-buffer-parameter
    buffer 必须 是有效的 VkBuffer 句柄

VK_WHOLE_SIZE 是一个特殊值,表示应使用给定 offset 之后缓冲区的整个剩余长度。它可以为 VkBufferMemoryBarrier::size 和其他结构指定。

#define VK_WHOLE_SIZE                     (~0ULL)

图像内存屏障

图像内存屏障仅适用于涉及特定图像子资源范围的内存访问。也就是说,由图像内存屏障形成的内存依赖关系作用域到通过指定的图像子资源范围进行的访问。图像内存屏障也可以用于定义指定图像子资源范围的图像布局转换队列族所有权转移

VkImageMemoryBarrier2 结构的定义如下

// Provided by VK_VERSION_1_3
typedef struct VkImageMemoryBarrier2 {
    VkStructureType            sType;
    const void*                pNext;
    VkPipelineStageFlags2      srcStageMask;
    VkAccessFlags2             srcAccessMask;
    VkPipelineStageFlags2      dstStageMask;
    VkAccessFlags2             dstAccessMask;
    VkImageLayout              oldLayout;
    VkImageLayout              newLayout;
    uint32_t                   srcQueueFamilyIndex;
    uint32_t                   dstQueueFamilyIndex;
    VkImage                    image;
    VkImageSubresourceRange    subresourceRange;
} VkImageMemoryBarrier2;

或等效的

// Provided by VK_KHR_synchronization2
typedef VkImageMemoryBarrier2 VkImageMemoryBarrier2KHR;

此结构定义了一个限制在图像子资源范围内的内存依赖,并且可以为该子资源范围定义一个队列族所有权转移操作和一个图像布局转换

此结构描述的第一个同步范围访问范围仅包括源阶段掩码和源访问掩码指定的操作和内存访问。

此结构描述的第二个同步范围访问范围仅包括目标阶段掩码和目标访问掩码指定的操作和内存访问。

两个访问范围都仅限于对imagesubresourceRange定义的子资源范围内的内存访问。

如果image是用VK_SHARING_MODE_EXCLUSIVE创建的,并且srcQueueFamilyIndex不等于dstQueueFamilyIndex,则此内存屏障定义了一个队列族所有权转移操作。当在由srcQueueFamilyIndex标识的族中的队列上执行时,此屏障为指定的图像子资源范围定义一个队列族释放操作,并且如果VkDependencyInfoKHR::dependencyFlags不包含VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则第二个同步范围不适用于此操作。当在由dstQueueFamilyIndex标识的族中的队列上执行时,此屏障为指定的图像子资源范围定义一个队列族获取操作,并且如果VkDependencyInfoKHR::dependencyFlags不包含VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则第一个同步范围不适用于此操作。

如果值不相等,且其中一个值是为外部内存所有权转移保留的特殊队列族值之一(如队列族所有权转移中所述),则还会定义队列族所有权转移操作。当 dstQueueFamilyIndex 是这些值之一时,会定义队列族释放操作;当 srcQueueFamilyIndex 是这些值之一时,会定义队列族获取操作

如果oldLayout不等于newLayout,则此内存屏障为指定的图像子资源范围定义一个图像布局转换。如果此内存屏障定义了一个队列族所有权转移操作,则布局转换仅在队列之间执行一次。

当旧布局和新布局相等时,布局值将被忽略 - 无论指定什么值或图像当前处于什么布局,数据都会被保留。

如果image具有多平面格式且图像是不连续的,则在subresourceRangeaspectMask成员中包含VK_IMAGE_ASPECT_COLOR_BIT等效于包含VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BIT和(仅对于三平面格式)VK_IMAGE_ASPECT_PLANE_2_BIT

有效使用
  • VUID-VkImageMemoryBarrier2-srcStageMask-03929
    如果未启用geometryShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03930
    如果未启用tessellationShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03931
    如果未启用conditionalRendering特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03932
    如果未启用fragmentDensityMap特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03933
    如果未启用transformFeedback特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03934
    如果未启用meshShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcStageMask-03935
    如果未启用taskShader特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcStageMask-07316
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcStageMask-04957
    如果未启用subpassShading特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-srcStageMask-04995
    如果未启用invocationMask特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-srcStageMask-07946
    如果未启用VK_NV_ray_tracing扩展或rayTracingPipeline特性,则srcStageMask必须不包含VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03900
    如果srcAccessMask包含VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03901
    如果srcAccessMask包含VK_ACCESS_2_INDEX_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03902
    如果srcAccessMask包含VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03903
    如果srcAccessMask包含VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03904
    如果srcAccessMask包含VK_ACCESS_2_UNIFORM_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03905
    如果srcAccessMask包含VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03906
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03907
    如果srcAccessMask包含VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07454
    如果srcAccessMask包含VK_ACCESS_2_SHADER_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03909
    如果srcAccessMask包含VK_ACCESS_2_SHADER_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT或其中一个VK_PIPELINE_STAGE_*_SHADER_BIT阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03910
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03911
    如果srcAccessMask包含VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03912
    如果srcAccessMask包含VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则srcStageMask必须包含VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03913
    如果 srcAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03914
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03915
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03916
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03917
    如果 srcAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03918
    如果 srcAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03919
    如果 srcAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03920
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04747
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03922
    如果 srcAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03923
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04994
    如果 srcAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03924
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03925
    如果 srcAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03926
    如果 srcAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03927
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,或其中一个 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-03928
    如果 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-06256
    如果 rayQuery 功能未启用,且 srcAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 srcStageMask 必须不包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,除了 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07272
    如果 srcAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04858
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04859
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04860
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-04861
    如果 srcAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07455
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07456
    如果 srcAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07457
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkImageMemoryBarrier2-srcAccessMask-07458
    如果 srcAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkImageMemoryBarrier2-srcAccessMask-08118
    如果 srcAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 srcStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstStageMask-03929
    如果 geometryShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03930
    如果 tessellationShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03931
    如果 conditionalRendering 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03932
    如果 fragmentDensityMap 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03933
    如果 transformFeedback 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03934
    如果 meshShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstStageMask-03935
    如果 taskShader 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstStageMask-07316
    如果 shadingRateImage attachmentFragmentShadingRate 功能均未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstStageMask-04957
    如果 subpassShading 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-dstStageMask-04995
    如果 invocationMask 功能未启用,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-dstStageMask-07946
    如果未启用 VK_NV_ray_tracing 扩展或 rayTracingPipeline 功能,则 dstStageMask 必须不包含 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03900
    如果 dstAccessMask 包含 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03901
    如果 dstAccessMask 包含 VK_ACCESS_2_INDEX_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_INDEX_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03902
    如果 dstAccessMask 包含 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BITVK_PIPELINE_STAGE_2_VERTEX_INPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03903
    如果 dstAccessMask 包含 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BITVK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEIVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03904
    如果 dstAccessMask 包含 VK_ACCESS_2_UNIFORM_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03905
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03906
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03907
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07454
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03909
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_WRITE_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03910
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03911
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03912
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03913
    如果 dstAccessMask 包含 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03914
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03915
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFER_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COPY_BITVK_PIPELINE_STAGE_2_BLIT_BITVK_PIPELINE_STAGE_2_RESOLVE_BITVK_PIPELINE_STAGE_2_CLEAR_BITVK_PIPELINE_STAGE_2_ALL_TRANSFER_BITVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03916
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_READ_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03917
    如果 dstAccessMask 包含 VK_ACCESS_2_HOST_WRITE_BIT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_HOST_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03918
    如果 dstAccessMask 包含 VK_ACCESS_2_CONDITIONAL_RENDERING_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03919
    如果 dstAccessMask 包含 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03920
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04747
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BITVK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03922
    如果 dstAccessMask 包含 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXTVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03923
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADING_RATE_IMAGE_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_SHADING_RATE_IMAGE_BIT_NVVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04994
    如果 dstAccessMask 包含 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03924
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_READ_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03925
    如果 dstAccessMask 包含 VK_ACCESS_2_COMMAND_PREPROCESS_WRITE_BIT_NV,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NVVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03926
    如果 dstAccessMask 包含 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BITVK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03927
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

  • VUID-VkImageMemoryBarrier2-dstAccessMask-03928
    如果 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHRVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHRVK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-06256
    如果未启用 rayQuery 功能,并且 dstAccessMask 包含 VK_ACCESS_2_ACCELERATION_STRUCTURE_READ_BIT_KHR,则 dstStageMask 不得 包含任何 VK_PIPELINE_STAGE_*_SHADER_BIT 阶段,但 VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR 除外。

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07272
    如果 dstAccessMask 包含 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04858
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04859
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04860
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-04861
    如果 dstAccessMask 包含 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR,则 dstStageMask 必须 包含 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07455
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07456
    如果 dstAccessMask 包含 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07457
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT

  • VUID-VkImageMemoryBarrier2-dstAccessMask-07458
    如果 dstAccessMask 包含 VK_ACCESS_2_MICROMAP_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXTVK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_BUILD_BIT_KHR

  • VUID-VkImageMemoryBarrier2-dstAccessMask-08118
    如果 dstAccessMask 包含 VK_ACCESS_2_DESCRIPTOR_BUFFER_READ_BIT_EXT,则 dstStageMask 必须包含 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BITVK_PIPELINE_STAGE_2_ALL_COMMANDS_BITVK_PIPELINE_STAGE_*_SHADER_BIT 阶段之一。

  • VUID-VkImageMemoryBarrier2-oldLayout-01208
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01209
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01210
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01211
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01212
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01213
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01197
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,则 oldLayout 必须VK_IMAGE_LAYOUT_UNDEFINED 或受屏障影响的图像子资源的当前布局。

  • VUID-VkImageMemoryBarrier2-newLayout-01198
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,则 newLayout 必须 不能是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkImageMemoryBarrier2-oldLayout-01658
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-oldLayout-01659
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-04065
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-04066
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,则 image 必须 使用设置了 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-04067
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-04068
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用设置了 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-synchronization2-07793
    如果synchronization2 功能未启用,则 oldLayout 必须 不能是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkImageMemoryBarrier2-synchronization2-07794
    如果synchronization2 功能未启用,则 newLayout 必须 不能是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-03938
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-03939
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier2-oldLayout-02088
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,则 image 必须 使用设置了 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-image-09117
    如果 image 使用 VK_SHARING_MODE_EXCLUSIVE 的共享模式创建,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 srcQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族。

  • VUID-VkImageMemoryBarrier2-image-09118
    如果 image 使用 VK_SHARING_MODE_EXCLUSIVE 的共享模式创建,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 dstQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族。

  • VUID-VkImageMemoryBarrier2-None-09119
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkImageMemoryBarrier2-None-09120
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 dstQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-09121
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkImageMemoryBarrier2-dstQueueFamilyIndex-09122
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 dstQueueFamilyIndex 必须 不能为 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07120
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07121
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07122
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07123
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07124
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07125
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-10287
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-07006
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 使用位,以及 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 使用位,以及 VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 使用位创建。

  • VUID-VkImageMemoryBarrier2-attachmentFeedbackLoopLayout-07313
    如果 attachmentFeedbackLoopLayout 功能未启用,则 newLayout 必须 不是 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkImageMemoryBarrier2-srcQueueFamilyIndex-09550
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,则 image 必须 使用 VK_IMAGE_USAGE_STORAGE_BIT 创建,或者同时使用 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier2-dynamicRenderingLocalRead-09551
    如果未启用 dynamicRenderingLocalRead 功能,则 oldLayout 必须 不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkImageMemoryBarrier2-dynamicRenderingLocalRead-09552
    如果未启用 dynamicRenderingLocalRead 功能,则 newLayout 必须 不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkImageMemoryBarrier2-subresourceRange-01486
    subresourceRange.baseMipLevel 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageMemoryBarrier2-subresourceRange-01724
    如果 subresourceRange.levelCount 不为 VK_REMAINING_MIP_LEVELS,则 subresourceRange.baseMipLevel + subresourceRange.levelCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageMemoryBarrier2-subresourceRange-01488
    subresourceRange.baseArrayLayer 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageMemoryBarrier2-subresourceRange-01725
    如果 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.baseArrayLayer + subresourceRange.layerCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageMemoryBarrier2-image-01932
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkImageMemoryBarrier2-image-09241
    如果 image 具有单平面的颜色格式,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier2-image-09242
    如果 image 具有颜色格式且不是不相交的,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier2-image-01672
    如果 image 具有多平面格式并且图像是不相交的,则 subresourceRangeaspectMask 成员必须包含至少一个 多平面纵横比掩码 位或 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier2-image-03320
    如果 image 具有同时包含深度和模板的深度/模板格式,并且未启用 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须同时包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkImageMemoryBarrier2-image-03319
    如果 image 具有同时包含深度和模板的深度/模板格式,并且启用了 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 中的一个或两个。

  • VUID-VkImageMemoryBarrier2-aspectMask-08702
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_DEPTH_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL 之一。

  • VUID-VkImageMemoryBarrier2-aspectMask-08703
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL 之一。

  • VUID-VkImageMemoryBarrier2-subresourceRange-09601
    subresourceRange.aspectMask 必须 对于创建 image 时使用的 format 有效。

  • VUID-VkImageMemoryBarrier2-srcStageMask-03854
    如果 srcStageMaskdstStageMask 中包含 VK_PIPELINE_STAGE_2_HOST_BIT,则 srcQueueFamilyIndexdstQueueFamilyIndex 必须 相等

  • VUID-VkImageMemoryBarrier2-srcStageMask-03855
    如果 srcStageMask 包含 VK_PIPELINE_STAGE_2_HOST_BIT,并且 srcQueueFamilyIndexdstQueueFamilyIndex 定义了 队列族所有权转移,或者 oldLayoutnewLayout 定义了 图像布局转换,则 oldLayout 必须VK_IMAGE_LAYOUT_PREINITIALIZEDVK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_GENERAL 之一。

有效用法(隐式)
  • VUID-VkImageMemoryBarrier2-sType-sType
    sType 必须VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2

  • VUID-VkImageMemoryBarrier2-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员必须NULL 或指向 VkExternalMemoryAcquireUnmodifiedEXTVkMemoryBarrierAccessFlags3KHRVkSampleLocationsInfoEXT 的有效实例的指针。

  • VUID-VkImageMemoryBarrier2-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkImageMemoryBarrier2-srcStageMask-parameter
    srcStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkImageMemoryBarrier2-srcAccessMask-parameter
    srcAccessMask 必须VkAccessFlagBits2 值的有效组合。

  • VUID-VkImageMemoryBarrier2-dstStageMask-parameter
    dstStageMask 必须VkPipelineStageFlagBits2 值的有效组合。

  • VUID-VkImageMemoryBarrier2-dstAccessMask-parameter
    dstAccessMask 必须VkAccessFlagBits2 值的有效组合。

  • VUID-VkImageMemoryBarrier2-oldLayout-parameter
    oldLayout 必须为有效的 VkImageLayout 值。

  • VUID-VkImageMemoryBarrier2-newLayout-parameter
    newLayout 必须是一个有效的 VkImageLayout

  • VUID-VkImageMemoryBarrier2-image-parameter
    image 必须是一个有效的 VkImage 句柄

  • VUID-VkImageMemoryBarrier2-subresourceRange-parameter
    subresourceRange 必须是一个有效的 VkImageSubresourceRange 结构体

VkImageMemoryBarrier 结构体的定义如下:

// Provided by VK_VERSION_1_0
typedef struct VkImageMemoryBarrier {
    VkStructureType            sType;
    const void*                pNext;
    VkAccessFlags              srcAccessMask;
    VkAccessFlags              dstAccessMask;
    VkImageLayout              oldLayout;
    VkImageLayout              newLayout;
    uint32_t                   srcQueueFamilyIndex;
    uint32_t                   dstQueueFamilyIndex;
    VkImage                    image;
    VkImageSubresourceRange    subresourceRange;
} VkImageMemoryBarrier;

第一个访问范围被限制为通过指定的图像子资源范围访问内存,通过由srcAccessMask指定的源访问掩码中的访问类型。如果srcAccessMask包含VK_ACCESS_HOST_WRITE_BIT,则该访问类型执行的内存写入也将变得可见,因为该访问类型不是通过资源执行的。

第二个访问范围被限制为通过指定的图像子资源范围访问内存,通过由dstAccessMask指定的目标访问掩码中的访问类型。如果dstAccessMask包含VK_ACCESS_HOST_WRITE_BITVK_ACCESS_HOST_READ_BIT,则可用的内存写入也会对这些类型的访问变得可见,因为这些访问类型不是通过资源执行的。

如果srcQueueFamilyIndex不等于dstQueueFamilyIndex,并且srcQueueFamilyIndex等于当前队列族,则内存屏障为指定的图像子资源范围定义一个队列族释放操作,并且如果dependencyFlags不包含VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则调用命令的第二个同步范围不适用于此操作。

如果dstQueueFamilyIndex不等于srcQueueFamilyIndex,并且dstQueueFamilyIndex等于当前队列族,则内存屏障为指定的图像子资源范围定义一个队列族获取操作,并且如果dependencyFlags不包含VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则调用命令的第一个同步范围不适用于此操作。

如果synchronization2功能未启用或oldLayout不等于newLayout,则oldLayoutnewLayout为指定的图像子资源范围定义一个图像布局转换

如果synchronization2功能已启用,当旧布局和新布局相等时,布局值将被忽略 - 无论指定什么值,或图像当前处于什么布局,数据都会被保留。

如果image具有多平面格式且图像是不连续的,则在subresourceRangeaspectMask成员中包含VK_IMAGE_ASPECT_COLOR_BIT等效于包含VK_IMAGE_ASPECT_PLANE_0_BITVK_IMAGE_ASPECT_PLANE_1_BIT和(仅对于三平面格式)VK_IMAGE_ASPECT_PLANE_2_BIT

有效使用
  • VUID-VkImageMemoryBarrier-oldLayout-01208
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01209
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01210
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01211
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01212
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_TRANSFER_SRC_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01213
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_TRANSFER_DST_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01197
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,则 oldLayout 必须VK_IMAGE_LAYOUT_UNDEFINED 或受屏障影响的图像子资源的当前布局。

  • VUID-VkImageMemoryBarrier-newLayout-01198
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,则 newLayout 必须 不能是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED

  • VUID-VkImageMemoryBarrier-oldLayout-01658
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-oldLayout-01659
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04065
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04066
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,则 image 必须 使用设置了 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04067
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT,或 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04068
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,则 image 必须 使用设置了 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-synchronization2-07793
    如果synchronization2 功能未启用,则 oldLayout 必须 不能是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkImageMemoryBarrier-synchronization2-07794
    如果synchronization2 功能未启用,则 newLayout 必须 不能是 VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHRVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-03938
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-03939
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,则 image 必须 使用至少以下之一创建:VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BITVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT

  • VUID-VkImageMemoryBarrier-oldLayout-02088
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,则 image 必须 使用设置了 VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-image-09117
    如果 image 使用 VK_SHARING_MODE_EXCLUSIVE 的共享模式创建,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 srcQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族。

  • VUID-VkImageMemoryBarrier-image-09118
    如果 image 使用 VK_SHARING_MODE_EXCLUSIVE 的共享模式创建,并且 srcQueueFamilyIndexdstQueueFamilyIndex 不相等,则 dstQueueFamilyIndex 必须VK_QUEUE_FAMILY_EXTERNALVK_QUEUE_FAMILY_FOREIGN_EXT 或有效的队列族。

  • VUID-VkImageMemoryBarrier-None-09119
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkImageMemoryBarrier-None-09120
    如果未启用 VK_KHR_external_memory 扩展,并且用于创建 VkInstanceVkApplicationInfo::apiVersion 的值不大于或等于 1.1 版本,则 dstQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-09121
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 srcQueueFamilyIndex 必须 不能是 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkImageMemoryBarrier-dstQueueFamilyIndex-09122
    如果未启用 VK_EXT_queue_family_foreign 扩展,则 dstQueueFamilyIndex 必须 不能为 VK_QUEUE_FAMILY_FOREIGN_EXT

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07120
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07121
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07122
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07123
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07124
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07125
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-10287
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR,则 image 必须 使用 VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHRVK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR 创建。

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-07006
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,则 image 必须 使用 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 使用位,以及 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_SAMPLED_BIT 使用位,以及 VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT 使用位创建。

  • VUID-VkImageMemoryBarrier-attachmentFeedbackLoopLayout-07313
    如果 attachmentFeedbackLoopLayout 功能未启用,则 newLayout 必须 不是 VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT

  • VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-09550
    如果 srcQueueFamilyIndexdstQueueFamilyIndex 定义了一个队列族所有权转移,或者 oldLayoutnewLayout 定义了一个图像布局转换,并且 oldLayoutnewLayoutVK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,则 image 必须 使用 VK_IMAGE_USAGE_STORAGE_BIT 创建,或者同时使用 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BITVK_IMAGE_USAGE_COLOR_ATTACHMENT_BITVK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT 创建。

  • VUID-VkImageMemoryBarrier-dynamicRenderingLocalRead-09551
    如果未启用 dynamicRenderingLocalRead 功能,则 oldLayout 必须 不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkImageMemoryBarrier-dynamicRenderingLocalRead-09552
    如果未启用 dynamicRenderingLocalRead 功能,则 newLayout 必须 不能为 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ

  • VUID-VkImageMemoryBarrier-subresourceRange-01486
    subresourceRange.baseMipLevel 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageMemoryBarrier-subresourceRange-01724
    如果 subresourceRange.levelCount 不为 VK_REMAINING_MIP_LEVELS,则 subresourceRange.baseMipLevel + subresourceRange.levelCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkImageMemoryBarrier-subresourceRange-01488
    subresourceRange.baseArrayLayer 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageMemoryBarrier-subresourceRange-01725
    如果 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.baseArrayLayer + subresourceRange.layerCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkImageMemoryBarrier-image-01932
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkImageMemoryBarrier-image-09241
    如果 image 具有单平面的颜色格式,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier-image-09242
    如果 image 具有颜色格式且不是不相交的,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier-image-01672
    如果 image 具有多平面格式并且图像是不相交的,则 subresourceRangeaspectMask 成员必须包含至少一个 多平面纵横比掩码 位或 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkImageMemoryBarrier-image-03320
    如果 image 具有同时包含深度和模板的深度/模板格式,并且未启用 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须同时包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkImageMemoryBarrier-image-03319
    如果 image 具有同时包含深度和模板的深度/模板格式,并且启用了 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 中的一个或两个。

  • VUID-VkImageMemoryBarrier-aspectMask-08702
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_DEPTH_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL 之一。

  • VUID-VkImageMemoryBarrier-aspectMask-08703
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL 之一。

  • VUID-VkImageMemoryBarrier-subresourceRange-09601
    subresourceRange.aspectMask 必须 对于创建 image 时使用的 format 有效。

  • VUID-VkImageMemoryBarrier-None-09052
    如果未启用synchronization2特性,且image是以VK_SHARING_MODE_CONCURRENT的共享模式创建的,则srcQueueFamilyIndexdstQueueFamilyIndex中至少有一个必须VK_QUEUE_FAMILY_IGNORED

  • VUID-VkImageMemoryBarrier-None-09053
    如果未启用synchronization2特性,且image是以VK_SHARING_MODE_CONCURRENT的共享模式创建的,则srcQueueFamilyIndex必须VK_QUEUE_FAMILY_IGNOREDVK_QUEUE_FAMILY_EXTERNAL

  • VUID-VkImageMemoryBarrier-None-09054
    如果未启用synchronization2特性,且image是以VK_SHARING_MODE_CONCURRENT的共享模式创建的,则dstQueueFamilyIndex必须VK_QUEUE_FAMILY_IGNOREDVK_QUEUE_FAMILY_EXTERNAL

有效用法(隐式)
  • VUID-VkImageMemoryBarrier-sType-sType
    sType必须VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER

  • VUID-VkImageMemoryBarrier-pNext-pNext
    pNext链中任何结构(包括此结构)的每个pNext成员必须NULL,或者是指向VkExternalMemoryAcquireUnmodifiedEXTVkSampleLocationsInfoEXT的有效实例的指针。

  • VUID-VkImageMemoryBarrier-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkImageMemoryBarrier-oldLayout-parameter
    oldLayout 必须为有效的 VkImageLayout 值。

  • VUID-VkImageMemoryBarrier-newLayout-parameter
    newLayout 必须是一个有效的 VkImageLayout

  • VUID-VkImageMemoryBarrier-image-parameter
    image 必须是一个有效的 VkImage 句柄

  • VUID-VkImageMemoryBarrier-subresourceRange-parameter
    subresourceRange 必须是一个有效的 VkImageSubresourceRange 结构体

为了方便在主机上初始化内存的图像的使用,Vulkan 允许主机执行图像布局转换,尽管支持的布局有限。

要在主机上执行图像布局转换,请调用

// Provided by VK_VERSION_1_4
VkResult vkTransitionImageLayout(
    VkDevice                                    device,
    uint32_t                                    transitionCount,
    const VkHostImageLayoutTransitionInfo*      pTransitions);

或等效命令

// Provided by VK_EXT_host_image_copy
VkResult vkTransitionImageLayoutEXT(
    VkDevice                                    device,
    uint32_t                                    transitionCount,
    const VkHostImageLayoutTransitionInfo*      pTransitions);
  • device是拥有pTransitions[i].image的设备。

  • transitionCount是要执行的图像布局转换的数量。

  • pTransitions是指向VkHostImageLayoutTransitionInfo结构数组的指针,该结构指定要转换的图像及其中的子资源范围

有效用法(隐式)
  • VUID-vkTransitionImageLayout-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkTransitionImageLayout-pTransitions-parameter
    pTransitions必须是指向transitionCount个有效的VkHostImageLayoutTransitionInfo结构的有效指针。

  • VUID-vkTransitionImageLayout-transitionCount-arraylength
    transitionCount必须大于0

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_INITIALIZATION_FAILED

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_MEMORY_MAP_FAILED

VkHostImageLayoutTransitionInfo结构的定义如下:

// Provided by VK_VERSION_1_4
typedef struct VkHostImageLayoutTransitionInfo {
    VkStructureType            sType;
    const void*                pNext;
    VkImage                    image;
    VkImageLayout              oldLayout;
    VkImageLayout              newLayout;
    VkImageSubresourceRange    subresourceRange;
} VkHostImageLayoutTransitionInfo;

或等效的

// Provided by VK_EXT_host_image_copy
typedef VkHostImageLayoutTransitionInfo VkHostImageLayoutTransitionInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • image是受此布局转换影响的图像句柄。

  • oldLayout图像布局转换中的旧布局。

  • newLayout图像布局转换中的新布局。

  • subresourceRange描述了image中受此布局转换影响的图像子资源范围

vkTransitionImageLayout在执行布局转换之前,不会检查与图像关联的设备内存当前是否正在使用。应用程序必须保证,在主机执行布局转换之前,任何先前提交的读取或写入此子资源的命令都已完成。主机访问image的内存,就像一致一样。

在主机上执行的图像布局转换不需要队列族所有权转移,因为对于此函数支持的布局,图像的物理布局在队列族之间不会变化。

如果设备已写入图像内存,则不会自动使其对主机可用。在调用此命令之前,必须已在设备上发布了此图像的内存屏障,其第二个同步范围包括VK_PIPELINE_STAGE_HOST_BITVK_ACCESS_HOST_READ_BIT

由于队列提交自动使主机内存对设备可见,因此在设备上使用此布局转换的结果之前,不需要内存屏障。

有效使用
  • VUID-VkHostImageLayoutTransitionInfo-image-09055
    image必须已使用VK_IMAGE_USAGE_HOST_TRANSFER_BIT创建。

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-01486
    subresourceRange.baseMipLevel 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-01724
    如果 subresourceRange.levelCount 不为 VK_REMAINING_MIP_LEVELS,则 subresourceRange.baseMipLevel + subresourceRange.levelCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 mipLevels

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-01488
    subresourceRange.baseArrayLayer 必须 小于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-01725
    如果 subresourceRange.layerCount 不为 VK_REMAINING_ARRAY_LAYERS,则 subresourceRange.baseArrayLayer + subresourceRange.layerCount 必须 小于或等于创建 image 时在 VkImageCreateInfo 中指定的 arrayLayers

  • VUID-VkHostImageLayoutTransitionInfo-image-01932
    如果 image 是非稀疏的,则它必须完全且连续地绑定到单个 VkDeviceMemory 对象。

  • VUID-VkHostImageLayoutTransitionInfo-image-09241
    如果 image 具有单平面的颜色格式,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkHostImageLayoutTransitionInfo-image-09242
    如果 image 具有颜色格式且不是不相交的,则 subresourceRangeaspectMask 成员必须VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkHostImageLayoutTransitionInfo-image-01672
    如果 image 具有多平面格式并且图像是不相交的,则 subresourceRangeaspectMask 成员必须包含至少一个 多平面纵横比掩码 位或 VK_IMAGE_ASPECT_COLOR_BIT

  • VUID-VkHostImageLayoutTransitionInfo-image-03320
    如果 image 具有同时包含深度和模板的深度/模板格式,并且未启用 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须同时包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT

  • VUID-VkHostImageLayoutTransitionInfo-image-03319
    如果 image 具有同时包含深度和模板的深度/模板格式,并且启用了 separateDepthStencilLayouts 功能,则 subresourceRangeaspectMask 成员必须包含 VK_IMAGE_ASPECT_DEPTH_BITVK_IMAGE_ASPECT_STENCIL_BIT 中的一个或两个。

  • VUID-VkHostImageLayoutTransitionInfo-aspectMask-08702
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_DEPTH_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL 之一。

  • VUID-VkHostImageLayoutTransitionInfo-aspectMask-08703
    如果 subresourceRangeaspectMask 成员包含 VK_IMAGE_ASPECT_STENCIL_BIT,则 oldLayoutnewLayout 必须 不能为 VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMALVK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL 之一。

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601
    subresourceRange.aspectMask 必须 对于创建 image 时使用的 format 有效。

  • VUID-VkHostImageLayoutTransitionInfo-oldLayout-09229
    oldLayout 必须VK_IMAGE_LAYOUT_UNDEFINEDsubresourceRange 中指定的图像子资源的当前布局。

  • VUID-VkHostImageLayoutTransitionInfo-oldLayout-09230
    如果 oldLayout 不是 VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED,则它必须VkPhysicalDeviceHostImageCopyProperties::pCopySrcLayouts 中的布局之一。

  • VUID-VkHostImageLayoutTransitionInfo-newLayout-09057
    newLayout 必须VkPhysicalDeviceHostImageCopyProperties::pCopyDstLayouts 中的布局之一。

有效用法(隐式)
  • VUID-VkHostImageLayoutTransitionInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO

  • VUID-VkHostImageLayoutTransitionInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkHostImageLayoutTransitionInfo-image-parameter
    image 必须是一个有效的 VkImage 句柄

  • VUID-VkHostImageLayoutTransitionInfo-oldLayout-parameter
    oldLayout 必须为有效的 VkImageLayout 值。

  • VUID-VkHostImageLayoutTransitionInfo-newLayout-parameter
    newLayout 必须是一个有效的 VkImageLayout

  • VUID-VkHostImageLayoutTransitionInfo-subresourceRange-parameter
    subresourceRange 必须是一个有效的 VkImageSubresourceRange 结构体

队列族所有权转移

使用 VK_SHARING_MODE_EXCLUSIVEVkSharingMode 创建的资源,必须显式地将其所有权从一个队列族转移到另一个队列族,以便在不同队列族的队列上以明确定义的方式访问其内容。

特殊的队列族索引 VK_QUEUE_FAMILY_IGNORED 表示忽略队列族参数或成员。

#define VK_QUEUE_FAMILY_IGNORED           (~0U)

使用外部内存与外部 API 或实例共享的资源,也必须显式地管理本地和外部队列(或外部 API 中的等效构造)之间的所有权转移,无论创建它们时指定的 VkSharingMode 是什么。

特殊的队列族索引 VK_QUEUE_FAMILY_EXTERNAL 表示资源当前 Vulkan 实例之外的任何队列,只要该队列使用与资源的 VkDevice 相同的底层设备组或物理设备,以及相同的驱动程序版本,如 VkPhysicalDeviceIDProperties::deviceUUIDVkPhysicalDeviceIDProperties::driverUUID 所示。

#define VK_QUEUE_FAMILY_EXTERNAL          (~1U)

或等效的

#define VK_QUEUE_FAMILY_EXTERNAL_KHR      VK_QUEUE_FAMILY_EXTERNAL

特殊的队列族索引 VK_QUEUE_FAMILY_FOREIGN_EXT 表示资源当前 Vulkan 实例之外的任何队列,无论该队列的底层物理设备或驱动程序版本如何。这包括,例如,固定功能图像处理设备、媒体编解码器设备和显示设备的队列,以及所有使用与资源的 VkDevice 相同的底层设备组或物理设备和相同驱动程序版本的队列。

#define VK_QUEUE_FAMILY_FOREIGN_EXT       (~2U)

如果在不同队列族的两个队列之间使用此类资源时,正确表达了内存依赖关系,但没有定义所有权转移,则对于第二个队列族执行的任何读取访问,该资源的内容都是未定义的

如果应用程序不需要在从一个队列族转移到另一个队列族时保持资源内容的有效性,则应该跳过所有权转移。

应用程序应该预期与 VK_QUEUE_FAMILY_FOREIGN_EXT 之间的数据传输比与 VK_QUEUE_FAMILY_EXTERNAL_KHR 之间的数据传输更昂贵。

队列族所有权转移由两个不同的部分组成

  1. 从源队列族释放独占所有权

  2. 为目标队列族获取独占所有权

应用程序必须确保这些操作按正确的顺序发生,方法是在它们之间定义执行依赖关系,例如使用信号量。

释放操作用于释放缓冲区或图像子资源范围的独占所有权。释放操作通过在来自源队列族的队列上执行 缓冲区内存屏障(对于缓冲区范围)或 图像内存屏障(对于图像子资源范围)使用管线屏障命令来定义。屏障的 srcQueueFamilyIndex 参数必须是源队列族索引,并且 dstQueueFamilyIndex 参数必须是目标队列族索引。对于此类屏障,将忽略目标访问掩码,这样不会执行任何可见性操作 - 此掩码的值不影响屏障的有效性。释放操作发生在可用性操作之后。如果 dependencyFlags 不包括 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则根据 缓冲区内存所有权转移图像内存所有权转移的定义,此类屏障也将忽略 dstStageMask

获取操作 用于获取缓冲区或图像子资源范围的独占所有权。获取操作的定义是在目标队列族中的队列上,使用管线屏障命令执行缓冲区内存屏障(对于缓冲区范围)或图像内存屏障(对于图像子资源范围)。获取操作中指定的缓冲区范围或图像子资源范围必须与之前的释放操作完全匹配。屏障的 srcQueueFamilyIndex 参数必须是源队列族索引,而 dstQueueFamilyIndex 参数必须是目标队列族索引。源访问掩码对于此类屏障将被忽略,因此不会执行可用性操作 - 此掩码的值不影响屏障的有效性。获取操作先于可见性操作发生。如果 dependencyFlags 不包含 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR,则 srcStageMask 对于此类屏障也会被忽略,如缓冲区内存所有权转移图像内存所有权转移所定义。

虽然为用于释放或获取操作的内存屏障提供目标或源访问掩码并非无效,但它们没有实际效果。释放操作之后的访问结果是未定义的,因此这些访问的可见性没有实际效果。同样,在获取操作之前的写入访问将对未来的访问产生未定义的结果,因此这些写入的可用性没有实际用途。在规范的早期版本中,要求这些掩码在两侧匹配 - 但后来放宽了此要求。这些掩码应该设置为 0。

为确保获取和释放操作有效,释放操作必须先于获取操作发生。通常,信号量直接用于此目的,信号量在释放后发出信号,然后在获取之前等待。在引入 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR 之前,VK_PIPELINE_STAGE_ALL_COMMANDS_BIT 是等待或等待这些操作的唯一有效阶段,因为获取和释放操作不会发生在定义的阶段。但是,当指定 VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR 时,这些操作可以与否则将被忽略的阶段同步,因为这些阶段现在同步了获取和释放操作,从而提供了一种避免整个管线停顿的方法。

如果传输通过图像内存屏障进行,并且需要进行图像布局转换,则释放操作的内存屏障中的 oldLayoutnewLayout 的值必须等于获取操作的内存屏障中的 oldLayoutnewLayout 的值。虽然图像布局转换提交了两次,但它只会执行一次。以此方式指定的布局转换发生在释放操作之后,且发生在获取操作之前。

如果 srcQueueFamilyIndexdstQueueFamilyIndex 的值相等,则不会执行所有权转移,并且屏障的操作就好像它们都设置为 VK_QUEUE_FAMILY_IGNORED 一样。

队列族所有权转移可能对绑定到图像子资源或缓冲区范围的所有内存执行读写访问,因此应用程序必须确保所有内存写入在执行队列族所有权转移之前都已可用。可用内存会自动对队列族释放和获取操作变得可见,并且这些操作执行的写入会自动变得可用。

一旦队列族获取了 VK_SHARING_MODE_EXCLUSIVE 资源的缓冲区范围或图像子资源范围的所有权,其内容对于其他队列族来说是未定义的,除非所有权被转移。在释放或获取操作之后,绑定到已转移缓冲区或图像子资源范围的任何其他资源部分的内容都是未定义的

因为事件不能直接用于队列间同步,并且因为vkCmdSetEvent 没有释放操作所需的队列族索引或内存屏障参数,所以队列族所有权转移的释放和获取操作只能使用vkCmdPipelineBarrier执行。

当从上述为外部内存所有权转移保留的特殊队列族之一获取子资源范围的所有权时,获取操作可能会产生性能损失。在某些情况下,应用程序可以通过向获取操作的内存屏障结构的 pNext 链添加VkExternalMemoryAcquireUnmodifiedEXT结构来减少性能损失。

VkExternalMemoryAcquireUnmodifiedEXT 结构定义如下

// Provided by VK_EXT_external_memory_acquire_unmodified
typedef struct VkExternalMemoryAcquireUnmodifiedEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkBool32           acquireUnmodifiedMemory;
} VkExternalMemoryAcquireUnmodifiedEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • 如果 acquireUnmodifiedMemory 指定为 VK_TRUE,则表示绑定到内存屏障子资源范围的资源的VkDeviceMemory的任何范围,自该资源最近一次将所有权释放给内存屏障的 srcQueueFamilyIndex 指定的队列族以来,从未被修改过。如果为 VK_FALSE,则不指定任何内容。

如果应用程序使用内存屏障结构将子资源范围的所有权释放给为外部内存所有权转移保留的特殊队列族之一,稍后又使用内存屏障结构从同一队列族重新获取所有权,并且如果绑定到该资源的VkDeviceMemory的任何范围在释放操作获取操作之间的任何时间都没有被修改过,那么应用程序应该VkExternalMemoryAcquireUnmodifiedEXT结构添加到获取操作的内存屏障结构的 pNext 链,因为这可能会减少性能损失。

如果 acquireUnmodifiedMemoryVK_FALSE,则此结构将被忽略。特别是,VK_FALSE表示内存已被修改。

如果内存屏障的 srcQueueFamilyIndex 不是为外部内存所有权转移保留的特殊队列族,则此结构将被忽略。

应用程序确定内存是否在释放操作获取操作之间被修改的方法不在 Vulkan 的范围之内。

对于任何访问资源的 Vulkan 操作,应用程序必须不要假设实现将资源的内存作为只读访问,即使对于表面上只读的操作(例如传输命令和着色器读取)也是如此。

VkExternalMemoryAcquireUnmodifiedEXT::acquireUnmodifiedMemory 的有效性独立于绑定到资源的 VkDeviceMemory 范围之外的内存范围。 特别是,它独立于与资源关联的任何实现私有内存。

有效使用
  • VUID-VkExternalMemoryAcquireUnmodifiedEXT-acquireUnmodifiedMemory-08922
    如果 acquireUnmodifiedMemoryVK_TRUE,并且内存屏障的 srcQueueFamilyIndex 是为外部内存所有权转移保留的特殊队列族(如 队列族所有权转移 中所述),则绑定到资源的每个 VkDeviceMemory 范围 必须 自资源最近一次释放所有权到队列族以来,在所有时间内保持未修改状态。

有效用法(隐式)
  • VUID-VkExternalMemoryAcquireUnmodifiedEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT

等待空闲操作

要在主机上等待给定队列的未完成队列操作完成,请调用

// Provided by VK_VERSION_1_0
VkResult vkQueueWaitIdle(
    VkQueue                                     queue);
  • queue 是要等待的队列。

vkQueueWaitIdle 等同于已将一个有效的栅栏提交给每个先前执行的接受栅栏的 队列提交命令,然后使用无限超时和设置为 VK_TRUEwaitAll 来使用 vkWaitForFences 等待所有这些栅栏发出信号。

有效用法(隐式)
  • VUID-vkQueueWaitIdle-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

主机同步
  • queue 的主机访问 必须 进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

要在主机上等待给定逻辑设备的所有队列的未完成队列操作完成,请调用

// Provided by VK_VERSION_1_0
VkResult vkDeviceWaitIdle(
    VkDevice                                    device);
  • device 是要空闲的逻辑设备。

vkDeviceWaitIdle 等同于为 device 拥有的所有队列调用 vkQueueWaitIdle

有效用法(隐式)
  • VUID-vkDeviceWaitIdle-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

主机同步
  • 对从 device 创建的所有 VkQueue 对象的主机访问 必须 进行外部同步

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

主机写入排序保证

当通过 队列提交命令 将一批命令缓冲区提交到队列时,它定义了与先前的主机操作以及提交到队列的命令缓冲区的执行的内存依赖关系。

第一个 同步范围 包括主机上 vkQueueSubmit 的执行以及主机内存模型定义的在其之前发生的任何事情。

一些系统允许不直接与主机内存模型集成的写入;这些必须由应用程序手动同步。一个例子是 x86 上的非临时存储指令;为了确保这些发生在提交之前,应用程序应调用 _mm_sfence()

第二个 同步范围 包括在同一 队列提交 中提交的所有命令,以及在 提交顺序 中稍后发生的所有命令。

第一个 访问范围 包括所有对可映射设备内存的主机写入,这些写入可用于主机内存域。

第二个 访问范围 包括设备执行的所有内存访问。

同步和多个物理设备

如果一个逻辑设备包含多个物理设备,则栅栏、信号量和事件都仍然具有信号状态的单个实例。

当所有物理设备完成必要的队列操作时,栅栏会发出信号。

信号量等待和信号操作都包含一个设备索引,该索引是执行操作的唯一物理设备。这些索引在 VkDeviceGroupSubmitInfoVkDeviceGroupBindSparseInfo 结构中提供。信号量并非由任何物理设备独占拥有。例如,一个信号量可以由一个物理设备发出信号,然后由另一个物理设备等待。

一个事件 只能 由发出信号的同一物理设备(或主机)等待。

校准时间戳

为了能够关联特定操作在不同时间域的时间线(例如,设备操作与主机操作)上发生的时间,Vulkan 允许从多个时间域查询校准的时间戳。

要从一组时间域查询校准的时间戳,请调用

// Provided by VK_KHR_calibrated_timestamps
VkResult vkGetCalibratedTimestampsKHR(
    VkDevice                                    device,
    uint32_t                                    timestampCount,
    const VkCalibratedTimestampInfoKHR*         pTimestampInfos,
    uint64_t*                                   pTimestamps,
    uint64_t*                                   pMaxDeviation);

或等效命令

// Provided by VK_EXT_calibrated_timestamps
VkResult vkGetCalibratedTimestampsEXT(
    VkDevice                                    device,
    uint32_t                                    timestampCount,
    const VkCalibratedTimestampInfoKHR*         pTimestampInfos,
    uint64_t*                                   pTimestamps,
    uint64_t*                                   pMaxDeviation);
  • device 是用于执行查询的逻辑设备。

  • timestampCount 是要查询的时间戳的数量。

  • pTimestampInfos 是指向 timestampCount VkCalibratedTimestampInfoKHR 结构数组的指针,描述应从中捕获校准时间戳的时间域。

  • pTimestamps 是指向 timestampCount 个 64 位无符号整数值数组的指针,其中返回请求的校准时间戳值。

  • pMaxDeviation 是指向一个 64 位无符号整数值的指针,其中返回校准时间戳值的严格正最大偏差(以纳秒为单位)。

由于实现和平台特定原因,即使对于同一组时间域,对 vkGetCalibratedTimestampsKHR 的调用之间的最大偏差 可能 会有所不同。应用程序有责任评估返回的最大偏差是否使时间戳值适合任何特定目的,并且 可以 选择重新发出时间戳校准调用,以追求较低的偏差值。

校准的时间戳值 可以 被外推以估计未来一致的时间戳值,但是,根据时间域的性质和平台的其他属性,在足够长的时间内外推值 可能 不再足够准确以适合任何特定目的,因此期望应用程序定期重新校准时间戳。

有效使用
  • VUID-vkGetCalibratedTimestampsKHR-timeDomain-09246
    pTimestampInfos 中的每个 VkCalibratedTimestampInfoKHRtimeDomain必须 是唯一的

有效用法(隐式)
  • VUID-vkGetCalibratedTimestampsKHR-device-parameter
    device 必须 是一个有效的 VkDevice 句柄

  • VUID-vkGetCalibratedTimestampsKHR-pTimestampInfos-parameter
    pTimestampInfos 必须 是指向 timestampCount 个有效 VkCalibratedTimestampInfoKHR 结构数组的有效指针

  • VUID-vkGetCalibratedTimestampsKHR-pTimestamps-parameter
    pTimestamps 必须 是指向 timestampCountuint64_t 值数组的有效指针

  • VUID-vkGetCalibratedTimestampsKHR-pMaxDeviation-parameter
    pMaxDeviation 必须 是指向 uint64_t 值的有效指针

  • VUID-vkGetCalibratedTimestampsKHR-timestampCount-arraylength
    timestampCount 必须 大于 0

返回值
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkCalibratedTimestampInfoKHR 结构的定义如下

// Provided by VK_KHR_calibrated_timestamps
typedef struct VkCalibratedTimestampInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    VkTimeDomainKHR    timeDomain;
} VkCalibratedTimestampInfoKHR;

或等效的

// Provided by VK_EXT_calibrated_timestamps
typedef VkCalibratedTimestampInfoKHR VkCalibratedTimestampInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • timeDomain 是一个 VkTimeDomainKHR 值,指定应从中返回校准时间戳值的时间域。

有效使用
有效用法(隐式)
  • VUID-VkCalibratedTimestampInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR

  • VUID-VkCalibratedTimestampInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkCalibratedTimestampInfoKHR-timeDomain-parameter
    timeDomain 必须是一个有效的 VkTimeDomainKHR 值。

支持的时间域集合包括:

// Provided by VK_KHR_calibrated_timestamps
typedef enum VkTimeDomainKHR {
    VK_TIME_DOMAIN_DEVICE_KHR = 0,
    VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR = 1,
    VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR = 2,
    VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR = 3,
  // Provided by VK_EXT_calibrated_timestamps
    VK_TIME_DOMAIN_DEVICE_EXT = VK_TIME_DOMAIN_DEVICE_KHR,
  // Provided by VK_EXT_calibrated_timestamps
    VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR,
  // Provided by VK_EXT_calibrated_timestamps
    VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR,
  // Provided by VK_EXT_calibrated_timestamps
    VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_EXT = VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR,
} VkTimeDomainKHR;

或等效的

// Provided by VK_EXT_calibrated_timestamps
typedef VkTimeDomainKHR VkTimeDomainEXT;
  • VK_TIME_DOMAIN_DEVICE_KHR 指定设备时间域。 此时间域中的时间戳值使用相同的单位,并且可以与使用 vkCmdWriteTimestampvkCmdWriteTimestamp2 捕获的设备时间戳值进行比较,并且被定义为根据设备的 timestampPeriod 递增。

  • VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR 指定 POSIX 平台上可用的 CLOCK_MONOTONIC 时间域。 此时间域中的时间戳值以纳秒为单位,并且可以与使用 POSIX clock_gettime API 捕获的平台时间戳值进行比较,如以下示例计算所示:

支持 VK_KHR_calibrated_timestampsVK_EXT_calibrated_timestamps 的实现将对其所有 VkQueue 使用相同的时间域,以便为 VK_TIME_DOMAIN_DEVICE_KHR 报告的时间戳值可以与通过 vkCmdWriteTimestampvkCmdWriteTimestamp2 捕获的任何时间戳匹配。

struct timespec tv;
clock_gettime(CLOCK_MONOTONIC, &tv);
return tv.tv_nsec + tv.tv_sec*1000000000ull;
  • VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR 指定 POSIX 平台上可用的 CLOCK_MONOTONIC_RAW 时间域。此时间域中的时间戳值以纳秒为单位,并且可以与使用 POSIX clock_gettime API 捕获的平台时间戳值进行比较,如以下示例计算所示:

struct timespec tv;
clock_gettime(CLOCK_MONOTONIC_RAW, &tv);
return tv.tv_nsec + tv.tv_sec*1000000000ull;
  • VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR 指定 Windows 上可用的性能计数器 (QPC) 时间域。 此时间域中的时间戳值与 Windows QueryPerformanceCounter API 提供的单位相同,并且可以与使用该 API 捕获的平台时间戳值进行比较,如以下示例计算所示:

LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
return counter.QuadPart;