资源创建
缓冲区
缓冲区表示数据的线性数组,通过将它们绑定到图形或计算管线(通过描述符集或某些命令),或直接将它们指定为某些命令的参数,从而用于各种目的。
缓冲区由 VkBuffer 句柄表示
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer)
要创建缓冲区,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateBuffer(
VkDevice device,
const VkBufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkBuffer* pBuffer);
-
device是创建缓冲区对象的逻辑设备。 -
pCreateInfo是指向 VkBufferCreateInfo 结构的指针,该结构包含影响缓冲区创建的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pBuffer是指向 VkBuffer 句柄的指针,其中返回生成的缓冲区对象。
VkBufferCreateInfo 结构定义如下
// Provided by VK_VERSION_1_0
typedef struct VkBufferCreateInfo {
VkStructureType sType;
const void* pNext;
VkBufferCreateFlags flags;
VkDeviceSize size;
VkBufferUsageFlags usage;
VkSharingMode sharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices;
} VkBufferCreateInfo;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags是一个 VkBufferCreateFlagBits 的位掩码,指定缓冲区的附加参数。 -
size是要创建的缓冲区的大小(以字节为单位)。 -
usage是一个 VkBufferUsageFlagBits 的位掩码,指定缓冲区的允许用法。 -
sharingMode是一个 VkSharingMode 值,指定当多个队列族访问缓冲区时缓冲区的共享模式。 -
queueFamilyIndexCount是pQueueFamilyIndices数组中的条目数。 -
pQueueFamilyIndices是指向将访问此缓冲区的队列族数组的指针。如果sharingMode不是VK_SHARING_MODE_CONCURRENT,则忽略此参数。
如果 pNext 链包含 VkBufferUsageFlags2CreateInfo 结构,则使用该结构的 VkBufferUsageFlags2CreateInfo::usage,而不是此结构的 usage。
VkBufferUsageFlags2CreateInfo 结构体定义如下:
// Provided by VK_VERSION_1_4
typedef struct VkBufferUsageFlags2CreateInfo {
VkStructureType sType;
const void* pNext;
VkBufferUsageFlags2 usage;
} VkBufferUsageFlags2CreateInfo;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlags2CreateInfo VkBufferUsageFlags2CreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
usage是一个 VkBufferUsageFlagBits2 的位掩码,指定缓冲区的允许用法。
如果此结构包含在缓冲区创建结构的 pNext 链中,则使用 usage 来代替该创建结构中传递的相应 usage 值,从而允许指定额外的使用标志。如果此结构包含在缓冲区查询结构的 pNext 链中,则缓冲区的用法标志将在此结构的 usage 中返回,并且在缓冲区查询结构的 usage 中可表示的用法标志也会在该字段中返回。
以下是在 VkBufferUsageFlags2CreateInfo::usage 中可以设置的位,用于指定缓冲区的用途行为:
// Provided by VK_VERSION_1_4
// Flag bits for VkBufferUsageFlagBits2
typedef VkFlags64 VkBufferUsageFlagBits2;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT = 0x00000001ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT = 0x00000002ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000008ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT = 0x00000010ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT = 0x00000020ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT = 0x00000040ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT = 0x00000080ULL;
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT = 0x00000100ULL;
// Provided by VK_VERSION_1_4
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT = 0x00020000ULL;
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_AMDX_shader_enqueue with VK_KHR_maintenance5 or VK_VERSION_1_4
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL;
#endif
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL;
// Provided by VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_conditional_rendering
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_ray_tracing_pipeline
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL;
// Provided by VK_KHR_maintenance5 with VK_NV_ray_tracing
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_transform_feedback
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_transform_feedback
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_decode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_decode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_encode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL;
// Provided by VK_KHR_maintenance5 with VK_KHR_video_encode_queue
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL;
// Provided by VK_KHR_maintenance5 with (VK_VERSION_1_2 or VK_KHR_buffer_device_address) or VK_EXT_buffer_device_address
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL;
// Provided by VK_KHR_acceleration_structure with VK_KHR_maintenance5
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_descriptor_buffer
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_opacity_micromap
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL;
// Provided by VK_KHR_maintenance5 with VK_EXT_opacity_micromap
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL;
// Provided by VK_EXT_device_generated_commands
static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlagBits2 VkBufferUsageFlagBits2KHR;
-
VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT指定缓冲区可以用作传输命令的源(参见VK_PIPELINE_STAGE_TRANSFER_BIT的定义)。 -
VK_BUFFER_USAGE_2_TRANSFER_DST_BIT指定缓冲区可以用作传输命令的目标。 -
VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT指定缓冲区可以用于创建适用于占用类型为VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER的VkDescriptorSet插槽的VkBufferView。 -
VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT指定缓冲区可以用于创建适用于占用类型为VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER的VkDescriptorSet插槽的VkBufferView。 -
VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT指定缓冲区可以在VkDescriptorBufferInfo中使用,适用于占用类型为VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER或VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT指定缓冲区可以在VkDescriptorBufferInfo中使用,适用于占用类型为VK_DESCRIPTOR_TYPE_STORAGE_BUFFER或VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT指定缓冲区适用于作为buffer参数传递给 vkCmdBindIndexBuffer2 和 vkCmdBindIndexBuffer。 -
VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT指定缓冲区适用于作为pBuffers数组的元素传递给 vkCmdBindVertexBuffers。 -
VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT指定缓冲区适用于作为buffer参数传递给 vkCmdDrawIndirect, vkCmdDrawIndexedIndirect, vkCmdDrawMeshTasksIndirectNV, vkCmdDrawMeshTasksIndirectCountNV,vkCmdDrawMeshTasksIndirectEXT,vkCmdDrawMeshTasksIndirectCountEXT, vkCmdDrawClusterIndirectHUAWEI, 或 vkCmdDispatchIndirect。它也适用于作为VkIndirectCommandsStreamNV的buffer成员,或者VkGeneratedCommandsInfoNV的sequencesCountBuffer、sequencesIndexBuffer或preprocessedBuffer成员。它也适用于作为VkGeneratedCommandsInfoEXT的preprocessAddress或sequenceCountAddress成员的底层缓冲区。 -
VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT指定缓冲区适用于作为buffer参数传递给 vkCmdBeginConditionalRenderingEXT。 -
VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT指定缓冲区适用于使用 vkCmdBindTransformFeedbackBuffersEXT 绑定为变换反馈缓冲区。 -
VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT指定缓冲区适用于使用 vkCmdBeginTransformFeedbackEXT 和 vkCmdEndTransformFeedbackEXT 作为计数器缓冲区。 -
VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT指定缓冲区在绑定为描述符缓冲区时适合包含采样器和组合图像采样器描述符。包含组合图像采样器描述符的缓冲区必须也指定VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT。 -
VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT指定缓冲区在绑定为描述符缓冲区时适合包含资源描述符。 -
VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT指定绑定后,实现可以使用该缓冲区在使用描述符缓冲区时支持推送描述符。 -
VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV指定缓冲区适用于在 vkCmdTraceRaysNV 中使用。 -
VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR指定缓冲区适用于作为着色器绑定表使用。 -
VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR指定缓冲区适用于作为加速结构构建的只读输入。 -
VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR指定缓冲区适用于作为 VkAccelerationStructureKHR 的存储空间。 -
VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT指定缓冲区可以用于通过 vkGetBufferDeviceAddress 获取缓冲区设备地址,并使用该地址从着色器访问缓冲区的内存。 -
VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR指定缓冲区可以在视频解码操作中用作源视频码流缓冲区。 -
VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR保留供将来使用。 -
VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR指定缓冲区可以在视频编码操作中用作目标视频码流缓冲区。 -
VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR保留供将来使用。 -
VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX指定缓冲区可以用作执行图调度的临时内存。 -
VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT指定缓冲区可以用作设备生成命令的预处理缓冲区。
// Provided by VK_VERSION_1_4
typedef VkFlags64 VkBufferUsageFlags2;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkBufferUsageFlags2 VkBufferUsageFlags2KHR;
VkBufferUsageFlags2 是一种位掩码类型,用于设置零个或多个 VkBufferUsageFlagBits2 的掩码。
以下是在 VkBufferCreateInfo::usage 中可以设置的位,用于指定缓冲区的用途行为:
// Provided by VK_VERSION_1_0
typedef enum VkBufferUsageFlagBits {
VK_BUFFER_USAGE_TRANSFER_SRC_BIT = 0x00000001,
VK_BUFFER_USAGE_TRANSFER_DST_BIT = 0x00000002,
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004,
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010,
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020,
VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040,
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080,
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100,
// Provided by VK_VERSION_1_2
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT = 0x00020000,
// Provided by VK_KHR_video_decode_queue
VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000,
// Provided by VK_KHR_video_decode_queue
VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00004000,
// Provided by VK_EXT_transform_feedback
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800,
// Provided by VK_EXT_transform_feedback
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000,
// Provided by VK_EXT_conditional_rendering
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200,
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_AMDX_shader_enqueue
VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000,
#endif
// Provided by VK_KHR_acceleration_structure
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000,
// Provided by VK_KHR_acceleration_structure
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000,
// Provided by VK_KHR_ray_tracing_pipeline
VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400,
// Provided by VK_KHR_video_encode_queue
VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000,
// Provided by VK_KHR_video_encode_queue
VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000,
// Provided by VK_EXT_descriptor_buffer
VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000,
// Provided by VK_EXT_descriptor_buffer
VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000,
// Provided by VK_EXT_descriptor_buffer
VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000,
// Provided by VK_EXT_opacity_micromap
VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000,
// Provided by VK_EXT_opacity_micromap
VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT = 0x01000000,
// Provided by VK_NV_ray_tracing
VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR,
// Provided by VK_EXT_buffer_device_address
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
// Provided by VK_KHR_buffer_device_address
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
} VkBufferUsageFlagBits;
-
VK_BUFFER_USAGE_TRANSFER_SRC_BIT指定缓冲区可以用作传输命令的源(参见VK_PIPELINE_STAGE_TRANSFER_BIT的定义)。 -
VK_BUFFER_USAGE_TRANSFER_DST_BIT指定缓冲区可以用作传输命令的目标。 -
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT指定此缓冲区可以用于创建VkBufferView,该VkBufferView适用于占用类型为VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT指定此缓冲区可以用于创建VkBufferView,该VkBufferView适用于占用类型为VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT指定此缓冲区可以用于VkDescriptorBufferInfo,该VkDescriptorBufferInfo适用于占用类型为VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER或VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT指定此缓冲区可以用于VkDescriptorBufferInfo,该VkDescriptorBufferInfo适用于占用类型为VK_DESCRIPTOR_TYPE_STORAGE_BUFFER或VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC的VkDescriptorSet插槽。 -
VK_BUFFER_USAGE_INDEX_BUFFER_BIT指定此缓冲区适合作为buffer参数传递给 vkCmdBindIndexBuffer2 和 vkCmdBindIndexBuffer。 -
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT指定此缓冲区适合作为pBuffers数组的元素传递给 vkCmdBindVertexBuffers。 -
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT指定此缓冲区适合作为buffer参数传递给 vkCmdDrawIndirect、vkCmdDrawIndexedIndirect、vkCmdDrawMeshTasksIndirectNV、vkCmdDrawMeshTasksIndirectCountNV、vkCmdDrawMeshTasksIndirectEXT、vkCmdDrawMeshTasksIndirectCountEXT、vkCmdDrawClusterIndirectHUAWEI 或 vkCmdDispatchIndirect。它也适用于作为VkIndirectCommandsStreamNV的buffer成员,或VkGeneratedCommandsInfoNV的sequencesCountBuffer、sequencesIndexBuffer或preprocessedBuffer成员。它还适用于作为VkGeneratedCommandsInfoEXT的preprocessAddress或sequenceCountAddress成员的底层缓冲区。 -
VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT指定此缓冲区适合作为buffer参数传递给 vkCmdBeginConditionalRenderingEXT。 -
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT指定此缓冲区适合用于通过 vkCmdBindTransformFeedbackBuffersEXT 绑定为变换反馈缓冲区。 -
VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT指定此缓冲区适合用于通过 vkCmdBeginTransformFeedbackEXT 和 vkCmdEndTransformFeedbackEXT 作为计数器缓冲区。 -
VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT指定当绑定为描述符缓冲区时,此缓冲区适合包含采样器和组合图像采样器描述符。包含组合图像采样器描述符的缓冲区必须同时指定VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT。 -
VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT指定当绑定为描述符缓冲区时,此缓冲区适合包含资源描述符。 -
VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT指定当绑定时,此缓冲区可以被实现用于在使用描述符缓冲区时支持推送描述符。 -
VK_BUFFER_USAGE_RAY_TRACING_BIT_NV指定此缓冲区适合在 vkCmdTraceRaysNV 中使用。 -
VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR指定此缓冲区适合用作着色器绑定表。 -
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR指定此缓冲区适合用作加速结构构建的只读输入。 -
VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR指定此缓冲区适合作为 VkAccelerationStructureKHR 的存储空间。 -
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT指定此缓冲区可以用于通过 vkGetBufferDeviceAddress 检索缓冲区设备地址,并使用该地址从着色器访问缓冲区的内存。 -
VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR指定此缓冲区可以在视频解码操作中用作源视频比特流缓冲区。 -
VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR保留供将来使用。 -
VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR指定此缓冲区可以在视频编码操作中用作目标视频比特流缓冲区。 -
VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR保留供将来使用。 -
VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX指定此缓冲区可以用于 执行图调度的临时内存。
// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferUsageFlags;
VkBufferUsageFlags 是一个位掩码类型,用于设置零个或多个 VkBufferUsageFlagBits 的掩码。
可以在 VkBufferCreateInfo::flags 中设置的位,用于指定缓冲区的其他参数,包括:
// Provided by VK_VERSION_1_0
typedef enum VkBufferCreateFlagBits {
VK_BUFFER_CREATE_SPARSE_BINDING_BIT = 0x00000001,
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
// Provided by VK_VERSION_1_1
VK_BUFFER_CREATE_PROTECTED_BIT = 0x00000008,
// Provided by VK_VERSION_1_2
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000010,
// Provided by VK_EXT_descriptor_buffer
VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000020,
// Provided by VK_KHR_video_maintenance1
VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00000040,
// Provided by VK_EXT_buffer_device_address
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
// Provided by VK_KHR_buffer_device_address
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT,
} VkBufferCreateFlagBits;
-
VK_BUFFER_CREATE_SPARSE_BINDING_BIT指定此缓冲区将使用稀疏内存绑定进行支持。 -
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT指定此缓冲区可以使用稀疏内存绑定进行部分支持。使用此标志创建的缓冲区必须同时使用VK_BUFFER_CREATE_SPARSE_BINDING_BIT标志创建。 -
VK_BUFFER_CREATE_SPARSE_ALIASED_BIT指定此缓冲区将使用稀疏内存绑定进行支持,其内存范围可能同时支持另一个缓冲区(或同一缓冲区的另一部分)。使用此标志创建的缓冲区必须同时使用VK_BUFFER_CREATE_SPARSE_BINDING_BIT标志创建。 -
VK_BUFFER_CREATE_PROTECTED_BIT指定此缓冲区是一个受保护的缓冲区。 -
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT指定此缓冲区的地址可以被保存并在后续运行中重用(例如,用于跟踪捕获和重放),有关更多详细信息,请参阅 VkBufferOpaqueCaptureAddressCreateInfo。 -
VK_BUFFER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT指定当捕获和重放时,此缓冲区可以与描述符缓冲区一起使用(例如,用于跟踪捕获和重放),有关更多详细信息,请参阅 VkOpaqueCaptureDescriptorDataCreateInfoEXT。 -
VK_BUFFER_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR指定此缓冲区可以在 视频编码操作中使用,而无需在缓冲区创建时指定将使用此缓冲区的视频配置文件集。
// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferCreateFlags;
VkBufferCreateFlags 是一个位掩码类型,用于设置零个或多个 VkBufferCreateFlagBits 的掩码。
如果 pNext 链包含 VkDedicatedAllocationBufferCreateInfoNV 结构,那么该结构包含一个启用控制,用于确定缓冲区是否将绑定到专用的内存分配。
VkDedicatedAllocationBufferCreateInfoNV 结构的定义如下:
// Provided by VK_NV_dedicated_allocation
typedef struct VkDedicatedAllocationBufferCreateInfoNV {
VkStructureType sType;
const void* pNext;
VkBool32 dedicatedAllocation;
} VkDedicatedAllocationBufferCreateInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
dedicatedAllocation指定缓冲区是否将绑定到专用分配。
要定义一组**可以**用作缓冲区后备存储的外部内存句柄类型,请将 VkExternalMemoryBufferCreateInfo 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkExternalMemoryBufferCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkExternalMemoryBufferCreateInfo {
VkStructureType sType;
const void* pNext;
VkExternalMemoryHandleTypeFlags handleTypes;
} VkExternalMemoryBufferCreateInfo;
或等效形式:
// Provided by VK_KHR_external_memory
typedef VkExternalMemoryBufferCreateInfo VkExternalMemoryBufferCreateInfoKHR;
|
如果一个缓冲区将绑定到导出或导入的内存,则必须在创建参数中包含具有非零 |
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
handleTypes是零或 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定一个或多个外部内存句柄类型。
要为缓冲区请求特定的设备地址,请将 VkBufferOpaqueCaptureAddressCreateInfo 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkBufferOpaqueCaptureAddressCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_2
typedef struct VkBufferOpaqueCaptureAddressCreateInfo {
VkStructureType sType;
const void* pNext;
uint64_t opaqueCaptureAddress;
} VkBufferOpaqueCaptureAddressCreateInfo;
或等效形式:
// Provided by VK_KHR_buffer_device_address
typedef VkBufferOpaqueCaptureAddressCreateInfo VkBufferOpaqueCaptureAddressCreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
opaqueCaptureAddress是为缓冲区请求的不透明捕获地址。
如果 opaqueCaptureAddress 为零,则不请求特定地址。
如果 opaqueCaptureAddress 不为零,则它**应该**是从同一实现上以相同方式创建的缓冲区的 vkGetBufferOpaqueCaptureAddress 获取的地址。
如果不存在此结构,则相当于 opaqueCaptureAddress 为零。
应用程序**应该**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的缓冲区,以减少 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS 错误的发生。
|
此功能的预期用途是,跟踪捕获/重放工具会将 实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 |
或者,要为缓冲区请求特定的设备地址,请将 VkBufferDeviceAddressCreateInfoEXT 结构添加到 VkBufferCreateInfo 结构的 pNext 链中。VkBufferDeviceAddressCreateInfoEXT 结构定义如下:
// Provided by VK_EXT_buffer_device_address
typedef struct VkBufferDeviceAddressCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkDeviceAddress deviceAddress;
} VkBufferDeviceAddressCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
deviceAddress是为缓冲区请求的设备地址。
如果 deviceAddress 为零,则不请求特定地址。
如果 deviceAddress 不为零,则它**必须**是从同一实现上以相同方式创建的缓冲区检索的地址。该缓冲区**必须**还绑定到以相同方式创建的 VkDeviceMemory 对象。
如果不存在此结构,则相当于 deviceAddress 为零。
应用程序**应该**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的缓冲区,以减少 VK_ERROR_INVALID_DEVICE_ADDRESS_EXT 错误的发生。
VkBufferCollectionBufferCreateInfoFUCHSIA 结构定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionBufferCreateInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
VkBufferCollectionFUCHSIA collection;
uint32_t index;
} VkBufferCollectionBufferCreateInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
index是从中导入内存的缓冲区集合中缓冲区的索引
要销毁缓冲区,请调用
// Provided by VK_VERSION_1_0
void vkDestroyBuffer(
VkDevice device,
VkBuffer buffer,
const VkAllocationCallbacks* pAllocator);
-
device是销毁缓冲区的逻辑设备。 -
buffer是要销毁的缓冲区。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
缓冲区视图
缓冲区视图 表示缓冲区的连续范围以及用于解释数据的特定格式。缓冲区视图用于使着色器能够使用 图像操作访问缓冲区内容。为了创建有效的缓冲区视图,必须使用以下至少一个使用标志创建缓冲区
-
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT -
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
缓冲区视图由 VkBufferView 句柄表示
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView)
要创建缓冲区视图,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateBufferView(
VkDevice device,
const VkBufferViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkBufferView* pView);
-
device是创建缓冲区视图的逻辑设备。 -
pCreateInfo是一个指向 VkBufferViewCreateInfo 结构的指针,该结构包含用于创建缓冲区视图的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pView是一个指向 VkBufferView 句柄的指针,其中返回生成的缓冲区视图对象。
VkBufferViewCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_0
typedef struct VkBufferViewCreateInfo {
VkStructureType sType;
const void* pNext;
VkBufferViewCreateFlags flags;
VkBuffer buffer;
VkFormat format;
VkDeviceSize offset;
VkDeviceSize range;
} VkBufferViewCreateInfo;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags保留供将来使用。 -
buffer是将在其上创建视图的 VkBuffer。 -
format是一个 VkFormat,描述缓冲区中数据元素的格式。 -
offset是从缓冲区基址开始的字节偏移量。着色器对缓冲区视图的访问使用相对于此起始偏移量的寻址方式。 -
range是缓冲区视图的大小(以字节为单位)。如果range等于VK_WHOLE_SIZE,则使用从offset到缓冲区末尾的范围。如果使用了VK_WHOLE_SIZE并且缓冲区的剩余大小不是format的 纹素块大小的倍数,则使用最接近的较小倍数。
缓冲区视图具有缓冲区视图用途,用于标识可以从中创建哪些描述符类型。此用途可以通过在 pNext 链中包含 VkBufferUsageFlags2CreateInfo 结构并在其中指定 usage 值来定义。如果未包含此结构,则它等于用于创建 buffer 的 VkBufferCreateInfo::usage 值。
// Provided by VK_VERSION_1_0
typedef VkFlags VkBufferViewCreateFlags;
VkBufferViewCreateFlags 是一种用于设置掩码的位掩码类型,但目前保留供将来使用。
要销毁缓冲区视图,请调用
// Provided by VK_VERSION_1_0
void vkDestroyBufferView(
VkDevice device,
VkBufferView bufferView,
const VkAllocationCallbacks* pAllocator);
-
device是销毁缓冲区视图的逻辑设备。 -
bufferView是要销毁的缓冲区视图。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
缓冲区视图格式特性
VkBufferView 的有效使用可能取决于缓冲区视图的格式特性,如下定义。此类约束在受影响的有效使用声明中进行了说明。
-
如果支持 Vulkan 1.3 或支持
VK_KHR_format_feature_flags2扩展,则缓冲区视图的格式特性集是通过在与 VkBufferViewCreateInfo::format相同的format上调用 vkGetPhysicalDeviceFormatProperties2 找到的 VkFormatProperties3::bufferFeatures的值。
图像
图像表示多维(最多 3 个)数据数组,这些数组可以用于各种目的(例如,附件、纹理),通过将它们通过描述符集绑定到图形或计算管线,或者通过直接将它们指定为某些命令的参数来使用。
图像由 VkImage 句柄表示。
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)
要创建图像,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateImage(
VkDevice device,
const VkImageCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkImage* pImage);
-
device是创建图像的逻辑设备。 -
pCreateInfo是指向 VkImageCreateInfo 结构的指针,其中包含用于创建图像的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pImage是指向 VkImage 句柄的指针,其中返回生成的图像对象。
VkImageCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_0
typedef struct VkImageCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageCreateFlags flags;
VkImageType imageType;
VkFormat format;
VkExtent3D extent;
uint32_t mipLevels;
uint32_t arrayLayers;
VkSampleCountFlagBits samples;
VkImageTiling tiling;
VkImageUsageFlags usage;
VkSharingMode sharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices;
VkImageLayout initialLayout;
} VkImageCreateInfo;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags是一个 VkImageCreateFlagBits 的位掩码,描述了图像的附加参数。 -
imageType是一个 VkImageType 值,指定图像的基本维度。数组纹理中的图层不计为图像类型的维度。 -
format是一个 VkFormat,描述图像中包含的纹素块的格式和类型。 -
extent是一个 VkExtent3D,描述基本级别每个维度中的数据元素数量。 -
mipLevels描述了可用于图像缩小采样的细节级别数。 -
arrayLayers是图像中的图层数。 -
samples是一个 VkSampleCountFlagBits 值,指定每个纹素的采样数。 -
tiling是一个 VkImageTiling 值,指定内存中纹素块的平铺排列。 -
usage是一个 VkImageUsageFlagBits 的位掩码,描述图像的预期用途。 -
sharingMode是一个 VkSharingMode 值,指定当多个队列族访问图像时图像的共享模式。 -
queueFamilyIndexCount是pQueueFamilyIndices数组中的条目数。 -
pQueueFamilyIndices是一个指向将访问此图像的队列族数组的指针。如果sharingMode不是VK_SHARING_MODE_CONCURRENT,则忽略此项。 -
initialLayout是一个 VkImageLayout 值,指定图像的所有图像子资源的初始 VkImageLayout。请参见图像布局。
与使用 tiling 等于 VK_IMAGE_TILING_OPTIMAL 创建的图像相比,使用 tiling 等于 VK_IMAGE_TILING_LINEAR 创建的图像对其限制和功能有更多的限制。除非其他参数满足所有约束,否则 可能 不支持使用平铺 VK_IMAGE_TILING_LINEAR 创建图像。
-
imageType是VK_IMAGE_TYPE_2D。 -
format不是深度/模板格式。 -
mipLevels为 1。 -
arrayLayers为 1。 -
samples是VK_SAMPLE_COUNT_1_BIT。 -
usage仅包括VK_IMAGE_USAGE_TRANSFER_SRC_BIT和/或VK_IMAGE_USAGE_TRANSFER_DST_BIT。
与使用其他格式创建的图像相比,使用需要采样器 Y′CBCR 转换的格式之一创建的图像,对其限制和功能有更多的限制。除非其他参数满足所有约束,否则 可能 不支持使用需要 Y′CBCR 转换的格式创建图像。
-
imageType是VK_IMAGE_TYPE_2D。 -
mipLevels为 1。 -
arrayLayers为 1,除非启用ycbcrImageArrays功能,或由 VkImageFormatProperties::maxArrayLayers另行指示,由 vkGetPhysicalDeviceImageFormatProperties 返回。 -
samples是VK_SAMPLE_COUNT_1_BIT。
实现 可能 支持超出上述列出的其他限制和功能。
要确定给定格式的有效 usage 位集合,请调用 vkGetPhysicalDeviceFormatProperties。
如果生成的图像的大小将超过 maxResourceSize,则 vkCreateImage 必须 失败并返回 VK_ERROR_OUT_OF_DEVICE_MEMORY。即使所有图像创建参数都满足其有效使用要求,也 可能 发生此失败。
如果在 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements 中,实现报告 VK_TRUE,则使用 VK_IMAGE_USAGE_HOST_TRANSFER_BIT 必须 不会影响图像的内存类型要求,如 稀疏资源内存要求 和 资源内存关联 中所述。
|
对于未创建 对于使用 |
VkBufferCollectionImageCreateInfoFUCHSIA 结构定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionImageCreateInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
VkBufferCollectionFUCHSIA collection;
uint32_t index;
} VkBufferCollectionImageCreateInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
index是从中导入内存的缓冲区集合中缓冲区的索引
VkImageStencilUsageCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_2
typedef struct VkImageStencilUsageCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageUsageFlags stencilUsage;
} VkImageStencilUsageCreateInfo;
或等效形式:
// Provided by VK_EXT_separate_stencil_usage
typedef VkImageStencilUsageCreateInfo VkImageStencilUsageCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
stencilUsage是一个 VkImageUsageFlagBits 的位掩码,描述图像模板方面的预期用法。
如果 VkImageCreateInfo 的 pNext 链包含 VkImageStencilUsageCreateInfo 结构,那么该结构包含深度模板格式图像的模板方面的特定用法标志。
此结构指定仅适用于深度/模板格式图像的模板方面的图像用法。当此结构包含在 VkImageCreateInfo 的 pNext 链中时,图像的模板方面必须仅按照 stencilUsage 指定的方式使用。当此结构未包含在 VkImageCreateInfo 的 pNext 链中时,图像的模板方面必须仅按照 VkImageCreateInfo::usage 指定的方式使用。图像的其他方面的使用不受此结构的影响。
此结构可以也包含在 VkPhysicalDeviceImageFormatInfo2 的 pNext 链中,以使用 vkGetPhysicalDeviceImageFormatProperties2 查询特定于图像创建参数组合(包括图像模板方面的一组单独的用法标志)的其他功能。当此结构不包含在 VkPhysicalDeviceImageFormatInfo2 的 pNext 链中时,stencilUsage 的隐式值与 VkPhysicalDeviceImageFormatInfo2::usage 的值匹配。
如果 pNext 链包含 VkDedicatedAllocationImageCreateInfoNV 结构,那么该结构包含一个启用标志,用于控制图像是否具有绑定到它的专用内存分配。
VkDedicatedAllocationImageCreateInfoNV 结构定义如下:
// Provided by VK_NV_dedicated_allocation
typedef struct VkDedicatedAllocationImageCreateInfoNV {
VkStructureType sType;
const void* pNext;
VkBool32 dedicatedAllocation;
} VkDedicatedAllocationImageCreateInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
dedicatedAllocation指定图像是否将具有绑定到它的专用分配。
|
对颜色和深度/模板附件或其他大型图像使用专用分配可能会提高某些设备上的性能。 |
要定义一组可以用作图像后备存储的外部内存句柄类型,请将 VkExternalMemoryImageCreateInfo 结构添加到 VkImageCreateInfo 结构的 pNext 链中。VkExternalMemoryImageCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkExternalMemoryImageCreateInfo {
VkStructureType sType;
const void* pNext;
VkExternalMemoryHandleTypeFlags handleTypes;
} VkExternalMemoryImageCreateInfo;
或等效形式:
// Provided by VK_KHR_external_memory
typedef VkExternalMemoryImageCreateInfo VkExternalMemoryImageCreateInfoKHR;
|
对于将绑定到已导出或导入的内存的图像,其创建参数中必须包含具有非零 |
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
handleTypes是零或 VkExternalMemoryHandleTypeFlagBits 的位掩码,指定一个或多个外部内存句柄类型。
如果 pNext 链包含 VkExternalMemoryImageCreateInfoNV 结构,则该结构定义一组可以用作图像后备存储的外部内存句柄类型。
VkExternalMemoryImageCreateInfoNV 结构定义如下:
// Provided by VK_NV_external_memory
typedef struct VkExternalMemoryImageCreateInfoNV {
VkStructureType sType;
const void* pNext;
VkExternalMemoryHandleTypeFlagsNV handleTypes;
} VkExternalMemoryImageCreateInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
handleTypes为零或 VkExternalMemoryHandleTypeFlagBitsNV 的位掩码,指定一个或多个外部内存句柄类型。
VkExternalFormatANDROID 定义如下:
// Provided by VK_ANDROID_external_memory_android_hardware_buffer
typedef struct VkExternalFormatANDROID {
VkStructureType sType;
void* pNext;
uint64_t externalFormat;
} VkExternalFormatANDROID;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
externalFormat是外部格式的实现定义标识符
当包含在另一个结构的 pNext 链中时,它表示超出 Android 硬件缓冲区的 VkFormat 值所提供的其他格式信息。如果 externalFormat 为零,则表示不使用任何外部格式,并且实现应仅依赖其他格式信息。如果此结构不存在,则等效于将 externalFormat 设置为零。
要创建一个使用 QNX 屏幕外部格式 的图像,请在 VkImageCreateInfo 的 pNext 链中添加一个 VkExternalFormatQNX 结构体。VkExternalFormatQNX 定义如下:
// Provided by VK_QNX_external_memory_screen_buffer
typedef struct VkExternalFormatQNX {
VkStructureType sType;
void* pNext;
uint64_t externalFormat;
} VkExternalFormatQNX;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
externalFormat是外部格式的实现定义标识符
如果 externalFormat 为零,则效果等同于不存在 VkExternalFormatQNX 结构体。否则,image 将具有指定的外部格式。
如果 VkImageCreateInfo 的 pNext 链包含一个 VkImageSwapchainCreateInfoKHR 结构体,则该结构体包含一个交换链句柄,指示该图像将绑定到该交换链的内存。
VkImageSwapchainCreateInfoKHR 结构体定义如下:
// Provided by VK_VERSION_1_1 with VK_KHR_swapchain, VK_KHR_device_group with VK_KHR_swapchain
typedef struct VkImageSwapchainCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkSwapchainKHR swapchain;
} VkImageSwapchainCreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
swapchain是 VK_NULL_HANDLE 或图像将绑定到的交换链的句柄。
如果 VkImageCreateInfo 的 pNext 链包含一个 VkImageFormatListCreateInfo 结构体,则该结构体包含一个列表,其中列出了创建此图像的视图时可以使用的所有格式。
VkImageFormatListCreateInfo 结构体定义如下:
// Provided by VK_VERSION_1_2
typedef struct VkImageFormatListCreateInfo {
VkStructureType sType;
const void* pNext;
uint32_t viewFormatCount;
const VkFormat* pViewFormats;
} VkImageFormatListCreateInfo;
或等效形式:
// Provided by VK_KHR_image_format_list
typedef VkImageFormatListCreateInfo VkImageFormatListCreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
viewFormatCount是pViewFormats数组中的条目数。 -
pViewFormats是指向 VkFormat 值数组的指针,指定创建此图像的视图时可以使用的所有格式。
如果 viewFormatCount 为零,则忽略 pViewFormats,并且创建图像时就像 VkImageCreateInfo 的 pNext 链中未包含 VkImageFormatListCreateInfo 结构体一样。
如果 VkImageCreateInfo 的 pNext 链包含 VkImageDrmFormatModifierListCreateInfoEXT 结构体,则将使用该结构体中列出的 Linux DRM 格式修饰符之一创建图像。修饰符的选择取决于具体实现。
// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierListCreateInfoEXT {
VkStructureType sType;
const void* pNext;
uint32_t drmFormatModifierCount;
const uint64_t* pDrmFormatModifiers;
} VkImageDrmFormatModifierListCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
drmFormatModifierCount是pDrmFormatModifiers数组的长度。 -
pDrmFormatModifiers是指向 _Linux DRM 格式修饰符_数组的指针。
如果 VkImageCreateInfo 的 pNext 链包含一个 VkImageDrmFormatModifierExplicitCreateInfoEXT 结构体,则将使用该结构体定义的 Linux DRM 格式修饰符和内存布局创建图像。
// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierExplicitCreateInfoEXT {
VkStructureType sType;
const void* pNext;
uint64_t drmFormatModifier;
uint32_t drmFormatModifierPlaneCount;
const VkSubresourceLayout* pPlaneLayouts;
} VkImageDrmFormatModifierExplicitCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
drmFormatModifier是将用于创建图像的 _Linux DRM 格式修饰符_。 -
drmFormatModifierPlaneCount是图像中_内存平面_的数量(由 VkDrmFormatModifierPropertiesEXT 报告),也是pPlaneLayouts数组的长度。 -
pPlaneLayouts是指向描述图像_内存平面_的 VkSubresourceLayout 结构体数组的指针。
pPlaneLayouts 的第 i个成员描述图像的第 i个_内存平面_的布局(即,VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT)。在 pPlaneLayouts 的每个元素中,实现必须忽略 size。实现计算每个平面大小,应用程序可以使用 vkGetImageSubresourceLayout 查询大小。
当使用 VkImageDrmFormatModifierExplicitCreateInfoEXT 创建图像时,应用程序有责任满足所有有效的使用要求。但是,实现必须验证提供的 pPlaneLayouts,当与提供的 drmFormatModifier 以及 VkImageCreateInfo 及其 pNext 链中的其他创建参数组合时,会生成一个有效的图像。(此验证必然是特定于实现的,并且不在 Vulkan 的范围内,因此没有通过有效的使用要求描述)。如果此验证失败,则 vkCreateImage 返回 VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT。
如果 VkImageCreateInfo 的 pNext 列表中包含 VkImageCompressionControlEXT 结构,则该结构描述此图像的压缩控制。
VkImageCompressionControlEXT 结构定义如下:
// Provided by VK_EXT_image_compression_control
typedef struct VkImageCompressionControlEXT {
VkStructureType sType;
const void* pNext;
VkImageCompressionFlagsEXT flags;
uint32_t compressionControlPlaneCount;
VkImageCompressionFixedRateFlagsEXT* pFixedRateFlags;
} VkImageCompressionControlEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags是一个 VkImageCompressionFlagBitsEXT 的位掩码,描述图像的压缩控制。 -
compressionControlPlaneCount是pFixedRateFlags数组中的条目数。 -
pFixedRateFlags为NULL或指向 VkImageCompressionFixedRateFlagsEXT 位域数组的指针,描述每个图像平面的允许固定速率压缩率。如果flags不包含VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,则忽略此字段。
如果启用,固定速率压缩将以实现定义的方式进行,并且可能以块粒度应用。在这种情况下,写入单个纹素可能会修改同一块中其他纹素的值。
|
某些压缩属性的组合可能不受支持。例如,某些实现可能不支持多平面格式的每个平面具有不同的固定速率压缩率,并且如果请求的速率不同,将无法为任何平面启用固定速率压缩。 |
VkImageCompressionControlEXT::flags 的可能值,指定图像的压缩控制,包括:
// Provided by VK_EXT_image_compression_control
typedef enum VkImageCompressionFlagBitsEXT {
VK_IMAGE_COMPRESSION_DEFAULT_EXT = 0,
VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT = 0x00000001,
VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT = 0x00000002,
VK_IMAGE_COMPRESSION_DISABLED_EXT = 0x00000004,
} VkImageCompressionFlagBitsEXT;
-
VK_IMAGE_COMPRESSION_DEFAULT_EXT指定使用默认图像压缩设置。实现必须不应用固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT指定实现可能以实现定义的方式,根据图像的属性选择任何受支持的固定速率压缩设置。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT指定可能使用固定速率压缩,并且允许的压缩率由 VkImageCompressionControlEXT::pFixedRateFlags指定。 -
VK_IMAGE_COMPRESSION_DISABLED_EXT指定应该禁用所有无损和固定速率压缩。
如果 VkImageCompressionControlEXT::flags 为 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,则 pFixedRateFlags 数组的第 ith 个成员指定图像的第 ith 个平面的允许压缩率。
|
如果 VkImageCompressionControlEXT:: |
// Provided by VK_EXT_image_compression_control
typedef VkFlags VkImageCompressionFlagsEXT;
VkImageCompressionFlagsEXT 是一种用于设置零个或多个 VkImageCompressionFlagBitsEXT 的掩码的位掩码类型。
// Provided by VK_EXT_image_compression_control
typedef VkFlags VkImageCompressionFixedRateFlagsEXT;
VkImageCompressionFixedRateFlagsEXT 是一种用于设置零个或多个 VkImageCompressionFixedRateFlagBitsEXT 的掩码的位掩码类型。
可以在 VkImageCompressionControlEXT::pFixedRateFlags 中设置的位,指定图像平面的允许压缩率,包括:
// Provided by VK_EXT_image_compression_control
typedef enum VkImageCompressionFixedRateFlagBitsEXT {
VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT = 0,
VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT = 0x00000001,
VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT = 0x00000002,
VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT = 0x00000004,
VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT = 0x00000008,
VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT = 0x00000010,
VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT = 0x00000020,
VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT = 0x00000040,
VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT = 0x00000080,
VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT = 0x00000100,
VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT = 0x00000200,
VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT = 0x00000400,
VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT = 0x00000800,
VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT = 0x00001000,
VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT = 0x00002000,
VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT = 0x00004000,
VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT = 0x00008000,
VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT = 0x00010000,
VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT = 0x00020000,
VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT = 0x00040000,
VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT = 0x00080000,
VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT = 0x00100000,
VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT = 0x00200000,
VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT = 0x00400000,
VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT = 0x00800000,
} VkImageCompressionFixedRateFlagBitsEXT;
-
VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT指定必须不使用固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT指定可能使用每分量 [1,2) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT指定可能使用每分量 [2,3) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT指定可能使用每分量 [3,4) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT指定可能使用每分量 [4,5) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT指定可能使用每分量 [5,6) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT指定可能使用每分量 [6,7) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT指定可能使用每分量 [7,8) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT指定可能使用每分量 [8,9) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT指定可能使用每分量 [9,10) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT指定可能使用每分量 [10,11) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT指定可能使用每分量 [11,12) 位的固定速率压缩。 -
VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT指定可能使用每分量至少 12 位的固定速率压缩。
如果格式的不同分量具有不同的比特率,则 VkImageCompressionControlEXT::pFixedRateFlags 描述的是分配了最大比特数的分量的速率,按比例缩放。例如,要请求将 VK_FORMAT_A2R10G10B10_UNORM_PACK32 格式以每像素 8 比特的速率存储,请使用 VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT (最大分量为 10 比特,存储为原始大小的四分之一,即 2.5 比特,向下取整)。
如果 flags 包含 VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT,并且 VkImageCompressionControlEXT::pFixedRateFlags 中为某个平面设置了多个位,则实现 **应该** 应用所支持的最低允许比特率。
|
选择“每分量比特数”术语是为了让相同的压缩率描述应用于仅在分量数量上不同的格式的相同压缩程度。例如, |
要查询图像的压缩属性,请在调用 vkGetImageSubresourceLayout2 或 vkGetImageSubresourceLayout2 时,将 VkImageCompressionPropertiesEXT 结构添加到 VkSubresourceLayout2 结构的 pNext 链中。
要确定给定图像格式支持的压缩率,请在调用 vkGetPhysicalDeviceImageFormatProperties2 时,将 VkImageCompressionPropertiesEXT 结构添加到 VkImageFormatProperties2 结构的 pNext 链中。
|
由于默认情况下禁用固定速率压缩,因此传递给 vkGetPhysicalDeviceImageFormatProperties2 的 VkImageCompressionPropertiesEXT 结构不会指示任何固定速率压缩支持,除非 VkPhysicalDeviceImageFormatInfo2 结构的 |
VkImageCompressionPropertiesEXT 结构的定义如下:
// Provided by VK_EXT_image_compression_control
typedef struct VkImageCompressionPropertiesEXT {
VkStructureType sType;
void* pNext;
VkImageCompressionFlagsEXT imageCompressionFlags;
VkImageCompressionFixedRateFlagsEXT imageCompressionFixedRateFlags;
} VkImageCompressionPropertiesEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
imageCompressionFlags返回一个描述应用于图像的压缩控制的值。该值将为VK_IMAGE_COMPRESSION_DEFAULT_EXT(表示没有固定速率压缩)、VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT(表示固定速率压缩) 或VK_IMAGE_COMPRESSION_DISABLED_EXT(表示没有压缩)。 -
imageCompressionFixedRateFlags返回一个 VkImageCompressionFixedRateFlagsEXT 值,描述应用于图像指定方面的压缩率。
如果 VkImageCreateInfo 的 pNext 列表中包含 VkImageAlignmentControlCreateInfoMESA 结构,则该结构描述了此图像的所需对齐方式。
VkImageAlignmentControlCreateInfoMESA 结构的定义如下:
// Provided by VK_MESA_image_alignment_control
typedef struct VkImageAlignmentControlCreateInfoMESA {
VkStructureType sType;
const void* pNext;
uint32_t maximumRequestedAlignment;
} VkImageAlignmentControlCreateInfoMESA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
maximumRequestedAlignment指定图像的最大对齐方式。
如果 maximumRequestedAlignment 不为 0,则实现 **应该** 选择一个图像内存布局,该布局要求的对齐方式不大于 VkMemoryRequirements::alignment 中报告的 maximumRequestedAlignment。如果给定图像创建参数不存在这样的布局,则实现 **应该** 返回 VkMemoryRequirements 中支持的最小对齐方式。
如果实现需要禁用图像压缩才能满足 maximumRequestedAlignment(其中更大的对齐方式将启用图像压缩),则实现 **应该** 不使用 maximumRequestedAlignment,并且 **应该** 返回不影响压缩的最小对齐方式。如果启用了 imageCompressionControl 功能,则应用程序 **可以** 将一个带有 VK_IMAGE_COMPRESSION_DISABLED_EXT 的 VkImageCompressionControlEXT 链接起来。在这种情况下,当实现决定对齐方式时,**应该** 不考虑图像压缩。
以下位 **可以** 在
-
VkImageViewUsageCreateInfo::
usage中设置 -
VkImageStencilUsageCreateInfo::
stencilUsage -
VkImageCreateInfo::
usage
中设置,用于指定图像的预期用途,并且是
// Provided by VK_VERSION_1_0
typedef enum VkImageUsageFlagBits {
VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,
VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,
VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
// Provided by VK_VERSION_1_4
VK_IMAGE_USAGE_HOST_TRANSFER_BIT = 0x00400000,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000,
// Provided by VK_EXT_fragment_density_map
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200,
// Provided by VK_KHR_fragment_shading_rate
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000,
// Provided by VK_EXT_attachment_feedback_loop_layout
VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x00080000,
// Provided by VK_HUAWEI_invocation_mask
VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000,
// Provided by VK_QCOM_image_processing
VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000,
// Provided by VK_QCOM_image_processing
VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000,
// Provided by VK_KHR_video_encode_quantization_map
VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x02000000,
// Provided by VK_KHR_video_encode_quantization_map
VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x04000000,
// Provided by VK_NV_shading_rate_image
VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR,
// Provided by VK_EXT_host_image_copy
VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT = VK_IMAGE_USAGE_HOST_TRANSFER_BIT,
} VkImageUsageFlagBits;
-
VK_IMAGE_USAGE_TRANSFER_SRC_BIT指定图像 **可以** 用作传输命令的源。 -
VK_IMAGE_USAGE_TRANSFER_DST_BIT指定图像 **可以** 用作传输命令的目标。 -
VK_IMAGE_USAGE_SAMPLED_BIT指定图像 **可以** 用于创建适合占用VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE或VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER类型的VkDescriptorSet插槽的VkImageView,并由着色器采样。 -
VK_IMAGE_USAGE_STORAGE_BIT指定图像 **可以** 用于创建适合占用VK_DESCRIPTOR_TYPE_STORAGE_IMAGE类型的VkDescriptorSet插槽的VkImageView。 -
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT指定图像 **可以** 用于创建适合用作VkFramebuffer中的颜色或解析附件的VkImageView。 -
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT指定图像 **可以** 用于创建适合用作VkFramebuffer中的深度/模板或深度/模板解析附件的VkImageView。 -
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT指定实现**可能**支持使用带有VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT的内存分配来支持具有此用法的图像。对于任何可用于创建适用于用作颜色、解析、深度/模板或输入附件的VkImageView的图像,都可以设置此位。 -
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT指定该图像**可以**用于创建适用于占用VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT类型的VkDescriptorSet插槽的VkImageView;从着色器中读取为输入附件;并在帧缓冲区中用作输入附件。 -
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT指定该图像**可以**用于创建适用于用作片段密度图图像的VkImageView。 -
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR指定该图像**可以**用于创建适用于用作片段着色率附件或着色率图像的VkImageView。 -
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR指定该图像**可以**在视频解码操作中用作解码输出图片。 -
VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR保留供将来使用。 -
VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR指定该图像**可以**在视频解码操作中用作输出重建图片或输入参考图片。 -
VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR保留供将来使用。 -
VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR指定该图像**可以**在视频编码操作中用作编码输入图片。 -
VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR指定该图像**可以**在视频编码操作中用作输出重建图片或输入参考图片。 -
VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT指定该图像**可以**转换为VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT布局,以便在VkFramebuffer中用作颜色或深度/模板附件,和/或在同一渲染过程中用作着色器中的只读输入资源(采样图像、组合图像采样器或输入附件)。 -
VK_IMAGE_USAGE_HOST_TRANSFER_BIT指定该图像**可以**与主机复制命令和主机布局转换一起使用。 -
VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR指定该图像**可以**在视频编码操作中用作量化增量图。 -
VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR指定该图像**可以**在视频编码操作中用作强调图。
// Provided by VK_VERSION_1_0
typedef VkFlags VkImageUsageFlags;
VkImageUsageFlags 是用于设置零个或多个 VkImageUsageFlagBits 的掩码类型的位掩码。
创建 VkImageView 时,**必须**设置以下 VkImageUsageFlagBits 之一
-
VK_IMAGE_USAGE_SAMPLED_BIT -
VK_IMAGE_USAGE_STORAGE_BIT -
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT -
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT -
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT -
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT -
VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR -
VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT -
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR -
VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR -
VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR -
VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR -
VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM -
VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM -
VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR -
VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR
可以在 VkImageCreateInfo::flags 中设置的位,指定图像的附加参数,是
// Provided by VK_VERSION_1_0
typedef enum VkImageCreateFlagBits {
VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,
VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,
VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_ALIAS_BIT = 0x00000400,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT = 0x00000040,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT = 0x00000020,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT = 0x00000080,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_EXTENDED_USAGE_BIT = 0x00000100,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_PROTECTED_BIT = 0x00000800,
// Provided by VK_VERSION_1_1
VK_IMAGE_CREATE_DISJOINT_BIT = 0x00000200,
// Provided by VK_NV_corner_sampled_image
VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0x00002000,
// Provided by VK_EXT_sample_locations
VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000,
// Provided by VK_EXT_fragment_density_map
VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0x00004000,
// Provided by VK_EXT_descriptor_buffer
VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00010000,
// Provided by VK_EXT_multisampled_render_to_single_sampled
VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000,
// Provided by VK_EXT_image_2d_view_of_3d
VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000,
// Provided by VK_QCOM_fragment_density_map_offset
VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0x00008000,
// Provided by VK_KHR_video_maintenance1
VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00100000,
// Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,
// Provided by VK_KHR_maintenance1
VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,
// Provided by VK_KHR_maintenance2
VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,
// Provided by VK_KHR_maintenance2
VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_IMAGE_CREATE_DISJOINT_BIT_KHR = VK_IMAGE_CREATE_DISJOINT_BIT,
// Provided by VK_KHR_bind_memory2
VK_IMAGE_CREATE_ALIAS_BIT_KHR = VK_IMAGE_CREATE_ALIAS_BIT,
} VkImageCreateFlagBits;
-
VK_IMAGE_CREATE_SPARSE_BINDING_BIT指定该图像将使用稀疏内存绑定进行支持。 -
VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT指定该图像**可以**使用稀疏内存绑定进行部分支持。使用此标志创建的图像**必须**也使用VK_IMAGE_CREATE_SPARSE_BINDING_BIT标志创建。 -
VK_IMAGE_CREATE_SPARSE_ALIASED_BIT指定该图像将使用稀疏内存绑定进行支持,其内存范围可能同时支持另一个图像(或同一图像的另一部分)。使用此标志创建的图像**必须**也使用VK_IMAGE_CREATE_SPARSE_BINDING_BIT标志创建。 -
VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT指定该图像**可以**用于创建具有与图像不同格式的VkImageView。对于多平面格式,VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT指定可以创建图像的_平面_的VkImageView。 -
VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT指定该图像**可以**用于创建类型为VK_IMAGE_VIEW_TYPE_CUBE或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY的VkImageView。 -
VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT指定该图像**可以**用于创建类型为VK_IMAGE_VIEW_TYPE_2D或VK_IMAGE_VIEW_TYPE_2D_ARRAY的VkImageView。 -
VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT指定该图像**可以**用于创建类型为VK_IMAGE_VIEW_TYPE_2D的VkImageView。 -
VK_IMAGE_CREATE_PROTECTED_BIT指定该图像是受保护的图像。 -
VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT指定该图像**可以**与传递给 vkBindImageMemory2 的 VkBindImageMemoryDeviceGroupInfo 结构的splitInstanceBindRegionCount成员的非零值一起使用。此标志还具有使图像使用标准稀疏图像块尺寸的效果。 -
VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT指定具有压缩格式的图像**可以**用于创建具有未压缩格式的VkImageView,其中图像视图中的每个纹素都对应于图像的压缩纹素块。 -
VK_IMAGE_CREATE_EXTENDED_USAGE_BIT指定该图像**可以**使用不支持为创建图像的格式但支持至少一种从图像创建的VkImageView**可以**拥有的格式的用法标志创建。 -
VK_IMAGE_CREATE_DISJOINT_BIT指定具有多平面格式的图像**必须**将每个平面分别绑定到内存,而不是对整个图像进行单个内存绑定;此位的存在将_分离图像_与未设置此位的图像区分开来。 -
VK_IMAGE_CREATE_ALIAS_BIT指定使用相同创建参数创建且别名到同一内存的两个图像可以彼此一致地解释内存内容,但须遵守内存别名部分中描述的规则。此标志进一步指定不连续图像的每个平面可以与单平面图像共享内存中的非线性表示,并且根据多平面格式的兼容平面中的规则,单平面图像可以与多平面不连续图像的平面共享内存中的非线性表示。如果pNext链包含一个 VkExternalMemoryImageCreateInfo 或 VkExternalMemoryImageCreateInfoNV 结构,且其handleTypes成员不为0,则如同设置了VK_IMAGE_CREATE_ALIAS_BIT。 -
VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT指定具有深度或深度/模板格式的图像在用作深度/模板附件时可以与自定义采样位置一起使用。 -
VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV指定该图像是角采样图像。 -
VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT指定图像可以采用子采样格式,当作为具有片段密度图附件的渲染过程的附件写入时,这种格式可能更优化。访问子采样图像有额外的注意事项-
如果采样器创建时
flags不包含VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,或者未使用具有VkDescriptorSetLayoutBinding中不可变采样器的组合图像采样器进行采样,则作为图像采样器读取的图像数据将具有未定义的值。 -
如果内容不是在同一渲染过程的较早子过程中作为附件写入的,则使用输入附件读取的图像数据将具有未定义的值。
-
如果
VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::subsampledCoarseReconstructionEarlyAccess为VK_TRUE,并且采样器创建时flags包含VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT,则在片段着色器中作为图像采样器读取的图像数据将在VK_PIPELINE_STAGE_VERTEX_SHADER_BIT期间被设备额外读取。 -
如果
VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::subsampledLoads为VK_TRUE,则使用加载操作读取的图像数据将被重采样为渲染过程的片段密度。否则,图像数据的值是未定义的。 -
如果图像存储为渲染过程附件,则渲染区域之外的图像内容将采用未定义的值。
-
-
VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM指定图像可以在具有非零片段密度图偏移的渲染过程中使用。在具有非零偏移的渲染过程中,片段密度图附件、输入附件、颜色附件、深度/模板附件、解析附件和保留附件必须使用VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM创建。 -
VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT指定当捕获和回放(例如,用于跟踪捕获和回放)时,图像可以与描述符缓冲区一起使用,有关详细信息,请参见 VkOpaqueCaptureDescriptorDataCreateInfoEXT。 -
VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT指定图像可以与 多采样渲染作为单采样帧缓冲区附件一起使用 -
VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR指定图像可以在视频编码操作中使用,而无需在图像创建时指定将使用该图像的视频配置文件集,但仅用作DPB图片的图像除外,只要该图像在其他方面与相关的视频配置文件兼容。当用作以下内容时,这使得无需额外复制或转换即可交换视频图片数据:
这包括使用
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR和VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR创建的图像,这对于在支持VK_VIDEO_DECODE_CAPABILITY_DPB_AND_OUTPUT_COINCIDE_BIT_KHR的实现上,在视频解码操作中使用相同的视频图片作为重建图片和解码输出图片是必需的。但是,仅具有 DPB 用途的图像仍然与其创建时使用的视频配置文件绑定,因为此类仅限 DPB 的图像的数据布局可能依赖于实现和编解码器。
如果应用程序想要共享或重用支持此类图像的设备内存(例如,出于时间别名的目的),那么它应该为每个视频配置文件创建单独的图像对象,并将它们绑定到相同的底层设备内存范围,类似于如何在不同的视频会话或任何其他内存支持的资源之间共享内存资源一样。
// Provided by VK_VERSION_1_0
typedef VkFlags VkImageCreateFlags;
VkImageCreateFlags 是一种位掩码类型,用于设置零个或多个 VkImageCreateFlagBits 的掩码。
VkImageCreateInfo::imageType 的可能值,指定图像的基本维度为:
// Provided by VK_VERSION_1_0
typedef enum VkImageType {
VK_IMAGE_TYPE_1D = 0,
VK_IMAGE_TYPE_2D = 1,
VK_IMAGE_TYPE_3D = 2,
} VkImageType;
-
VK_IMAGE_TYPE_1D指定一维图像。 -
VK_IMAGE_TYPE_2D指定二维图像。 -
VK_IMAGE_TYPE_3D指定三维图像。
VkImageCreateInfo::tiling 的可能值,指定图像中纹素块的平铺排列为:
// Provided by VK_VERSION_1_0
typedef enum VkImageTiling {
VK_IMAGE_TILING_OPTIMAL = 0,
VK_IMAGE_TILING_LINEAR = 1,
// Provided by VK_EXT_image_drm_format_modifier
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT = 1000158000,
} VkImageTiling;
-
VK_IMAGE_TILING_OPTIMAL指定最佳平铺(纹素以依赖于实现的排列方式布局,以实现更高效的内存访问)。 -
VK_IMAGE_TILING_LINEAR指定线性平铺(纹素以行主序在内存中布局,每行可能有一些填充)。 -
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT指定图像的平铺方式由 Linux DRM 格式修饰符定义。该修饰符在创建图像时通过 VkImageDrmFormatModifierListCreateInfoEXT 或 VkImageDrmFormatModifierExplicitCreateInfoEXT 指定,并且可以通过 vkGetImageDrmFormatModifierPropertiesEXT 查询。
要查询图像子资源的内存布局,请调用
// Provided by VK_VERSION_1_0
void vkGetImageSubresourceLayout(
VkDevice device,
VkImage image,
const VkImageSubresource* pSubresource,
VkSubresourceLayout* pLayout);
-
device是拥有该图像的逻辑设备。 -
image是要查询布局的图像。 -
pSubresource是指向 VkImageSubresource 结构的指针,该结构从图像中选择特定的图像子资源。 -
pLayout是指向 VkSubresourceLayout 结构的指针,其中返回布局。
如果图像的平铺方式是 VK_IMAGE_TILING_LINEAR 且其格式是多平面格式,则 vkGetImageSubresourceLayout 描述图像的一个格式平面。如果图像的平铺方式是 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 vkGetImageSubresourceLayout 描述图像的一个内存平面。如果图像的平铺方式是 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 并且图像是 非线性的,则返回的布局具有实现相关的含义;图像的 DRM 格式修饰符的供应商可以提供文档来解释如何解释返回的布局。
vkGetImageSubresourceLayout 对于单个图像的生命周期是不变的。但是,在将图像绑定到内存之前,Android 硬件缓冲区或 QNX 屏幕缓冲区外部内存中图像的子资源布局是未知的,因此应用程序在绑定之前必须不要为此类图像调用 vkGetImageSubresourceLayout。
VkImageSubresource 结构定义为
// Provided by VK_VERSION_1_0
typedef struct VkImageSubresource {
VkImageAspectFlags aspectMask;
uint32_t mipLevel;
uint32_t arrayLayer;
} VkImageSubresource;
-
aspectMask是一个 VkImageAspectFlags 值,用于选择图像的方面。 -
mipLevel选择 mipmap 级别。 -
arrayLayer选择数组层。
图像子资源布局的信息在 VkSubresourceLayout 结构体中返回。
// Provided by VK_VERSION_1_0
typedef struct VkSubresourceLayout {
VkDeviceSize offset;
VkDeviceSize size;
VkDeviceSize rowPitch;
VkDeviceSize arrayPitch;
VkDeviceSize depthPitch;
} VkSubresourceLayout;
-
offset是从图像或平面的起始位置到图像子资源起始位置的字节偏移量。 -
size是图像子资源的大小,以字节为单位。size包括基于rowPitch所需的任何额外内存。 -
rowPitch描述了图像中每行纹素之间的字节数。 -
arrayPitch描述了图像中每个数组层之间的字节数。 -
depthPitch描述了 3D 图像中每个切片之间的字节数。
如果图像是线性的,那么 rowPitch、arrayPitch 和 depthPitch 描述了图像子资源在线性内存中的布局。对于未压缩的格式,rowPitch 是相邻行中具有相同 x 坐标的纹素之间的字节数(y 坐标相差 1)。arrayPitch 是图像的相邻数组层中具有相同 x 和 y 坐标的纹素之间的字节数(数组层的值相差 1)。depthPitch 是 3D 图像相邻切片中具有相同 x 和 y 坐标的纹素之间的字节数(z 坐标相差 1)。用寻址公式表示,图像子资源中纹素的起始字节地址为
// (x,y,z,layer) are in texel coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*elementSize + offset
对于压缩格式,rowPitch 是相邻行中压缩纹素块之间的字节数。arrayPitch 是相邻数组层中压缩纹素块之间的字节数。depthPitch 是 3D 图像相邻切片中压缩纹素块之间的字节数。
// (x,y,z,layer) are in compressed texel block coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*compressedTexelBlockByteSize + offset;
对于不是作为数组创建的图像,arrayPitch 的值是未定义的。depthPitch 仅为 3D 图像定义。
如果图像具有单平面颜色格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 VkImageSubresource 的 aspectMask 成员必须为 VK_IMAGE_ASPECT_COLOR_BIT。
如果图像具有深度/模板格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 aspectMask 必须为 VK_IMAGE_ASPECT_DEPTH_BIT 或 VK_IMAGE_ASPECT_STENCIL_BIT。在分别存储深度和模板方面的实现中,查询这些图像子资源布局中的每一个将返回不同的 offset 和 size,表示该方面使用的内存区域。在交错存储深度和模板方面的实现中,将返回相同的 offset 和 size,表示交错的内存分配。
如果图像具有多平面格式且其平铺方式为 VK_IMAGE_TILING_LINEAR,则 VkImageSubresource 的 aspectMask 成员必须为 VK_IMAGE_ASPECT_PLANE_0_BIT、VK_IMAGE_ASPECT_PLANE_1_BIT 或(仅适用于三平面格式)VK_IMAGE_ASPECT_PLANE_2_BIT。查询这些图像子资源布局中的每一个将返回不同的 offset 和 size,表示该平面使用的内存区域。如果图像是分离的,则 offset 相对于平面的基址。如果图像是非分离的,则 offset 相对于图像的基址。
如果图像的平铺方式为 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则 VkImageSubresource 的 aspectMask 成员必须是 VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT 之一,其中允许的最大平面索引 i 由与图像的 VkImageCreateInfo::format 和 修饰符 相关的 VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount 定义。子资源使用的内存范围由 offset 和 size 描述。如果图像是分离的,则 offset 相对于内存平面的基址。如果图像是非分离的,则 offset 相对于图像的基址。如果图像是非线性的,那么 rowPitch、arrayPitch 和 depthPitch 具有与实现相关的含义。
要查询图像子资源的内存布局,请调用
// Provided by VK_VERSION_1_4
void vkGetImageSubresourceLayout2(
VkDevice device,
VkImage image,
const VkImageSubresource2* pSubresource,
VkSubresourceLayout2* pLayout);
或等效命令
// Provided by VK_KHR_maintenance5
void vkGetImageSubresourceLayout2KHR(
VkDevice device,
VkImage image,
const VkImageSubresource2* pSubresource,
VkSubresourceLayout2* pLayout);
或等效命令
// Provided by VK_EXT_host_image_copy, VK_EXT_image_compression_control
void vkGetImageSubresourceLayout2EXT(
VkDevice device,
VkImage image,
const VkImageSubresource2* pSubresource,
VkSubresourceLayout2* pLayout);
-
device是拥有该图像的逻辑设备。 -
image是要查询布局的图像。 -
pSubresource是指向 VkImageSubresource2 结构的指针,该结构选择特定图像作为图像子资源。 -
pLayout是指向 VkSubresourceLayout2 结构的指针,该结构中返回布局信息。
vkGetImageSubresourceLayout2 的行为类似于 vkGetImageSubresourceLayout,可以通过链式输入结构指定扩展输入,并通过链式输出结构返回扩展信息。
可以使用 tiling 等于 VK_IMAGE_TILING_OPTIMAL 创建的 image 调用 vkGetImageSubresourceLayout2,但这情况下 VkSubresourceLayout2::subresourceLayout 的成员值将是未定义的。
|
当 |
VkImageSubresource2 结构定义如下:
// Provided by VK_VERSION_1_4
typedef struct VkImageSubresource2 {
VkStructureType sType;
void* pNext;
VkImageSubresource imageSubresource;
} VkImageSubresource2;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkImageSubresource2 VkImageSubresource2KHR;
或等效形式:
// Provided by VK_EXT_host_image_copy, VK_EXT_image_compression_control
typedef VkImageSubresource2 VkImageSubresource2EXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
imageSubresource是一个 VkImageSubresource 结构体。
关于图像子资源的布局信息,将会在 VkSubresourceLayout2 结构体中返回。
// Provided by VK_VERSION_1_4
typedef struct VkSubresourceLayout2 {
VkStructureType sType;
void* pNext;
VkSubresourceLayout subresourceLayout;
} VkSubresourceLayout2;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkSubresourceLayout2 VkSubresourceLayout2KHR;
或等效形式:
// Provided by VK_EXT_host_image_copy, VK_EXT_image_compression_control
typedef VkSubresourceLayout2 VkSubresourceLayout2EXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
subresourceLayout是一个 VkSubresourceLayout 结构体。
要查询使用 vkCopyMemoryToImage 或 vkCopyImageToMemory 将数据复制到图像或从图像复制数据时所需的内存大小,并且指定了 VK_HOST_IMAGE_COPY_MEMCPY 标志,请在调用 vkGetImageSubresourceLayout2 时,将 VkSubresourceHostMemcpySize 结构体添加到 VkSubresourceLayout2 结构体的 pNext 链中。
VkSubresourceHostMemcpySize 结构体定义如下:
// Provided by VK_VERSION_1_4
typedef struct VkSubresourceHostMemcpySize {
VkStructureType sType;
void* pNext;
VkDeviceSize size;
} VkSubresourceHostMemcpySize;
或等效形式:
// Provided by VK_EXT_host_image_copy
typedef VkSubresourceHostMemcpySize VkSubresourceHostMemcpySizeEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
size是图像子资源的大小,以字节为单位。
要查询图像子资源的内存布局,而无需图像对象,请调用:
// Provided by VK_VERSION_1_4
void vkGetDeviceImageSubresourceLayout(
VkDevice device,
const VkDeviceImageSubresourceInfo* pInfo,
VkSubresourceLayout2* pLayout);
或等效命令
// Provided by VK_KHR_maintenance5
void vkGetDeviceImageSubresourceLayoutKHR(
VkDevice device,
const VkDeviceImageSubresourceInfo* pInfo,
VkSubresourceLayout2* pLayout);
-
device是拥有该图像的逻辑设备。 -
pInfo是一个指向 VkDeviceImageSubresourceInfo 结构体的指针,该结构体包含子资源布局查询所需的参数。 -
pLayout是指向 VkSubresourceLayout2 结构的指针,该结构中返回布局信息。
vkGetDeviceImageSubresourceLayout 的行为类似于 vkGetImageSubresourceLayout2,但它使用 VkImageCreateInfo 结构体来指定图像,而不是 VkImage 对象。
VkDeviceImageSubresourceInfo 结构体定义如下:
// Provided by VK_VERSION_1_4
typedef struct VkDeviceImageSubresourceInfo {
VkStructureType sType;
const void* pNext;
const VkImageCreateInfo* pCreateInfo;
const VkImageSubresource2* pSubresource;
} VkDeviceImageSubresourceInfo;
或等效形式:
// Provided by VK_KHR_maintenance5
typedef VkDeviceImageSubresourceInfo VkDeviceImageSubresourceInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
pCreateInfo是一个指向 VkImageCreateInfo 结构体的指针,该结构体包含影响要查询的图像创建的参数。 -
pSubresource是一个指向 VkImageSubresource2 结构体的指针,用于选择要查询的特定图像子资源。
如果图像是使用 VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT 创建的,则该图像具有 Linux DRM 格式修饰符。要查询 修饰符,请调用:
// Provided by VK_EXT_image_drm_format_modifier
VkResult vkGetImageDrmFormatModifierPropertiesEXT(
VkDevice device,
VkImage image,
VkImageDrmFormatModifierPropertiesEXT* pProperties);
-
device是拥有该图像的逻辑设备。 -
image是被查询的图像。 -
pProperties是一个指向 VkImageDrmFormatModifierPropertiesEXT 结构体的指针,该结构体返回图像的 DRM 格式修饰符 的属性。
// Provided by VK_EXT_image_drm_format_modifier
typedef struct VkImageDrmFormatModifierPropertiesEXT {
VkStructureType sType;
void* pNext;
uint64_t drmFormatModifier;
} VkImageDrmFormatModifierPropertiesEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
drmFormatModifier返回图像的 Linux DRM 格式修改器。
如果 image 是使用 VkImageDrmFormatModifierListCreateInfoEXT 创建的,那么返回的 drmFormatModifier 必须属于在图像创建时,在 VkImageDrmFormatModifierListCreateInfoEXT::pDrmFormatModifiers 中提供的修改器列表。如果 image 是使用 VkImageDrmFormatModifierExplicitCreateInfoEXT 创建的,那么返回的 drmFormatModifier 必须是在图像创建时,在 VkImageDrmFormatModifierExplicitCreateInfoEXT::drmFormatModifier 中提供的修改器。
要销毁图像,请调用:
// Provided by VK_VERSION_1_0
void vkDestroyImage(
VkDevice device,
VkImage image,
const VkAllocationCallbacks* pAllocator);
-
device是销毁图像的逻辑设备。 -
image是要销毁的图像。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
图像格式特性
VkImage 的有效使用可能取决于图像的格式特性,定义如下。此类约束记录在受影响的有效使用声明中。
-
如果图像是使用
VK_IMAGE_TILING_LINEAR创建的,那么它的格式特性集是通过调用 vkGetPhysicalDeviceFormatProperties 在与 VkImageCreateInfo::format相同的format上找到的 VkFormatProperties::linearTilingFeatures的值。 -
如果图像是使用
VK_IMAGE_TILING_OPTIMAL创建的,但没有 Android 硬件缓冲区外部格式、 QNX 屏幕缓冲区外部格式 或 VkBufferCollectionImageCreateInfoFUCHSIA,那么它的格式特性集是通过调用 vkGetPhysicalDeviceFormatProperties 在与 VkImageCreateInfo::format相同的format上找到的 VkFormatProperties::optimalTilingFeatures的值。 -
如果图像是使用 Android 硬件缓冲区外部格式创建的,那么它的格式特性集是通过调用 vkGetAndroidHardwareBufferPropertiesANDROID 在导入到图像绑定的 VkDeviceMemory 的 Android 硬件缓冲区上找到的 VkAndroidHardwareBufferFormatPropertiesANDROID::
formatFeatures的值。 -
如果图像是使用 QNX 屏幕缓冲区外部格式创建的,那么它的格式特性集是通过调用 vkGetScreenBufferPropertiesQNX 在导入到图像绑定的 VkDeviceMemory 的 QNX 屏幕缓冲区上找到的 VkScreenBufferFormatPropertiesQNX::
formatFeatures的值。 -
如果图像是使用
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT创建的,那么-
图像的 DRM 格式修改器是通过调用 vkGetImageDrmFormatModifierPropertiesEXT 找到的 VkImageDrmFormatModifierPropertiesEXT::
drmFormatModifier的值。 -
让 VkDrmFormatModifierPropertiesListEXT::
pDrmFormatModifierProperties是通过在与 VkImageCreateInfo::format相同的format上调用 vkGetPhysicalDeviceFormatProperties2 找到的数组。 -
让
VkDrmFormatModifierPropertiesEXT prop是其drmFormatModifier成员是图像 DRM 格式修改器值的数组元素。 -
那么图像的格式特性集是
prop::drmFormatModifierTilingFeatures的值。
-
角采样图像
角采样图像是指未标准化的纹理坐标以整数值而不是半整数值为中心的图像。
与传统纹理图像相比,角采样图像有许多不同之处。
-
纹素以整数坐标为中心。请参阅 未标准化的纹素坐标运算
-
标准化坐标使用 coord × (dim - 1) 而不是 coord × dim 进行缩放,其中 dim 是图像的一个维度的大小。请参阅 标准化纹素坐标变换。
-
偏导数使用 coord × (dim - 1) 而不是 coord × dim 进行缩放。请参阅 缩放因子运算。
-
下一个更高 LOD 大小的计算遵循 ⌈dim / 2⌉ 而不是 ⌊dim / 2⌋。请参阅图像 Mip 级别大小调整。
-
2D 图像的最小级别大小为 2x2,3D 图像的最小级别大小为 2x2x2。请参阅图像 Mip 级别大小调整。
仅 2D 和 3D 图像支持角采样。当对角采样图像进行采样时,采样器寻址模式必须为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE。角采样图像不支持作为立方体贴图或深度/模板图像。
图像 Mip 级别大小调整
完整的 mipmap 链是 mip 级别的完整集合,从提供的最大 mip 级别到最小 mip 级别大小。
传统图像
对于传统图像,每个连续的 mip 级别 n+1 的尺寸为
-
widthn+1 = max(⌊widthn/2⌋, 1) -
heightn+1 = max(⌊heightn/2⌋, 1) -
depthn+1 = max(⌊depthn/2⌋, 1)
其中 widthn、heightn 和 depthn 是下一个较大 mip 级别 n 的尺寸。
最小 mip 级别大小为
-
一维图像为 1,
-
二维图像为 1x1,以及
-
三维图像为 1x1x1。
完整 mipmap 链中的级别数为
-
⌊log2(max(
width0,height0,depth0))⌋ + 1
其中 width0、height0 和 depth0 是最大(最详细)mip 级别 0 的尺寸。
角采样图像
对于角采样图像,每个连续的 mip 级别 n+1 的尺寸为
-
widthn+1 = max(⌈widthn/2⌉, 2) -
heightn+1 = max(⌈heightn/2⌉, 2) -
depthn+1 = max(⌈depthn/2⌉, 2)
其中 widthn、heightn 和 depthn 是下一个较大 mip 级别 n 的尺寸。
最小 mip 级别大小为
-
二维图像为 2x2,以及
-
三维图像为 2x2x2。
完整 mipmap 链中的级别数为
-
⌈log2(max(
width0,height0,depth0))⌉
其中 width0、height0 和 depth0 是最大(最详细)mip 级别 0 的尺寸。
图像布局
图像以依赖于实现的 opaque 布局存储在内存中。每个布局都限制了使用该布局的图像子资源支持的操作类型。在任何给定时间,内存中表示图像子资源的数据都存在于特定的布局中,该布局由最近对该图像子资源执行的布局转换确定。应用程序可以控制每个图像子资源使用的布局,并且可以将图像子资源从一个布局转换为另一个布局。转换可以通过图像内存屏障进行,该屏障包含在 vkCmdPipelineBarrier 或 vkCmdWaitEvents 命令缓冲区命令中(请参阅图像内存屏障),或者作为渲染通道内的子通道依赖项的一部分(请参阅 VkSubpassDependency)。
图像布局是每个图像子资源的。同一图像的单独图像子资源可以同时处于不同的布局中,但给定图像子资源的深度和模板方面只能在启用了separateDepthStencilLayouts 功能的情况下处于不同的布局中。当设备上访问 VkImageView 描述符时,所有图像子资源必须处于有效的图像布局中。
|
每个布局可能为图像内存的特定用法提供最佳性能。例如,布局为 |
创建时,图像的所有图像子资源最初都处于相同的布局中,该布局由 VkImageCreateInfo::initialLayout 成员选择。initialLayout必须是 VK_IMAGE_LAYOUT_UNDEFINED 或 VK_IMAGE_LAYOUT_PREINITIALIZED。如果它是 VK_IMAGE_LAYOUT_PREINITIALIZED,则图像数据可以由主机使用此布局进行预初始化,并且从此布局转换出来将保留该数据。如果它是 VK_IMAGE_LAYOUT_UNDEFINED,则数据的内容被认为是未定义的,并且不保证从此布局转换出来会保留该数据。对于这两种初始布局中的任何一种,任何图像子资源在被设备访问之前必须转换为另一种布局。
仅当 线性图像和这些图像中当前处于 VK_IMAGE_LAYOUT_PREINITIALIZED 或 VK_IMAGE_LAYOUT_GENERAL 布局的图像子资源时,主机对图像内存的访问才是明确定义的。调用 vkGetImageSubresourceLayout 获取线性图像返回的子资源布局映射对于这两种图像布局都是有效的。
图像布局集包括
// Provided by VK_VERSION_1_0
typedef enum VkImageLayout {
VK_IMAGE_LAYOUT_UNDEFINED = 0,
VK_IMAGE_LAYOUT_GENERAL = 1,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7,
VK_IMAGE_LAYOUT_PREINITIALIZED = 8,
// Provided by VK_VERSION_1_1
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000,
// Provided by VK_VERSION_1_1
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001,
// Provided by VK_VERSION_1_2
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000,
// Provided by VK_VERSION_1_2
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001,
// Provided by VK_VERSION_1_2
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002,
// Provided by VK_VERSION_1_2
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003,
// Provided by VK_VERSION_1_3
VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000,
// Provided by VK_VERSION_1_3
VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001,
// Provided by VK_VERSION_1_4
VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ = 1000232000,
// Provided by VK_KHR_swapchain
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001,
// Provided by VK_KHR_video_decode_queue
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002,
// Provided by VK_KHR_shared_presentable_image
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000,
// Provided by VK_EXT_fragment_density_map
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000,
// Provided by VK_KHR_fragment_shading_rate
VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001,
// Provided by VK_KHR_video_encode_queue
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002,
// Provided by VK_EXT_attachment_feedback_loop_layout
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000,
// Provided by VK_KHR_video_encode_quantization_map
VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000,
// Provided by VK_KHR_maintenance2
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
// Provided by VK_KHR_maintenance2
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
// Provided by VK_NV_shading_rate_image
VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,
// Provided by VK_KHR_dynamic_rendering_local_read
VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,
// Provided by VK_KHR_separate_depth_stencil_layouts
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
// Provided by VK_KHR_separate_depth_stencil_layouts
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
// Provided by VK_KHR_separate_depth_stencil_layouts
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
// Provided by VK_KHR_separate_depth_stencil_layouts
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
// Provided by VK_KHR_synchronization2
VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,
// Provided by VK_KHR_synchronization2
VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,
} VkImageLayout;
每个布局支持的设备访问类型是
-
VK_IMAGE_LAYOUT_UNDEFINED指定布局未知。图像内存不能转换为此布局。此布局可以用作 VkImageCreateInfo 的initialLayout成员。此布局可以在布局转换中代替当前的图像布局使用,但这将导致图像内存的内容未定义。 -
VK_IMAGE_LAYOUT_PREINITIALIZED指定图像的内存处于定义的布局中,并且可以由数据填充,但尚未由驱动程序初始化。图像内存不能转换为此布局。此布局可以用作 VkImageCreateInfo 的initialLayout成员。此布局旨在用作内容由主机写入的图像的初始布局,因此可以直接将数据写入内存,而无需先执行布局转换。目前,VK_IMAGE_LAYOUT_PREINITIALIZED仅对 线性图像有用,因为没有为VK_IMAGE_TILING_OPTIMAL图像定义标准布局。 -
VK_IMAGE_LAYOUT_GENERAL支持所有类型的设备访问,除非另有说明。 -
VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL指定的布局必须仅用于图形管道中的附件访问。 -
VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL指定一个布局,允许只读访问作为附件,或在着色器中作为采样图像、组合图像/采样器或输入附件。 -
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL必须仅用作VkFramebuffer中的颜色或解析附件。此布局仅对启用了VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT用法位的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL指定深度/模板格式图像的深度和模板方面的布局,允许作为深度/模板附件进行读写访问。它等效于VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL和VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL。 -
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL指定深度/模板格式图像的深度和模板方面的布局,允许只读访问作为深度/模板附件,或在着色器中作为采样图像、组合图像/采样器或输入附件。它等效于VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL和VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL。 -
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL指定深度/模板格式图像的布局,允许以模板附件的形式读取和写入模板方面,并以深度附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问深度方面。它等效于VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL和VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL。 -
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL指定深度/模板格式图像的布局,允许以深度附件的形式读取和写入深度方面,并以模板附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问模板方面。它等效于VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL和VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL。 -
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL指定深度/模板格式图像的深度方面的布局,允许以深度附件的形式读取和写入。 -
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL指定深度/模板格式图像的深度方面的布局,允许以深度附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问。 -
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL指定深度/模板格式图像的模板方面的布局,允许以模板附件的形式读取和写入。 -
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL指定深度/模板格式图像的模板方面的布局,允许以模板附件或在着色器中作为采样图像、组合图像/采样器或输入附件的形式只读访问。 -
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL指定允许在着色器中作为采样图像、组合图像/采样器或输入附件进行只读访问的布局。此布局仅对启用了VK_IMAGE_USAGE_SAMPLED_BIT或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL必须仅用作传输命令的源图像(请参阅VK_PIPELINE_STAGE_TRANSFER_BIT的定义)。此布局仅对启用了VK_IMAGE_USAGE_TRANSFER_SRC_BIT使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL必须仅用作传输命令的目标图像。此布局仅对启用了VK_IMAGE_USAGE_TRANSFER_DST_BIT使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR必须仅用于呈现可呈现图像以进行显示。 -
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR仅对共享的可呈现图像有效,并且必须用于图像支持的任何用法。 -
VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR必须仅用作片段着色率附件或着色率图像。此布局仅对启用了VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT必须仅在VkRenderPass中用作片段密度图附件。此布局仅对启用了VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR必须仅在视频解码操作中用作解码输出图像。此布局仅对启用了VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR保留供将来使用。 -
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR必须仅在视频解码操作中用作输出重建图像或输入参考图像。此布局仅对启用了VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR保留供将来使用。 -
VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR必须仅在视频编码操作中用作编码输入图像。此布局仅对启用了VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR必须仅在视频编码操作中用作输出重建图像或输入参考图像。此布局仅对启用了VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT必须仅用作VkFramebuffer中的颜色附件或深度/模板附件,和/或在着色器中作为采样图像、组合图像/采样器或输入附件进行只读访问。此布局仅对启用了VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT使用标志和VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT或VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT以及VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT或VK_IMAGE_USAGE_SAMPLED_BIT使用标志的图像创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ必须仅用作存储图像,或者颜色或深度/模板附件以及输入附件。此布局仅对使用VK_IMAGE_USAGE_STORAGE_BIT或同时使用VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT以及VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT或VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT创建的图像子资源有效。 -
VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR必须仅在视频编码操作中用作量化图。此布局仅对启用了VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR或VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR使用标志的图像创建的图像子资源有效。
每个图像子资源的布局并非图像子资源本身的状态,而是内存中数据组织方式的属性。因此,对于 API 中访问图像的每种机制,应用程序必须指定一个参数或结构成员,指示当图像被访问时,图像子资源被认为处于哪种图像布局。对于传输命令,这是命令的一个参数(参见清除命令和复制命令)。对于用作帧缓冲附件,这是VkRenderPassCreateInfo的子结构中的一个成员(参见渲染过程)。对于在描述符集中使用,这是VkDescriptorImageInfo结构中的一个成员(参见描述符集更新)。
|
|
|
虽然 |
图像布局匹配规则
在任何命令缓冲区命令在任何队列上执行访问图像时,被访问的图像子资源的布局必须与通过控制这些访问的 API 指定的布局完全匹配,除非通过仅引用图像的单个方面的描述符访问具有深度/模板格式的图像,在这种情况下,以下宽松的匹配规则适用
-
仅引用深度/模板图像的深度方面的描述符,只需要在深度方面的图像布局中匹配,因此
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL和VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL被认为是匹配的。 -
仅引用深度/模板图像的模板方面的描述符,只需要在模板方面的图像布局中匹配,因此
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL和VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL被认为是匹配的。
当对图像子资源执行布局转换时,旧的布局值必须等于图像子资源的当前布局(在转换执行时),或者为 VK_IMAGE_LAYOUT_UNDEFINED(表示不需要保留图像子资源的内容)。转换中使用的新布局必须不是 VK_IMAGE_LAYOUT_UNDEFINED 或 VK_IMAGE_LAYOUT_PREINITIALIZED。
使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的每个图像子资源的图像布局取决于最后一次用作深度/模板附件渲染到图像子资源的采样位置,因此,每当发生图像子资源的布局转换时,应用程序必须提供最后一次用于渲染给定图像子资源的相同采样位置,否则图像子资源的深度方面的内容将变为未定义。
此外,使用与最后一次对同一图像子资源范围的图像子资源执行深度写入不同的采样位置,从引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的图像子资源范围的深度/模板附件的深度读取,会返回未定义的值。
类似地,使用与最后一次对同一图像子资源范围的图像子资源执行深度写入不同的采样位置,对引用使用 VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT 创建的深度/模板图像的图像子资源范围的深度/模板附件进行深度写入,会使这些图像子资源的深度方面的内容变为未定义。
图像视图
图像对象不会被管道着色器直接访问以进行读取或写入图像数据。相反,使用表示图像子资源的连续范围并包含额外元数据的图像视图来实现此目的。视图必须在兼容类型的图像上创建,并且必须表示图像子资源的有效子集。
图像视图由 VkImageView 句柄表示
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)
VK_REMAINING_ARRAY_LAYERS 是用于图像视图的特殊常量值,表示图像中基础层之后的所有剩余数组层都应包含在视图中。
#define VK_REMAINING_ARRAY_LAYERS (~0U)
VK_REMAINING_MIP_LEVELS 是用于图像视图的特殊常量值,表示图像中基础级别之后的所有剩余 mipmap 级别都应包含在视图中。
#define VK_REMAINING_MIP_LEVELS (~0U)
可以创建的图像视图类型是
// Provided by VK_VERSION_1_0
typedef enum VkImageViewType {
VK_IMAGE_VIEW_TYPE_1D = 0,
VK_IMAGE_VIEW_TYPE_2D = 1,
VK_IMAGE_VIEW_TYPE_3D = 2,
VK_IMAGE_VIEW_TYPE_CUBE = 3,
VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,
} VkImageViewType;
要创建图像视图,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateImageView(
VkDevice device,
const VkImageViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkImageView* pView);
-
device是创建图像视图的逻辑设备。 -
pCreateInfo是一个指向VkImageViewCreateInfo结构的指针,该结构包含用于创建图像视图的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pView是一个指向 VkImageView 句柄的指针,其中返回生成的图像视图对象。
VkImageViewCreateInfo 结构的定义如下
// Provided by VK_VERSION_1_0
typedef struct VkImageViewCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageViewCreateFlags flags;
VkImage image;
VkImageViewType viewType;
VkFormat format;
VkComponentMapping components;
VkImageSubresourceRange subresourceRange;
} VkImageViewCreateInfo;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags是 VkImageViewCreateFlagBits 的位掩码,指定图像视图的其他参数。 -
image是将要创建视图的 VkImage。 -
viewType是一个 VkImageViewType 值,指定图像视图的类型。 -
format是一个 VkFormat,指定用于解释图像纹理块的格式和类型。 -
components是一个 VkComponentMapping 结构,指定颜色分量的重新映射(或者深度或模板分量在转换为颜色分量之后)。 -
subresourceRange是一个 VkImageSubresourceRange 结构,选择视图可访问的 mipmap 级别和数组层集。
某些 image 创建参数会被视图继承。特别是,图像视图的创建会继承隐式参数 usage,该参数指定了图像视图的允许用途,默认情况下,它采用在图像创建时 VkImageCreateInfo 中指定的对应 usage 参数的值。隐式 usage 可以通过向 pNext 链添加 VkImageViewUsageCreateInfo 结构体来覆盖,但视图的用途必须是图像用途的子集。如果 image 具有深度模板格式,并且在 VkImageCreateInfo 的 pNext 链中包含 VkImageStencilUsageCreateInfo 结构体创建,则用途将根据提供的 subresource.aspectMask 进行计算。
-
如果
aspectMask仅包含VK_IMAGE_ASPECT_STENCIL_BIT,则隐式usage等于 VkImageStencilUsageCreateInfo::stencilUsage。 -
如果
aspectMask仅包含VK_IMAGE_ASPECT_DEPTH_BIT,则隐式usage等于 VkImageCreateInfo::usage。 -
如果
aspectMask中同时包含这两个方面,则隐式usage等于 VkImageCreateInfo::usage和 VkImageStencilUsageCreateInfo::stencilUsage的交集。
如果 image 是一个 3D 图像,则可以通过向 pNext 链添加 VkImageViewSlicedCreateInfoEXT 将其 Z 范围限制为子集。
如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 标志创建的,并且如果图像的 format 不是多平面,则 format 可以与图像的格式不同,但是如果 image 在创建时没有使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志,并且它们不相等,则它们必须是兼容的。图像格式兼容性在格式兼容性类部分中定义。兼容格式的视图在像素坐标和内存位置之间将具有相同的映射,而不管 format 如何,只有位模式的解释会发生变化。
如果 image 是使用多平面格式创建的,并且图像视图的 aspectMask 是 VK_IMAGE_ASPECT_PLANE_0_BIT、VK_IMAGE_ASPECT_PLANE_1_BIT 或 VK_IMAGE_ASPECT_PLANE_2_BIT 中的一个,则当用作帧缓冲附件时,该视图的方面掩码被认为等同于 VK_IMAGE_ASPECT_COLOR_BIT。
|
当通过不同格式写入或读取时,旨在与一种视图格式一起使用的值可能不会被精确保留。例如,碰巧具有浮点数非规范值或 NaN 位模式的整数值,在通过浮点格式的视图写入或读取时可能会被刷新或规范化。类似地,通过带符号归一化格式写入的值,其位模式恰好等于 -2b 时,可能会更改为 -2b + 1,如 从归一化定点到浮点转换中所述。 |
如果 image 是使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 标志创建的,则 format 必须与图像的格式兼容,如上所述;或者必须是一种未压缩的格式,在这种情况下,它必须与图像的格式尺寸兼容。在这种情况下,生成的图像视图的像素尺寸等于所选 mip 级别尺寸除以压缩像素块大小并向上取整。
VkComponentMapping components 成员描述了从图像组件到着色器图像指令返回的向量组件的重新映射。此重新映射必须是存储图像描述符、输入附件描述符、帧缓冲附件以及任何使用组合图像采样器并启用 采样器 Y′CBCR 转换的 VkImageView 的恒等置换。
如果图像视图将与支持 采样器 Y′CBCR 转换的采样器一起使用,则与创建采样器时使用的类型为 VkSamplerYcbcrConversion 的相同定义对象必须通过包含在 VkImageViewCreateInfo 的 pNext 链中的 VkSamplerYcbcrConversionInfo 传递给 vkCreateImageView。相反,如果将 VkSamplerYcbcrConversion 对象传递给 vkCreateImageView,则在采样图像时必须使用相同定义的 VkSamplerYcbcrConversion 对象。
如果图像具有 多平面 format,subresourceRange.aspectMask 为 VK_IMAGE_ASPECT_COLOR_BIT,并且 usage 包括 VK_IMAGE_USAGE_SAMPLED_BIT,则 format 必须与图像的 format 相同,并且要与图像视图一起使用的采样器必须启用 采样器 Y′CBCR 转换。
当在 视频编码 操作中使用此类图像时,采样器 Y′CBCR 转换不起作用。
如果 image 是使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 创建的,并且图像具有多平面 format,并且如果 subresourceRange.aspectMask 为 VK_IMAGE_ASPECT_PLANE_0_BIT、VK_IMAGE_ASPECT_PLANE_1_BIT 或 VK_IMAGE_ASPECT_PLANE_2_BIT,则 format 必须与图像的相应平面兼容,并且要与图像视图一起使用的采样器不能启用采样器 Y′CBCR 转换。单平面图像视图的 width 和 height 必须以平面兼容性中列出的方式从多平面图像的维度中得出。
任何图像平面的视图,其纹素坐标和内存位置之间的映射,都与颜色分量的映射相同,但要服从纹素坐标与较低分辨率平面之间关系的公式,如色度重建中所述。也就是说,如果R或B平面相对于多平面图像的G平面具有降低的分辨率,则图像视图使用降低分辨率平面的(uplane, vplane)非归一化坐标进行操作,并且这些坐标访问与颜色分量的(ucolor, vcolor)非归一化坐标相同的内存位置,色度重建操作在相同的(uplane, vplane)或(iplane, jplane)坐标上进行。
| 图像视图类型 | 兼容的图像类型 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 VkImageViewCreateInfo::flags 中可以设置的位,用于指定图像视图的附加参数,如下所示:
// Provided by VK_VERSION_1_0
typedef enum VkImageViewCreateFlagBits {
// Provided by VK_EXT_fragment_density_map
VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT = 0x00000001,
// Provided by VK_EXT_descriptor_buffer
VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000004,
// Provided by VK_EXT_fragment_density_map2
VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT = 0x00000002,
} VkImageViewCreateFlagBits;
-
VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT指定在VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT阶段,设备将读取片段密度图。 -
VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT指定在记录渲染过程的主命令缓冲区的 vkEndCommandBuffer 期间,主机将读取片段密度图。 -
VK_IMAGE_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT指定图像视图在捕获和重放时(例如,用于跟踪捕获和重放)可以与描述符缓冲区一起使用,有关更多详细信息,请参见VkOpaqueCaptureDescriptorDataCreateInfoEXT。
// Provided by VK_VERSION_1_0
typedef VkFlags VkImageViewCreateFlags;
VkImageViewCreateFlags 是一个位掩码类型,用于设置零个或多个 VkImageViewCreateFlagBits 的掩码。
与父图像的 usage 标志相比,可以通过将 VkImageViewUsageCreateInfo 结构体添加到 VkImageViewCreateInfo 的 pNext 链中来限制创建的图像视图的用法集。
VkImageViewUsageCreateInfo 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkImageViewUsageCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageUsageFlags usage;
} VkImageViewUsageCreateInfo;
或等效形式:
// Provided by VK_KHR_maintenance2
typedef VkImageViewUsageCreateInfo VkImageViewUsageCreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
usage是一个 VkImageUsageFlagBits 的位掩码,指定图像视图允许的用法。
当此结构体链接到 VkImageViewCreateInfo 时,usage 字段会覆盖从图像创建时继承的隐式 usage 参数,并使用其值来确定 VkImageViewCreateInfo 的有效使用条件。
通过将 VkImageViewSlicedCreateInfoEXT 结构体添加到 VkImageViewCreateInfo 的 pNext 链中,可以将创建的图像视图的 3D 切片范围限制为父图像的 Z 范围的子集。
VkImageViewSlicedCreateInfoEXT 结构体定义如下:
// Provided by VK_EXT_image_sliced_view_of_3d
typedef struct VkImageViewSlicedCreateInfoEXT {
VkStructureType sType;
const void* pNext;
uint32_t sliceOffset;
uint32_t sliceCount;
} VkImageViewSlicedCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
sliceOffset是图像视图可访问的第一个 3D 切片的 Z 偏移量。 -
sliceCount是图像视图可访问的 3D 切片数量。
当此结构体链接到 VkImageViewCreateInfo 时,sliceOffset 字段将被视为切片视图的 Z 偏移量,sliceCount 指定范围。使用 Z 坐标为 0 的着色器访问将访问图像中与 sliceOffset 相对应的深度切片,并且在着色器中,视图的最大边界内 Z 坐标为 sliceCount - 1。
切片的 3D 视图 必须仅与单个 mip 级别一起使用。切片坐标是用于创建图像视图的 subresourceRange.baseMipLevel 中的整数坐标。
有效的视图深度等于用于创建此视图的 image 的 extent.depth,并通过 图像 Mip 级别大小调整 中指定的 subresourceRange.baseMipLevel 进行调整。
如果着色器使用 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE 类型的描述符,则对此图像视图的着色器访问仅受 VkImageViewSlicedCreateInfoEXT 的影响。 对于使用任何其他描述符类型的访问,将忽略 VkImageViewSlicedCreateInfoEXT 的内容;相反,将 sliceOffset 视为等于 0,并将 sliceCount 视为等于 VK_REMAINING_3D_SLICES_EXT。
VK_REMAINING_3D_SLICES_EXT 是用于 VkImageViewSlicedCreateInfoEXT::sliceCount 的特殊常量值,表示应将图像中指定第一个切片偏移量之后的所有剩余 3D 切片都包含在视图中。
#define VK_REMAINING_3D_SLICES_EXT (~0U)
VkImageSubresourceRange 结构体定义如下:
// Provided by VK_VERSION_1_0
typedef struct VkImageSubresourceRange {
VkImageAspectFlags aspectMask;
uint32_t baseMipLevel;
uint32_t levelCount;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkImageSubresourceRange;
-
aspectMask是一个 VkImageAspectFlagBits 的位掩码,指定图像的哪个或哪些方面包含在视图中。 -
baseMipLevel是视图可访问的第一个 mipmap 级别。 -
levelCount是视图可访问的 mipmap 级别数(从baseMipLevel开始)。 -
baseArrayLayer是视图可访问的第一个数组层。 -
layerCount是视图可访问的数组层数(从baseArrayLayer开始)。
mipmap 级别和数组层的数量 必须是图像中图像子资源的子集。如果应用程序想在 baseMipLevel 或 baseArrayLayer 之后使用图像中的所有 mip 级别或层,则它 可以将 levelCount 和 layerCount 设置为特殊值 VK_REMAINING_MIP_LEVELS 和 VK_REMAINING_ARRAY_LAYERS,而无需知道 mip 级别或层的确切数量。
对于立方体和立方体数组图像视图,图像视图的层从 baseArrayLayer 开始,按照 +X、-X、+Y、-Y、+Z、-Z 的顺序对应各个面。对于立方体数组,每连续的六层构成一个立方体,因此立方体贴图数组视图中的立方体贴图数量为 *layerCount / 6*,并且图像数组层 (baseArrayLayer + i) 是立方体 *i / 6* 的面索引 (i mod 6)。如果视图中的层数(无论是在 layerCount 中显式设置还是由 VK_REMAINING_ARRAY_LAYERS 隐含)不是 6 的倍数,则**必须**不访问数组中的最后一个立方体贴图。
如果 format 分别是颜色、仅深度或仅模板格式,则 aspectMask **必须**仅为 VK_IMAGE_ASPECT_COLOR_BIT、VK_IMAGE_ASPECT_DEPTH_BIT 或 VK_IMAGE_ASPECT_STENCIL_BIT,除非 format 是一个多平面格式。如果使用具有深度和模板组件的深度/模板格式,则 aspectMask **必须**至少包含 VK_IMAGE_ASPECT_DEPTH_BIT 和 VK_IMAGE_ASPECT_STENCIL_BIT 中的一个,并且**可以**同时包含两者。
当使用 VkImageSubresourceRange 结构来选择 3D 图像的 mip 级别切片子集,以便创建以 VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT 创建的 3D 图像的 2D 或 2D 数组图像视图时,baseArrayLayer 和 layerCount 指定创建的图像视图中包含的第一个切片索引和切片数量。这样的图像视图**可以**用作帧缓冲附件,仅引用选定的 mip 级别的指定切片范围。但是,在渲染通道实例期间对此类附件视图执行的任何布局转换仍然适用于引用的整个子资源,其中包括所选 mip 级别的所有切片。
当使用深度/模板图像的图像视图来填充描述符集时(例如,用于着色器中的采样,或用作输入附件),aspectMask **必须**仅包含一个位,该位选择图像视图是用于深度读取(即,在着色器中使用浮点采样器或输入附件)还是模板读取(即,在着色器中使用无符号整数采样器或输入附件)。当深度/模板图像的图像视图用作深度/模板帧缓冲附件时,将忽略 aspectMask,并且将使用深度和模板图像子资源。
创建 VkImageView 时,如果在采样器中启用了采样器 Y′CBCR 转换,则 VkImageView 使用的 subresourceRange 的 aspectMask **必须**为 VK_IMAGE_ASPECT_COLOR_BIT。
创建 VkImageView 时,如果在采样器中未启用采样器 Y′CBCR 转换,并且图像的 format 是多平面,则图像**必须**已使用 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT 创建,并且 VkImageView 的 subresourceRange 的 aspectMask **必须**为 VK_IMAGE_ASPECT_PLANE_0_BIT、VK_IMAGE_ASPECT_PLANE_1_BIT 或 VK_IMAGE_ASPECT_PLANE_2_BIT。
可以在方面掩码中设置以指定图像的方面以用于诸如标识子资源之类的目的的位是:
// Provided by VK_VERSION_1_0
typedef enum VkImageAspectFlagBits {
VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
// Provided by VK_VERSION_1_1
VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010,
// Provided by VK_VERSION_1_1
VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020,
// Provided by VK_VERSION_1_1
VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040,
// Provided by VK_VERSION_1_3
VK_IMAGE_ASPECT_NONE = 0,
// Provided by VK_EXT_image_drm_format_modifier
VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080,
// Provided by VK_EXT_image_drm_format_modifier
VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100,
// Provided by VK_EXT_image_drm_format_modifier
VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200,
// Provided by VK_EXT_image_drm_format_modifier
VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT,
// Provided by VK_KHR_maintenance4
VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE,
} VkImageAspectFlagBits;
-
VK_IMAGE_ASPECT_NONE指定无图像方面,或者图像方面不适用。 -
VK_IMAGE_ASPECT_COLOR_BIT指定颜色方面。 -
VK_IMAGE_ASPECT_DEPTH_BIT指定深度方面。 -
VK_IMAGE_ASPECT_STENCIL_BIT指定模板方面。 -
VK_IMAGE_ASPECT_METADATA_BIT指定用于稀疏资源操作的元数据方面。 -
VK_IMAGE_ASPECT_PLANE_0_BIT指定 *多平面* 图像格式的平面 0。 -
VK_IMAGE_ASPECT_PLANE_1_BIT指定 *多平面* 图像格式的平面 1。 -
VK_IMAGE_ASPECT_PLANE_2_BIT指定 *多平面* 图像格式的平面 2。 -
VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT指定 *内存平面* 0。 -
VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT指定 *内存平面* 1。 -
VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT指定 *内存平面* 2。 -
VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT指定 *内存平面* 3。
// Provided by VK_VERSION_1_0
typedef VkFlags VkImageAspectFlags;
VkImageAspectFlags 是一种用于设置零个或多个VkImageAspectFlagBits的掩码的位掩码类型。
VkComponentMapping 结构的定义如下:
// Provided by VK_VERSION_1_0
typedef struct VkComponentMapping {
VkComponentSwizzle r;
VkComponentSwizzle g;
VkComponentSwizzle b;
VkComponentSwizzle a;
} VkComponentMapping;
-
r是一个VkComponentSwizzle,指定放置在输出向量的 R 分量中的分量值。 -
g是一个VkComponentSwizzle,指定放置在输出向量的 G 分量中的分量值。 -
b是一个VkComponentSwizzle,指定放置在输出向量的 B 分量中的分量值。 -
a是一个VkComponentSwizzle,指定放置在输出向量的 A 分量中的分量值。
VkComponentMapping 的成员的可能值,指定放置在输出向量的每个分量中的分量值,如下所示:
// Provided by VK_VERSION_1_0
typedef enum VkComponentSwizzle {
VK_COMPONENT_SWIZZLE_IDENTITY = 0,
VK_COMPONENT_SWIZZLE_ZERO = 1,
VK_COMPONENT_SWIZZLE_ONE = 2,
VK_COMPONENT_SWIZZLE_R = 3,
VK_COMPONENT_SWIZZLE_G = 4,
VK_COMPONENT_SWIZZLE_B = 5,
VK_COMPONENT_SWIZZLE_A = 6,
} VkComponentSwizzle;
-
VK_COMPONENT_SWIZZLE_IDENTITY指定该分量设置为恒等置换。 -
VK_COMPONENT_SWIZZLE_ZERO指定该分量设置为零。 -
VK_COMPONENT_SWIZZLE_ONE指定该分量设置为 1 或 1.0,具体取决于图像视图格式的类型是整数还是浮点数,由每个 VkFormat 的格式定义部分确定。 -
VK_COMPONENT_SWIZZLE_R指定该分量设置为图像的 R 分量的值。 -
VK_COMPONENT_SWIZZLE_G指定该分量设置为图像的 G 分量的值。 -
VK_COMPONENT_SWIZZLE_B指定该分量设置为图像的 B 分量的值。 -
VK_COMPONENT_SWIZZLE_A指定该分量设置为图像的 A 分量的值。
在分量上设置恒等置换等同于在该分量上设置恒等映射。即:
| 分量 | 恒等映射 |
|---|---|
|
|
|
|
|
|
|
|
如果 pNext 链包含 VkImageViewASTCDecodeModeEXT 结构,则该结构包含一个参数,指定使用 ASTC 压缩格式的图像视图的解码模式。
VkImageViewASTCDecodeModeEXT 结构定义如下:
// Provided by VK_EXT_astc_decode_mode
typedef struct VkImageViewASTCDecodeModeEXT {
VkStructureType sType;
const void* pNext;
VkFormat decodeMode;
} VkImageViewASTCDecodeModeEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
decodeMode是用于解码 ASTC 压缩格式的中间格式。
如果 format 使用 sRGB 编码,则 decodeMode 不起作用。
如果 pNext 链包含 VkImageViewSampleWeightCreateInfoQCOM 结构,则该结构包含一个参数,用于指定 权重图像采样中使用的权重图像视图的参数。
VkImageViewSampleWeightCreateInfoQCOM 结构定义如下:
// Provided by VK_QCOM_image_processing
typedef struct VkImageViewSampleWeightCreateInfoQCOM {
VkStructureType sType;
const void* pNext;
VkOffset2D filterCenter;
VkExtent2D filterSize;
uint32_t numPhases;
} VkImageViewSampleWeightCreateInfoQCOM;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
filterCenter是一个 VkOffset2D,描述权重过滤器原点的位置。 -
filterSize是一个 VkExtent2D,指定权重过滤器的尺寸。 -
numPhases是子像素过滤器阶段的数量。
要销毁图像视图,请调用
// Provided by VK_VERSION_1_0
void vkDestroyImageView(
VkDevice device,
VkImageView imageView,
const VkAllocationCallbacks* pAllocator);
-
device是销毁图像视图的逻辑设备。 -
imageView是要销毁的图像视图。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
要获取图像视图的句柄,请调用
// Provided by VK_NVX_image_view_handle
uint32_t vkGetImageViewHandleNVX(
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo);
-
device是拥有图像视图的逻辑设备。 -
pInfo描述要查询的图像视图和句柄类型。
要获取图像视图的 64 位句柄,请调用
// Provided by VK_NVX_image_view_handle
uint64_t vkGetImageViewHandle64NVX(
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo);
-
device是拥有图像视图的逻辑设备。 -
pInfo描述要查询的图像视图和句柄类型。
VkImageViewHandleInfoNVX 结构的定义如下:
// Provided by VK_NVX_image_view_handle
typedef struct VkImageViewHandleInfoNVX {
VkStructureType sType;
const void* pNext;
VkImageView imageView;
VkDescriptorType descriptorType;
VkSampler sampler;
} VkImageViewHandleInfoNVX;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
imageView是要查询的图像视图。 -
descriptorType是要查询句柄的描述符类型。 -
sampler是生成句柄时与图像视图组合的采样器。
要获取图像视图的设备地址,请调用
// Provided by VK_NVX_image_view_handle
VkResult vkGetImageViewAddressNVX(
VkDevice device,
VkImageView imageView,
VkImageViewAddressPropertiesNVX* pProperties);
-
device是拥有图像视图的逻辑设备。 -
imageView是图像视图的句柄。 -
当调用返回时,
pProperties包含设备地址和大小。
VkImageViewAddressPropertiesNVX 结构的定义如下:
// Provided by VK_NVX_image_view_handle
typedef struct VkImageViewAddressPropertiesNVX {
VkStructureType sType;
void* pNext;
VkDeviceAddress deviceAddress;
VkDeviceSize size;
} VkImageViewAddressPropertiesNVX;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
deviceAddress是图像视图的设备地址。 -
size是图像视图设备内存的大小(以字节为单位)。
图像视图格式特性
VkImageView 的有效使用可能取决于图像视图的格式特性,定义如下。此类约束记录在受影响的有效用法声明中。
-
如果支持 Vulkan 1.3 或支持
VK_KHR_format_feature_flags2扩展,并且 VkImageViewCreateInfo::image是使用VK_IMAGE_TILING_LINEAR创建的,则图像视图的格式特性集是 VkFormatProperties3::linearTilingFeatures的值,通过对与 VkImageViewCreateInfo::format相同的format调用 vkGetPhysicalDeviceFormatProperties2 找到。 -
如果不支持 Vulkan 1.3 且不支持
VK_KHR_format_feature_flags2扩展,并且 VkImageViewCreateInfo::image是使用VK_IMAGE_TILING_LINEAR创建的,则图像视图的格式特性集是通过对与 VkImageViewCreateInfo::format相同的format调用 vkGetPhysicalDeviceFormatProperties 找到的 VkFormatProperties::linearTilingFeatures的值与以下各项的并集:-
如果格式是深度/模板格式并且图像视图特性还包含
VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT,则为VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT。 -
如果格式是扩展存储格式之一,并且启用了
shaderStorageImageReadWithoutFormat特性,则为VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT。 -
如果格式是扩展存储格式之一,并且启用了
shaderStorageImageWriteWithoutFormat特性,则为VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT。
-
-
如果支持 Vulkan 1.3 或支持
VK_KHR_format_feature_flags2扩展,且 VkImageViewCreateInfo::image是使用VK_IMAGE_TILING_OPTIMAL创建的,但没有使用 Android 硬件缓冲区外部格式 或 QNX Screen 缓冲区外部格式,那么图像视图的格式特性集是 VkFormatProperties::optimalTilingFeatures或 VkFormatProperties3::optimalTilingFeatures的值,该值是通过在与 VkImageViewCreateInfo::format相同的format上调用 vkGetPhysicalDeviceFormatProperties 或 vkGetPhysicalDeviceImageFormatProperties2 找到的。 -
如果不支持 Vulkan 1.3 且不支持
VK_KHR_format_feature_flags2扩展,且 VkImageViewCreateInfo::image是使用VK_IMAGE_TILING_OPTIMAL创建的,但没有使用 Android 硬件缓冲区外部格式 或 QNX Screen 缓冲区外部格式,那么图像视图的格式特性集是 VkFormatProperties::optimalTilingFeatures的值,该值是通过在与 VkImageViewCreateInfo::format相同的format上调用 vkGetPhysicalDeviceFormatProperties 找到的,与以下各项的并集:-
如果格式是深度/模板格式并且图像视图特性还包含
VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT,则为VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT。 -
如果格式是扩展存储格式之一,并且启用了
shaderStorageImageReadWithoutFormat,则为VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT。 -
如果格式是扩展存储格式之一,并且启用了
shaderStorageImageWriteWithoutFormat,则为VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT。
-
-
如果 VkImageViewCreateInfo::
image是使用 Android 硬件缓冲区外部格式 创建的,则图像视图的格式特性集是 VkAndroidHardwareBufferFormatPropertiesANDROID::formatFeatures的值,该值是通过在导入到 VkDeviceMemory 的 Android 硬件缓冲区上调用 vkGetAndroidHardwareBufferPropertiesANDROID 找到的,而 VkImageViewCreateInfo::image被绑定到该 VkDeviceMemory。 -
如果 VkImageViewCreateInfo::
image是使用 QNX Screen 缓冲区外部格式 创建的,则图像视图的格式特性集是 VkScreenBufferFormatPropertiesQNX::formatFeatures的值,该值是通过在导入到 VkDeviceMemory 的 QNX Screen 缓冲区上调用 vkGetScreenBufferPropertiesQNX 找到的,而 VkImageViewCreateInfo::image被绑定到该 VkDeviceMemory。 -
如果 VkImageViewCreateInfo::
image是使用链接的 VkBufferCollectionImageCreateInfoFUCHSIA 创建的,则图像视图的格式特性集是 VkBufferCollectionPropertiesFUCHSIA::formatFeatures的值,该值是通过在图像创建时,对作为 VkBufferCollectionImageCreateInfoFUCHSIA::collection传递的缓冲区集合调用 vkGetBufferCollectionPropertiesFUCHSIA 找到的。 -
如果 VkImageViewCreateInfo::
image是使用VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT创建的,则-
图像的 DRM 格式修改器是通过调用 vkGetImageDrmFormatModifierPropertiesEXT 找到的 VkImageDrmFormatModifierPropertiesEXT::
drmFormatModifier的值。 -
令 VkDrmFormatModifierPropertiesListEXT::
pDrmFormatModifierProperties为通过在与 VkImageViewCreateInfo::format相同的format上调用 vkGetPhysicalDeviceFormatProperties2 找到的数组。 -
让
VkDrmFormatModifierPropertiesEXT prop是其drmFormatModifier成员是图像 DRM 格式修改器值的数组元素。 -
然后,图像视图的格式特性集是
prop::drmFormatModifierTilingFeatures。
-
VkImageViewMinLodCreateInfoEXT 结构定义如下
// Provided by VK_EXT_image_view_min_lod
typedef struct VkImageViewMinLodCreateInfoEXT {
VkStructureType sType;
const void* pNext;
float minLod;
} VkImageViewMinLodCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
minLod是用于限制此 VkImageView 可访问的最小 LOD 的值。
如果 pNext 链包含 VkImageViewMinLodCreateInfoEXT 结构,则该结构包含一个参数,用于指定在 图像级别选择、纹素收集和 整数纹素坐标操作期间限制最小 LOD 值的值。
如果图像视图包含 VkImageViewMinLodCreateInfoEXT 并且它被用作采样操作的一部分
minLodFloatimageView = minLod
否则
minLodFloatimageView = 0.0
还为访问整数 mipmap 级别的采样操作定义了此参数的整数变体
minLodIntegerimageView = ⌊minLodFloatimageView⌋
加速结构
加速结构是由实现构建的不透明数据结构,用于更有效地对提供的几何数据执行空间查询。对于这些扩展,加速结构要么是包含一组底层加速结构的顶层加速结构,要么是包含一组自定义几何形状的轴对齐边界框或一组三角形的底层加速结构。
顶层加速结构中的每个实例都包含对底层加速结构的引用,以及实例变换加上索引到着色器绑定的信息。顶层加速结构是绑定到加速描述符的内容,例如在光线跟踪管道中在着色器内部进行跟踪。
VK_KHR_acceleration_structure 扩展的加速结构由 VkAccelerationStructureKHR 句柄表示
// Provided by VK_KHR_acceleration_structure
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR)
要创建加速结构,请调用
// Provided by VK_KHR_acceleration_structure
VkResult vkCreateAccelerationStructureKHR(
VkDevice device,
const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkAccelerationStructureKHR* pAccelerationStructure);
-
device是创建加速结构对象的逻辑设备。 -
pCreateInfo是指向 VkAccelerationStructureCreateInfoKHR 结构的指针,该结构包含影响加速结构创建的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pAccelerationStructure是指向VkAccelerationStructureKHR句柄的指针,该句柄返回生成的加速结构对象。
与 Vulkan 中的其他对象类似,加速结构创建仅创建具有特定“形状”的对象。可以构建到加速结构中的几何体的类型和数量由 VkAccelerationStructureCreateInfoKHR 的参数确定。
加速结构数据存储在 VkAccelerationStructureCreateInfoKHR::buffer 引用的对象中。一旦内存绑定到该缓冲区,**必须**通过加速结构构建或加速结构复制命令(例如 vkCmdBuildAccelerationStructuresKHR、vkBuildAccelerationStructuresKHR、vkCmdCopyAccelerationStructureKHR 和 vkCopyAccelerationStructureKHR)来填充。
|
跟踪捕获/回放工具的预期用法是,它将使用加速结构复制命令来序列化和反序列化加速结构数据。在捕获期间,该工具将使用 |
|
调用 vkCreateAccelerationStructureKHR 时,不需要将内存绑定到基础缓冲区。 |
传递给加速结构构建命令的输入缓冲区将在命令执行期间被实现引用。命令完成后,加速结构**可能**会保留对其内部包含的活动实例指定的任何加速结构的引用。除了这种引用之外,加速结构**必须**是完全自包含的。应用程序**可以**重用或释放命令用作输入或暂存的任何内存,而不会影响光线遍历的结果。
VkAccelerationStructureCreateInfoKHR 结构定义为
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureCreateFlagsKHR createFlags;
VkBuffer buffer;
VkDeviceSize offset;
VkDeviceSize size;
VkAccelerationStructureTypeKHR type;
VkDeviceAddress deviceAddress;
} VkAccelerationStructureCreateInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
createFlags是 VkAccelerationStructureCreateFlagBitsKHR 的位掩码,指定加速结构的附加创建参数。 -
buffer是将存储加速结构的缓冲区。 -
offset是加速结构将存储的缓冲区基地址的字节偏移量,并且**必须**是256的倍数。 -
size是加速结构所需的大小。 -
type是一个 VkAccelerationStructureTypeKHR 值,指定将要创建的加速结构的类型。 -
如果正在使用
accelerationStructureCaptureReplay功能,则deviceAddress是从 vkGetAccelerationStructureDeviceAddressKHR 获取的请求加速结构的设备地址。如果deviceAddress为零,则不请求特定地址。
应用程序**应**避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的加速结构,以减少出现 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR 错误的几率。
|
预期的用法是,跟踪捕获/回放工具将向所有使用 实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 |
应用程序**应**创建具有特定 VkAccelerationStructureTypeKHR 而不是 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 的加速结构。
|
|
如果加速结构将成为构建操作的目标,则可以使用 vkGetAccelerationStructureBuildSizesKHR 查询加速结构所需的大小。如果加速结构将成为紧凑复制的目标,则可以使用 vkCmdWriteAccelerationStructuresPropertiesKHR 或 vkWriteAccelerationStructuresPropertiesKHR 来获取所需的紧凑大小。
如果加速结构将成为带有 VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV 的构建操作的目标,则**必须**在 createFlags 中包含 VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV,并在 pNext 中包含 VkAccelerationStructureMotionInfoNV 作为扩展结构,其中实例数作为对象的元数据。
VkAccelerationStructureMotionInfoNV 结构的定义如下:
// Provided by VK_NV_ray_tracing_motion_blur
typedef struct VkAccelerationStructureMotionInfoNV {
VkStructureType sType;
const void* pNext;
uint32_t maxInstances;
VkAccelerationStructureMotionInfoFlagsNV flags;
} VkAccelerationStructureMotionInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
maxInstances是运动顶层加速结构中可能使用的最大实例数。 -
flags为 0,保留供将来使用。
// Provided by VK_NV_ray_tracing_motion_blur
typedef VkFlags VkAccelerationStructureMotionInfoFlagsNV;
VkAccelerationStructureMotionInfoFlagsNV 是一种用于设置掩码的位掩码类型,但目前保留供将来使用。
要获取加速结构的构建大小,请调用:
// Provided by VK_KHR_acceleration_structure
void vkGetAccelerationStructureBuildSizesKHR(
VkDevice device,
VkAccelerationStructureBuildTypeKHR buildType,
const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo,
const uint32_t* pMaxPrimitiveCounts,
VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo);
-
device是将用于创建加速结构的逻辑设备。 -
buildType定义是查询主机还是设备操作(或两者)。 -
pBuildInfo是指向 VkAccelerationStructureBuildGeometryInfoKHR 结构的指针,该结构描述了构建操作的参数。 -
pMaxPrimitiveCounts是一个指向pBuildInfo->geometryCount个uint32_t值的数组的指针,这些值定义了构建到每个几何体中的图元数量。 -
pSizeInfo是指向 VkAccelerationStructureBuildSizesInfoKHR 结构的指针,该结构返回加速结构所需的大小以及给定构建参数所需的暂存缓冲区的大小。
pBuildInfo 的 srcAccelerationStructure、dstAccelerationStructure 和 mode 成员被忽略。 此命令会忽略 pBuildInfo 的任何 VkDeviceOrHostAddressKHR 或 VkDeviceOrHostAddressConstKHR 成员,但会检查 VkAccelerationStructureGeometryTrianglesDataKHR::transformData 的 hostAddress 成员是否为 NULL。
使用此命令返回的 accelerationStructureSize 创建的加速结构支持任何构建或更新,其 VkAccelerationStructureBuildGeometryInfoKHR 结构和 VkAccelerationStructureBuildRangeInfoKHR 结构数组满足以下属性
-
构建命令是主机构建命令,且
buildType为VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR或VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR -
构建命令是设备构建命令,且
buildType为VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR或VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR -
对于 VkAccelerationStructureBuildGeometryInfoKHR
-
其
type和flags成员分别等于pBuildInfo->type和pBuildInfo->flags。 -
geometryCount小于或等于pBuildInfo->geometryCount。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于pBuildInfo->geometryType。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其flags成员等于pBuildInfo中相同元素的相应成员。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于VK_GEOMETRY_TYPE_TRIANGLES_KHR,geometry.triangles的vertexFormat和indexType成员等于pBuildInfo中相同元素的相应成员。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于VK_GEOMETRY_TYPE_TRIANGLES_KHR,geometry.triangles的maxVertex成员小于或等于pBuildInfo中相同元素的相应成员。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于VK_GEOMETRY_TYPE_TRIANGLES_KHR,如果geometry.triangles的transformData成员中的适用地址不为NULL,则pBuildInfo中对应的transformData.hostAddress参数不为NULL。
-
-
对于与 VkAccelerationStructureBuildGeometryInfoKHR 相对应的每个 VkAccelerationStructureBuildRangeInfoKHR
-
其
primitiveCount成员小于或等于pMaxPrimitiveCounts的相应元素。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于VK_GEOMETRY_TYPE_TRIANGLES_KHR,如果pNext链包含 VkAccelerationStructureTrianglesOpacityMicromapEXT,则pBuildInfo的对应成员也包含 VkAccelerationStructureTrianglesOpacityMicromapEXT,且具有等效的micromap。 -
对于
pGeometries或ppGeometries中给定索引处的每个元素,其geometryType成员等于VK_GEOMETRY_TYPE_TRIANGLES_KHR,如果pNext链包含 VkAccelerationStructureTrianglesDisplacementMicromapNV,则pBuildInfo的对应成员也包含 VkAccelerationStructureTrianglesDisplacementMicromapNV,且具有等效的micromap。
-
类似地,updateScratchSize 值将支持任何指定 VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR mode 的构建命令,满足上述条件,并且 buildScratchSize 值将支持任何指定 VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR mode 的构建命令,满足上述条件。
VkAccelerationStructureBuildSizesInfoKHR 结构描述了加速结构和暂存缓冲区所需的构建大小,其定义如下
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureBuildSizesInfoKHR {
VkStructureType sType;
const void* pNext;
VkDeviceSize accelerationStructureSize;
VkDeviceSize updateScratchSize;
VkDeviceSize buildScratchSize;
} VkAccelerationStructureBuildSizesInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
accelerationStructureSize是 VkAccelerationStructureKHR 中用于构建或更新操作所需的字节大小。 -
updateScratchSize是更新操作的暂存缓冲区中所需的字节大小。 -
buildScratchSize是构建操作的暂存缓冲区中所需的字节大小。
VK_NV_ray_tracing扩展的加速结构由类似的VkAccelerationStructureNV句柄表示。
// Provided by VK_NV_ray_tracing
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureNV)
要创建加速结构,请调用
// Provided by VK_NV_ray_tracing
VkResult vkCreateAccelerationStructureNV(
VkDevice device,
const VkAccelerationStructureCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkAccelerationStructureNV* pAccelerationStructure);
-
device是创建缓冲区对象的逻辑设备。 -
pCreateInfo是指向VkAccelerationStructureCreateInfoNV结构的指针,该结构包含影响加速结构创建的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pAccelerationStructure是指向VkAccelerationStructureNV句柄的指针,其中返回生成的加速结构对象。
与Vulkan中的其他对象类似,加速结构的创建仅创建了一个具有特定“形状”的对象,该“形状”由VkAccelerationStructureInfoNV中的信息和pCreateInfo中的compactedSize指定。
一旦使用vkBindAccelerationStructureMemoryNV将内存绑定到加速结构,该内存将通过调用vkCmdBuildAccelerationStructureNV和vkCmdCopyAccelerationStructureNV进行填充。
加速结构创建使用几何体的计数和类型信息,但不使用结构中的数据引用。
VkAccelerationStructureCreateInfoNV结构定义为
// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureCreateInfoNV {
VkStructureType sType;
const void* pNext;
VkDeviceSize compactedSize;
VkAccelerationStructureInfoNV info;
} VkAccelerationStructureCreateInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
compactedSize是来自vkCmdWriteAccelerationStructuresPropertiesNV结果的大小,如果此加速结构将成为压缩复制的目标。 -
info是VkAccelerationStructureInfoNV结构,指定创建的加速结构的进一步参数。
VkAccelerationStructureInfoNV结构定义为
// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureInfoNV {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureTypeNV type;
VkBuildAccelerationStructureFlagsNV flags;
uint32_t instanceCount;
uint32_t geometryCount;
const VkGeometryNV* pGeometries;
} VkAccelerationStructureInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
type是一个VkAccelerationStructureTypeNV值,指定将要创建的加速结构的类型。 -
flags是一个VkBuildAccelerationStructureFlagBitsNV的位掩码,指定加速结构的附加参数。 -
instanceCount指定新加速结构中将存在的实例数量。 -
geometryCount指定新加速结构中将存在的几何体数量。 -
pGeometries是指向包含传递到加速结构的场景数据的geometryCount个VkGeometryNV结构数组的指针。
VkAccelerationStructureInfoNV包含的信息既用于使用vkCreateAccelerationStructureNV创建加速结构,又与实际几何数据结合使用,以使用vkCmdBuildAccelerationStructureNV构建加速结构。
在 VkAccelerationStructureCreateInfoKHR::type 或 VkAccelerationStructureInfoNV::type 中设置的值指定加速结构的类型,包括:
// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureTypeKHR {
VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0,
VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1,
VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2,
// Provided by VK_NV_ray_tracing
VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,
// Provided by VK_NV_ray_tracing
VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR,
} VkAccelerationStructureTypeKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkAccelerationStructureTypeKHR VkAccelerationStructureTypeNV;
-
VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR是一个顶层加速结构,包含指向底层加速结构的实例数据。 -
VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR是一个底层加速结构,包含要相交的 AABB 或几何体。 -
VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR是一种加速结构,其类型在构建时确定,用于特殊情况。 在这些情况下,加速结构类型在创建时未知,但必须在构建时指定为顶层或底层。
可以在 VkAccelerationStructureCreateInfoKHR::createFlags 中设置的位,指定加速结构的其他创建参数,包括:
// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureCreateFlagBitsKHR {
VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0x00000001,
// Provided by VK_EXT_descriptor_buffer
VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008,
// Provided by VK_NV_ray_tracing_motion_blur
VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0x00000004,
} VkAccelerationStructureCreateFlagBitsKHR;
-
VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR指定加速结构的地址可以被保存并在后续运行中重用。 -
VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT指定在捕获和重放时(例如,用于跟踪捕获和重放),加速结构可以与描述符缓冲区一起使用,有关更多详细信息,请参阅 VkOpaqueCaptureDescriptorDataCreateInfoEXT。 -
VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV指定加速结构将与运动信息一起使用,有关更多详细信息,请参阅 VkAccelerationStructureMotionInfoNV。
// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkAccelerationStructureCreateFlagsKHR;
VkAccelerationStructureCreateFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkAccelerationStructureCreateFlagBitsKHR 的掩码。
可以在 VkAccelerationStructureBuildGeometryInfoKHR::flags 或 VkAccelerationStructureInfoNV::flags 中设置的位,指定加速结构构建的其他参数,包括:
// Provided by VK_KHR_acceleration_structure
typedef enum VkBuildAccelerationStructureFlagBitsKHR {
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR = 0x00000001,
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR = 0x00000002,
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR = 0x00000004,
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR = 0x00000008,
VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR = 0x00000010,
// Provided by VK_NV_ray_tracing_motion_blur
VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV = 0x00000020,
// Provided by VK_EXT_opacity_micromap
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 0x00000040,
// Provided by VK_EXT_opacity_micromap
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000080,
// Provided by VK_EXT_opacity_micromap
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 0x00000100,
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_NV_displacement_micromap
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = 0x00000200,
#endif
// Provided by VK_KHR_ray_tracing_position_fetch
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR = 0x00000800,
// Provided by VK_NV_ray_tracing
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR,
} VkBuildAccelerationStructureFlagBitsKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkBuildAccelerationStructureFlagBitsKHR VkBuildAccelerationStructureFlagBitsNV;
-
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR指定指定的加速结构可以在 VkAccelerationStructureBuildGeometryInfoKHR 中使用mode为VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR或在 vkCmdBuildAccelerationStructureNV 中使用update为VK_TRUE进行更新。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR指定指定的加速结构可以作为复制加速结构命令的源,使用mode为VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR来生成压缩的加速结构。 -
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR指定给定的加速结构构建应优先考虑跟踪性能而不是构建时间。 -
VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR指定给定的加速结构构建应优先考虑构建时间而不是跟踪性能。 -
VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR指定此加速结构应最大限度地减少暂存内存和最终结果加速结构的大小,可能以牺牲构建时间或跟踪性能为代价。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT指定与指定加速结构关联的不透明度微映射可能随着加速结构更新而更改。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT指定与指定加速结构关联的不透明度微映射的数据可能随着加速结构更新而更改。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT指定指定的加速结构可能在设置了VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT的实例中被引用。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR指定在获取命中三角形的顶点位置时可以使用指定的加速结构。 -
VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV指定与指定加速结构关联的位移微映射可能随着加速结构更新而更改。
|
|
|
|
// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkBuildAccelerationStructureFlagsKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkBuildAccelerationStructureFlagsKHR VkBuildAccelerationStructureFlagsNV;
VkBuildAccelerationStructureFlagsKHR 是一个位掩码类型,用于设置零个或多个 VkBuildAccelerationStructureFlagBitsKHR 的掩码。
VkGeometryNV 结构描述了底层加速结构中的几何体,定义如下:
// Provided by VK_NV_ray_tracing
typedef struct VkGeometryNV {
VkStructureType sType;
const void* pNext;
VkGeometryTypeKHR geometryType;
VkGeometryDataNV geometry;
VkGeometryFlagsKHR flags;
} VkGeometryNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
geometryType指定此几何体引用的 VkGeometryTypeKHR。 -
geometry包含 VkGeometryDataNV 中描述的几何数据。 -
flags具有 VkGeometryFlagBitsKHR,描述此几何体的选项。
几何体类型由 VkGeometryTypeKHR 指定,其取值为
// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryTypeKHR {
VK_GEOMETRY_TYPE_TRIANGLES_KHR = 0,
VK_GEOMETRY_TYPE_AABBS_KHR = 1,
VK_GEOMETRY_TYPE_INSTANCES_KHR = 2,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_TYPE_TRIANGLES_NV = VK_GEOMETRY_TYPE_TRIANGLES_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_TYPE_AABBS_NV = VK_GEOMETRY_TYPE_AABBS_KHR,
} VkGeometryTypeKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkGeometryTypeKHR VkGeometryTypeNV;
-
VK_GEOMETRY_TYPE_TRIANGLES_KHR指定由三角形组成的几何体类型。 -
VK_GEOMETRY_TYPE_AABBS_KHR指定由轴对齐边界框组成的几何体类型。 -
VK_GEOMETRY_TYPE_INSTANCES_KHR指定由加速结构实例组成的几何体类型。
指定加速结构构建中几何体附加参数的位为
// Provided by VK_KHR_acceleration_structure
typedef enum VkGeometryFlagBitsKHR {
VK_GEOMETRY_OPAQUE_BIT_KHR = 0x00000001,
VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR = 0x00000002,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_OPAQUE_BIT_NV = VK_GEOMETRY_OPAQUE_BIT_KHR,
// Provided by VK_NV_ray_tracing
VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_NV = VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR,
} VkGeometryFlagBitsKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkGeometryFlagBitsKHR VkGeometryFlagBitsNV;
-
VK_GEOMETRY_OPAQUE_BIT_KHR指定此几何体即使在命中组中存在也不会调用 any-hit 着色器。 -
VK_GEOMETRY_NO_DUPLICATE_ANY_HIT_INVOCATION_BIT_KHR指定实现必须只对该几何体中的每个图元调用一次 any-hit 着色器。如果此位不存在,则实现可能对此几何体调用多次 any-hit 着色器。
// Provided by VK_KHR_acceleration_structure
typedef VkFlags VkGeometryFlagsKHR;
或等效形式:
// Provided by VK_NV_ray_tracing
typedef VkGeometryFlagsKHR VkGeometryFlagsNV;
VkGeometryFlagsKHR 是一个用于设置零个或多个 VkGeometryFlagBitsKHR 的掩码的位掩码类型。
VkGeometryDataNV 结构体指定底层加速结构中的几何体,定义如下
// Provided by VK_NV_ray_tracing
typedef struct VkGeometryDataNV {
VkGeometryTrianglesNV triangles;
VkGeometryAABBNV aabbs;
} VkGeometryDataNV;
-
如果 VkGeometryNV::
geometryType为VK_GEOMETRY_TYPE_TRIANGLES_NV,则triangles包含三角形数据。 -
如果 VkGeometryNV::
geometryType为VK_GEOMETRY_TYPE_AABBS_NV,则aabbs包含轴对齐边界框数据。
VkGeometryTrianglesNV 结构体指定底层加速结构中的三角形几何体,定义如下
// Provided by VK_NV_ray_tracing
typedef struct VkGeometryTrianglesNV {
VkStructureType sType;
const void* pNext;
VkBuffer vertexData;
VkDeviceSize vertexOffset;
uint32_t vertexCount;
VkDeviceSize vertexStride;
VkFormat vertexFormat;
VkBuffer indexData;
VkDeviceSize indexOffset;
uint32_t indexCount;
VkIndexType indexType;
VkBuffer transformData;
VkDeviceSize transformOffset;
} VkGeometryTrianglesNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
vertexData是包含此几何体的顶点数据的缓冲区。 -
vertexOffset是vertexData中包含此几何体顶点数据的偏移量(以字节为单位)。 -
vertexCount是有效顶点的数量。 -
vertexStride是每个顶点之间的跨度(以字节为单位)。 -
vertexFormat是一个 VkFormat,描述每个顶点元素的格式。 -
indexData是包含此几何体的索引数据的缓冲区。 -
indexOffset是indexData中包含此几何体索引数据的偏移量(以字节为单位)。 -
indexCount是此几何体中包含的索引数量。 -
indexType是一个 VkIndexType,描述每个索引的格式。 -
transformData是一个可选的缓冲区,包含一个 VkTransformMatrixNV 结构体,定义要应用于此几何体的变换。 -
transformOffset是transformData中上述变换信息的偏移量(以字节为单位)。
如果 indexType 为 VK_INDEX_TYPE_NONE_NV,则此结构体描述由 vertexCount 确定的一组三角形。否则,此结构体描述由 indexCount 确定的一组索引三角形。
VkGeometryAABBNV 结构指定了底层加速结构中的轴对齐边界框几何体,其定义如下
// Provided by VK_NV_ray_tracing
typedef struct VkGeometryAABBNV {
VkStructureType sType;
const void* pNext;
VkBuffer aabbData;
uint32_t numAABBs;
uint32_t stride;
VkDeviceSize offset;
} VkGeometryAABBNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
aabbData是包含轴对齐边界框数据的缓冲区。 -
numAABBs是此几何体中的 AABB 数量。 -
stride是aabbData中 AABB 之间的字节跨度。 -
offset是aabbData中第一个 AABB 的字节偏移量。
内存中的 AABB 数据由六个 32 位浮点数组成,它们是最小 x、y 和 z 值,后跟最大 x、y 和 z 值。
要销毁加速结构,请调用
// Provided by VK_KHR_acceleration_structure
void vkDestroyAccelerationStructureKHR(
VkDevice device,
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator);
-
device是销毁加速结构的逻辑设备。 -
accelerationStructure是要销毁的加速结构。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
要销毁加速结构,请调用
// Provided by VK_NV_ray_tracing
void vkDestroyAccelerationStructureNV(
VkDevice device,
VkAccelerationStructureNV accelerationStructure,
const VkAllocationCallbacks* pAllocator);
-
device是销毁缓冲区的逻辑设备。 -
accelerationStructure是要销毁的加速结构。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
加速结构对结构对象本身、构建用的临时空间和更新用的临时空间都有内存要求。
临时空间以 VkBuffer 的形式分配,因此对于 VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV 和 VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV,此调用返回的 pMemoryRequirements->alignment 和 pMemoryRequirements->memoryTypeBits 值必须填充为零,并且应用程序应该忽略它们。
要查询内存要求,请调用
// Provided by VK_NV_ray_tracing
void vkGetAccelerationStructureMemoryRequirementsNV(
VkDevice device,
const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
VkMemoryRequirements2KHR* pMemoryRequirements);
-
device是创建加速结构的逻辑设备。 -
pInfo是一个指向 VkAccelerationStructureMemoryRequirementsInfoNV 结构的指针,该结构指定要获取内存需求的加速结构。 -
pMemoryRequirements是一个指向 VkMemoryRequirements2KHR 结构的指针,请求的加速结构内存需求将在此结构中返回。
VkAccelerationStructureMemoryRequirementsInfoNV 结构的定义如下:
// Provided by VK_NV_ray_tracing
typedef struct VkAccelerationStructureMemoryRequirementsInfoNV {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureMemoryRequirementsTypeNV type;
VkAccelerationStructureNV accelerationStructure;
} VkAccelerationStructureMemoryRequirementsInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
type选择要查询的内存需求类型。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV返回对象本身的内存需求。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV返回构建时临时内存的内存需求。VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV返回更新时临时内存的内存需求。 -
accelerationStructure是要查询内存需求的加速结构。
VkAccelerationStructureMemoryRequirementsInfoNV 中 type 的可能值为:
// Provided by VK_NV_ray_tracing
typedef enum VkAccelerationStructureMemoryRequirementsTypeNV {
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV = 0,
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV = 1,
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV = 2,
} VkAccelerationStructureMemoryRequirementsTypeNV;
-
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV请求VkAccelerationStructureNV后备存储的内存需求。 -
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV请求初始构建期间临时空间的内存需求。 -
VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV请求更新期间临时空间的内存需求。
vkGetAccelerationStructureBuildSizesKHR 中 buildType 的可能值为:
// Provided by VK_KHR_acceleration_structure
typedef enum VkAccelerationStructureBuildTypeKHR {
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR = 0,
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR = 1,
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR = 2,
} VkAccelerationStructureBuildTypeKHR;
-
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR请求主机执行操作的内存需求。 -
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR请求设备执行操作的内存需求。 -
VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR请求主机或设备执行操作的内存需求。
要一次将内存附加到一个或多个加速结构,请调用
// Provided by VK_NV_ray_tracing
VkResult vkBindAccelerationStructureMemoryNV(
VkDevice device,
uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoNV* pBindInfos);
-
device是拥有加速结构和内存的逻辑设备。 -
bindInfoCount是pBindInfos中的元素数量。 -
pBindInfos是一个指向 VkBindAccelerationStructureMemoryInfoNV 结构数组的指针,该数组描述了要绑定的加速结构和内存。
VkBindAccelerationStructureMemoryInfoNV 结构的定义如下:
// Provided by VK_NV_ray_tracing
typedef struct VkBindAccelerationStructureMemoryInfoNV {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureNV accelerationStructure;
VkDeviceMemory memory;
VkDeviceSize memoryOffset;
uint32_t deviceIndexCount;
const uint32_t* pDeviceIndices;
} VkBindAccelerationStructureMemoryInfoNV;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
accelerationStructure是要附加到内存的加速结构。 -
memory是一个VkDeviceMemory对象,描述要附加的设备内存。 -
memoryOffset是要绑定到加速结构的内存区域的起始偏移量。从memoryOffset字节开始,memory中 VkMemoryRequirements::size成员中返回的字节数将绑定到指定的加速结构。 -
deviceIndexCount是pDeviceIndices中的元素数量。 -
pDeviceIndices是一个指向设备索引数组的指针。
为了允许在需要时使用设备代码构造几何实例,我们需要能够查询加速结构的不透明句柄。这个句柄是一个 8 字节的值。要获取此句柄,请调用
// Provided by VK_NV_ray_tracing
VkResult vkGetAccelerationStructureHandleNV(
VkDevice device,
VkAccelerationStructureNV accelerationStructure,
size_t dataSize,
void* pData);
-
device是拥有加速结构的逻辑设备。 -
accelerationStructure是加速结构。 -
dataSize是pData指向的缓冲区的大小(以字节为单位)。 -
pData是一个指向应用程序分配的缓冲区的指针,结果将写入其中。
要查询加速结构的 64 位设备地址,请调用
// Provided by VK_KHR_acceleration_structure
VkDeviceAddress vkGetAccelerationStructureDeviceAddressKHR(
VkDevice device,
const VkAccelerationStructureDeviceAddressInfoKHR* pInfo);
-
device是创建加速结构的逻辑设备。 -
pInfo是指向 VkAccelerationStructureDeviceAddressInfoKHR 结构的指针,该结构指定要检索地址的加速结构。
64 位返回值是加速结构的地址,可用于涉及加速结构的设备和着色器操作,例如光线遍历和加速结构构建。
如果加速结构是使用 VkAccelerationStructureCreateInfoKHR::deviceAddress 的非零值创建的,则返回值将是相同的地址。
如果加速结构是使用 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 的 type 创建的,则返回的地址必须与使用同一 VkBuffer 分配的 type 为 VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR 的其他加速结构的相对偏移量保持一致。也就是说,两者返回的地址之间的差值必须与加速结构创建时提供的偏移量之差相同。
返回的地址必须与 256 字节对齐。
|
对于 |
VkAccelerationStructureDeviceAddressInfoKHR 结构的定义如下
// Provided by VK_KHR_acceleration_structure
typedef struct VkAccelerationStructureDeviceAddressInfoKHR {
VkStructureType sType;
const void* pNext;
VkAccelerationStructureKHR accelerationStructure;
} VkAccelerationStructureDeviceAddressInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
accelerationStructure指定要查询其地址的加速结构。
微映射图
微型映射是不透明的数据结构,由实现构建,用于编码子三角形数据,以便包含在加速结构中。
微型映射由 VkMicromapEXT 句柄表示。
// Provided by VK_EXT_opacity_micromap
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkMicromapEXT)
要创建微型映射,请调用
// Provided by VK_EXT_opacity_micromap
VkResult vkCreateMicromapEXT(
VkDevice device,
const VkMicromapCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkMicromapEXT* pMicromap);
-
device是创建加速结构对象的逻辑设备。 -
pCreateInfo是指向 VkMicromapCreateInfoEXT 结构的指针,该结构包含影响微型映射创建的参数。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。 -
pMicromap是指向VkMicromapEXT句柄的指针,结果微型映射对象将返回到该句柄中。
与 Vulkan 中的其他对象类似,微型映射的创建仅仅是创建一个具有特定“形状”的对象。可以构建到微型映射中的几何图形的类型和数量由 VkMicromapCreateInfoEXT 的参数确定。
微型映射数据存储在 VkMicromapCreateInfoEXT::buffer 引用的对象中。一旦内存绑定到该缓冲区,它必须通过微型映射构建或微型映射复制命令(如 vkCmdBuildMicromapsEXT、vkBuildMicromapsEXT、vkCmdCopyMicromapEXT 和 vkCopyMicromapEXT)填充。
|
跟踪捕获/重放工具的预期用法是,它将使用微型映射复制命令序列化和反序列化微型映射数据。在捕获期间,该工具将使用 vkCopyMicromapToMemoryEXT 或 vkCmdCopyMicromapToMemoryEXT,其中 |
传递给微型映射构建命令的输入缓冲区将在命令执行期间被实现引用。微型映射必须是完全自包含的。应用程序可以重用或释放命令用作输入或暂存的任何内存,而不会影响后续使用微型映射的加速结构构建或该加速结构的遍历结果。
VkMicromapCreateInfoEXT 结构定义如下:
// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkMicromapCreateFlagsEXT createFlags;
VkBuffer buffer;
VkDeviceSize offset;
VkDeviceSize size;
VkMicromapTypeEXT type;
VkDeviceAddress deviceAddress;
} VkMicromapCreateInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
createFlags是 VkMicromapCreateFlagBitsEXT 的位掩码,指定微型映射的其他创建参数。 -
buffer是将存储微型映射的缓冲区。 -
offset是从缓冲区基址开始存储微型映射的偏移量(以字节为单位),并且必须是256的倍数。 -
size是微型映射所需的大小。 -
type是 VkMicromapTypeEXT 值,指定将要创建的微型映射的类型。 -
deviceAddress是如果使用micromapCaptureReplay功能,则为微型映射请求的设备地址。
如果 deviceAddress 为零,则不请求特定地址。
如果 deviceAddress 不为零,则 deviceAddress 必须是从同一实现上以相同方式创建的微型映射检索的地址。微型映射必须也放置在以相同方式创建的 buffer 上,并且偏移量 offset 相同。
应用程序应避免在同一进程中创建具有应用程序提供的地址和实现提供的地址的微型映射,以减少出现 VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR 错误的几率。
|
此操作的预期用法是,跟踪捕获/重放工具会将 实现预期会将此类缓冲区在 GPU 地址空间中分隔开,以便正常分配避免使用这些地址。应用程序和工具应避免混合使用为使用 |
如果微型映射将成为构建操作的目标,则可以使用 vkGetMicromapBuildSizesEXT 查询微型映射的所需大小。
要获取微型图的构建大小,请调用
// Provided by VK_EXT_opacity_micromap
void vkGetMicromapBuildSizesEXT(
VkDevice device,
VkAccelerationStructureBuildTypeKHR buildType,
const VkMicromapBuildInfoEXT* pBuildInfo,
VkMicromapBuildSizesInfoEXT* pSizeInfo);
-
device是将用于创建微型图的逻辑设备。 -
buildType定义是查询主机还是设备操作(或两者)。 -
pBuildInfo是指向 VkMicromapBuildInfoEXT 结构的指针,该结构描述了构建操作的参数。 -
pSizeInfo是指向 VkMicromapBuildSizesInfoEXT 结构的指针,该结构返回微型图所需的大小以及给定构建参数的临时缓冲区所需的大小。
pBuildInfo 的 dstMicromap 和 mode 成员被忽略。此命令将忽略 pBuildInfo 的任何 VkDeviceOrHostAddressKHR 成员。
使用此命令返回的 micromapSize 创建的微型图支持任何使用 VkMicromapBuildInfoEXT 结构的构建,但须符合以下属性
-
构建命令是主机构建命令,且
buildType为VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_KHR或VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR -
构建命令是设备构建命令,且
buildType为VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR或VK_ACCELERATION_STRUCTURE_BUILD_TYPE_HOST_OR_DEVICE_KHR -
-
其
type和flags成员分别等于pBuildInfo->type和pBuildInfo->flags。 -
pUsageCounts或ppUsageCounts中的使用信息总和等于pBuildInfo->pUsageCounts或pBuildInfo->ppUsageCounts中的使用信息总和。
-
同样,buildScratchSize 值将支持在上述条件下指定 VK_BUILD_MICROMAP_MODE_BUILD_EXT mode 的任何构建命令。
VkMicromapBuildSizesInfoEXT 结构描述了微型图和临时缓冲区所需的构建大小,定义如下
// Provided by VK_EXT_opacity_micromap
typedef struct VkMicromapBuildSizesInfoEXT {
VkStructureType sType;
const void* pNext;
VkDeviceSize micromapSize;
VkDeviceSize buildScratchSize;
VkBool32 discardable;
} VkMicromapBuildSizesInfoEXT;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
micromapSize是在 VkMicromapEXT 中进行构建或更新操作所需的字节大小。 -
buildScratchSize是构建操作的暂存缓冲区中所需的字节大小。 -
discardable指示微型图对象是否可以在加速结构构建或更新后销毁。false 值表示使用此微型图构建的加速结构可能包含对其中包含的数据的引用,并且应用程序在光线遍历结束后必须不要销毁微型图。true 值表示微型图中的信息将按值复制到加速结构中,并且微型图在加速结构构建完成后可以销毁。
可以在 VkMicromapCreateInfoEXT::type 中设置的值,指定微型图的类型为
// Provided by VK_EXT_opacity_micromap
typedef enum VkMicromapTypeEXT {
VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT = 0,
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Provided by VK_NV_displacement_micromap
VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV = 1000397000,
#endif
} VkMicromapTypeEXT;
-
VK_MICROMAP_TYPE_OPACITY_MICROMAP_EXT是包含用于控制三角形不透明度的数据的微型图。 -
VK_MICROMAP_TYPE_DISPLACEMENT_MICROMAP_NV是包含用于控制三角形内子三角形位移的数据的微型图。
可以在 VkMicromapCreateInfoEXT::createFlags 中设置的位,指定微型图的附加创建参数,为
// Provided by VK_EXT_opacity_micromap
typedef enum VkMicromapCreateFlagBitsEXT {
VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT = 0x00000001,
} VkMicromapCreateFlagBitsEXT;
-
VK_MICROMAP_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT指定微型图的地址可以保存并在后续运行中重复使用。
// Provided by VK_EXT_opacity_micromap
typedef VkFlags VkMicromapCreateFlagsEXT;
VkMicromapCreateFlagsEXT 是一种位掩码类型,用于设置零个或多个 VkMicromapCreateFlagBitsEXT 的掩码。
可以在 VkMicromapBuildInfoEXT::flags 中设置的位,指定微型图构建的附加参数,为
// Provided by VK_EXT_opacity_micromap
typedef enum VkBuildMicromapFlagBitsEXT {
VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT = 0x00000001,
VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT = 0x00000002,
VK_BUILD_MICROMAP_ALLOW_COMPACTION_BIT_EXT = 0x00000004,
} VkBuildMicromapFlagBitsEXT;
-
VK_BUILD_MICROMAP_PREFER_FAST_TRACE_BIT_EXT指定给定的微型图构建应该优先考虑跟踪性能而不是构建时间。 -
VK_BUILD_MICROMAP_PREFER_FAST_BUILD_BIT_EXT指定给定的微型图构建应该优先考虑构建时间而不是跟踪性能。
// Provided by VK_EXT_opacity_micromap
typedef VkFlags VkBuildMicromapFlagsEXT;
VkBuildMicromapFlagsEXT 是一种位掩码类型,用于设置零个或多个 VkBuildMicromapFlagBitsEXT 的掩码。
要销毁微型图,请调用
// Provided by VK_EXT_opacity_micromap
void vkDestroyMicromapEXT(
VkDevice device,
VkMicromapEXT micromap,
const VkAllocationCallbacks* pAllocator);
-
device是销毁微型图的逻辑设备。 -
micromap是要销毁的微型图。 -
pAllocator控制主机内存分配,如 内存分配 章节所述。
资源内存关联
资源最初创建为没有后备内存的虚拟分配。设备内存是单独分配的(请参阅设备内存),然后与资源关联。对于稀疏和非稀疏资源,此关联方式有所不同。
使用任何稀疏创建标志创建的资源都被视为稀疏资源。不使用这些标志创建的资源是非稀疏资源。有关稀疏资源的资源内存关联的详细信息,请参阅 稀疏资源。
非稀疏资源在作为参数传递给以下任何操作之前,必须完整且连续地绑定到单个 VkDeviceMemory 对象:
-
创建图像或缓冲区视图
-
更新描述符集
-
在命令缓冲区中记录命令
一旦绑定,内存绑定在资源的生命周期内是不可变的。
在表示多个物理设备的逻辑设备中,缓冲区和图像资源存在于所有物理设备上,但它们在每个物理设备上的内存绑定方式可以不同。每个这样的复制资源都是该资源的一个实例。对于稀疏资源,每个实例的内存绑定方式可以任意不同。对于非稀疏资源,每个实例可以绑定到本地或对等内存实例,或者对于图像,可以绑定到来自本地和/或对等实例的矩形区域。当资源在描述符集中使用时,每个物理设备都会根据其自身实例的内存绑定来解释描述符。
|
没有新的复制命令用于在物理设备之间传输数据。相反,应用程序可以创建一个具有对等映射的资源,并将其用作由单个物理设备执行的传输命令的源或目标,以将数据从一个物理设备复制到另一个物理设备。 |
要确定缓冲区资源的内存需求,请调用
// Provided by VK_VERSION_1_0
void vkGetBufferMemoryRequirements(
VkDevice device,
VkBuffer buffer,
VkMemoryRequirements* pMemoryRequirements);
-
device是拥有该缓冲区的逻辑设备。 -
buffer是要查询的缓冲区。 -
pMemoryRequirements是指向 VkMemoryRequirements 结构的指针,该结构中返回缓冲区对象的内存需求。
要确定未设置 VK_IMAGE_CREATE_DISJOINT_BIT 标志的图像资源的内存需求,请调用
// Provided by VK_VERSION_1_0
void vkGetImageMemoryRequirements(
VkDevice device,
VkImage image,
VkMemoryRequirements* pMemoryRequirements);
-
device是拥有该图像的逻辑设备。 -
image是要查询的图像。 -
pMemoryRequirements是指向 VkMemoryRequirements 结构的指针,该结构中返回图像对象的内存需求。
VkMemoryRequirements 结构定义为
// Provided by VK_VERSION_1_0
typedef struct VkMemoryRequirements {
VkDeviceSize size;
VkDeviceSize alignment;
uint32_t memoryTypeBits;
} VkMemoryRequirements;
-
size是资源所需的内存分配的大小(以字节为单位)。 -
alignment是资源所需的分配内偏移量的对齐方式(以字节为单位)。 -
memoryTypeBits是一个位掩码,其中为资源支持的每个内存类型设置一位。当且仅当物理设备的VkPhysicalDeviceMemoryProperties结构中的内存类型i受资源支持时,才会设置位i。
绑定到外部 Android 硬件缓冲区内存的图像的精确大小在导入或分配内存之前是未知的,因此应用程序在将 VkImage 绑定到内存之前,必须不要使用这样的 VkImage 调用 vkGetImageMemoryRequirements 或 vkGetImageMemoryRequirements2。出于此原因,应用程序也必须不要使用描述外部 Android 硬件缓冲区的 VkImageCreateInfo 调用 vkGetDeviceImageMemoryRequirements。导入 Android 硬件缓冲区内存时,可以通过调用 vkGetAndroidHardwareBufferPropertiesANDROID 来确定 allocationSize。为可以导出到 Android 硬件缓冲区的 VkImage 分配新内存时,内存的 allocationSize 必须为零;实际大小将由专用图像的参数确定。分配内存后,可以通过获取图像的内存需求或通过使用从内存导出的 Android 硬件缓冲区调用 vkGetAndroidHardwareBufferPropertiesANDROID 来获得从内存堆分配的空间量。
为可以导出到 Android 硬件缓冲区的 VkBuffer 分配新内存时,应用程序仍然可以在 VkBuffer 绑定到内存之前使用 VkBuffer 调用 vkGetBufferMemoryRequirements 或 vkGetBufferMemoryRequirements2。
如果查询的资源是使用 VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT、VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT 或 VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT 外部内存句柄类型创建的,则 size 的值没有意义,应该被忽略。
该实现保证了 vkGetBufferMemoryRequirements2、vkGetImageMemoryRequirements2、vkGetDeviceBufferMemoryRequirements、vkGetDeviceImageMemoryRequirements、vkGetBufferMemoryRequirements 和 vkGetImageMemoryRequirements 返回的内存需求的某些属性
-
memoryTypeBits成员始终包含至少一位已设置。 -
如果
buffer是一个不是使用VK_BUFFER_CREATE_SPARSE_BINDING_BIT或VK_BUFFER_CREATE_PROTECTED_BIT位设置创建的VkBuffer,或者如果image是一个不是使用VK_IMAGE_CREATE_PROTECTED_BIT位设置创建的线性图像,则memoryTypeBits成员始终包含至少一个位,该位对应于具有propertyFlags的VkMemoryType,该propertyFlags同时设置了VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT位和VK_MEMORY_PROPERTY_HOST_COHERENT_BIT位。换句话说,可映射的相干内存可以始终附加到这些对象。 -
如果
buffer是使用 VkExternalMemoryBufferCreateInfo::handleTypes设置为0创建的,或者image是使用 VkExternalMemoryImageCreateInfo::handleTypes设置为0创建的,则memoryTypeBits成员始终包含至少一个位,该位对应于具有propertyFlags的VkMemoryType,该propertyFlags设置了VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT位。 -
对于使用 VkBufferCreateInfo 结构中的
flags和usage成员的相同值创建的所有VkBuffer对象,以及传递给 vkCreateBuffer 的 VkExternalMemoryBufferCreateInfo 结构的handleTypes成员,memoryTypeBits成员是相同的。此外,如果类型为 VkBufferUsageFlags 的usage1和usage2使得usage2中设置的位是usage1中设置的位的子集,并且它们具有相同的flags和 VkExternalMemoryBufferCreateInfo::handleTypes,则对于usage1返回的memoryTypeBits中设置的位必须是为usage2返回的memoryTypeBits中设置的位的子集,对于flags的所有值。 -
alignment成员是 2 的幂。 -
对于使用传递给 vkCreateBuffer 的 VkBufferCreateInfo 结构中的
usage和flags成员的相同值组合创建的所有VkBuffer对象,alignment成员是相同的。 -
如果启用了
maintenance4功能,则对于使用传递给 vkCreateImage 的 VkImageCreateInfo 结构中的flags、imageType、format、extent、mipLevels、arrayLayers、samples、tiling和usage成员的相同值组合创建的所有VkImage对象,alignment成员是相同的。 -
alignment成员满足与VkBuffer的usage关联的缓冲区描述符偏移量对齐要求。-
如果
usage包括VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT或VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,则alignment必须是VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment的整数倍。 -
如果
usage包括VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,则alignment必须是VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment的整数倍。 -
如果
usage包括VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,则alignment必须是VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment的整数倍。
-
-
对于使用颜色格式创建的图像,对于使用传递给 vkCreateImage 的 VkImageCreateInfo 结构中的
tiling成员、flags成员的VK_IMAGE_CREATE_SPARSE_BINDING_BIT位和VK_IMAGE_CREATE_PROTECTED_BIT位、flags成员的VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT位、如果 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements属性为VK_FALSE,则usage成员的VK_IMAGE_USAGE_HOST_TRANSFER_BIT位、VkExternalMemoryImageCreateInfo 的handleTypes成员以及usage成员的VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT位 的相同值组合创建的所有VkImage对象,memoryTypeBits成员是相同的。 -
对于使用深度/模板格式创建的图像,对于使用传递给 vkCreateImage 的 VkImageCreateInfo 结构中的
format成员、tiling成员、flags成员的VK_IMAGE_CREATE_SPARSE_BINDING_BIT位和VK_IMAGE_CREATE_PROTECTED_BIT位、flags成员的VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT位、如果 VkPhysicalDeviceHostImageCopyProperties::identicalMemoryTypeRequirements属性为VK_FALSE,则usage成员的VK_IMAGE_USAGE_HOST_TRANSFER_BIT位、VkExternalMemoryImageCreateInfo 的handleTypes成员以及usage成员的VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT位 的相同值组合创建的所有VkImage对象,memoryTypeBits成员是相同的。 -
如果内存要求是针对
VkImage的,则如果image在传递给 vkCreateImage 的 VkImageCreateInfo 结构的usage成员中没有设置VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT位,则memoryTypeBits成员必须不引用具有设置了VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT位的propertyFlags的VkMemoryType。 -
如果内存要求是针对
VkBuffer的,则memoryTypeBits成员必须不引用具有设置了VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT位的propertyFlags的VkMemoryType。此要求的含义是,在所有情况下都不允许为缓冲区分配延迟分配的内存。
-
对于使用 VkBufferCreateInfo 及其
pNext链中指定的相同创建参数组合创建的所有VkBuffer对象,size成员是相同的。 -
对于使用 VkImageCreateInfo 及其
pNext链中指定的相同创建参数组合创建的所有VkImage对象,size成员是相同的。但是,这并不意味着它们彼此之间以相同的方式解释绑定内存的内容。但是,可以使用
VK_IMAGE_CREATE_ALIAS_BIT显式请求该附加保证。 -
如果启用了
maintenance4功能,则这些附加保证适用。-
对于
VkBuffer,在 VkBufferCreateInfo 中指定了更大或相等size创建的另一个VkBuffer的size内存要求永远不会大于它的,所有其他创建参数都相同。 -
对于
VkBuffer,size内存要求永远不会大于将 VkBufferCreateInfo::size与alignment内存要求对齐的结果。 -
对于 VkImage,
size内存要求永远不会大于在extent.width、extent.height和extent.depth中每个都具有更大或相等值的另一个 VkImage 的,所有其他创建参数都相同。 -
由 vkGetDeviceBufferMemoryRequirements 返回的内存要求与如果使用相同的 VkBufferCreateInfo 值创建的
VkBuffer调用 vkGetBufferMemoryRequirements2 返回的内存要求相同。 -
由 vkGetDeviceImageMemoryRequirements 返回的内存要求与如果使用相同的 VkImageCreateInfo 值创建的
VkImage调用 vkGetImageMemoryRequirements2 返回的内存要求相同。
-
要确定缓冲区资源的内存需求,请调用
// Provided by VK_VERSION_1_1
void vkGetBufferMemoryRequirements2(
VkDevice device,
const VkBufferMemoryRequirementsInfo2* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
或等效命令
// Provided by VK_KHR_get_memory_requirements2
void vkGetBufferMemoryRequirements2KHR(
VkDevice device,
const VkBufferMemoryRequirementsInfo2* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
-
device是拥有该缓冲区的逻辑设备。 -
pInfo是指向 VkBufferMemoryRequirementsInfo2 结构的指针,该结构包含内存需求查询所需的参数。 -
pMemoryRequirements是指向 VkMemoryRequirements2 结构的指针,其中返回缓冲区对象的内存需求。
要确定缓冲区资源的内存需求而无需创建对象,请调用
// Provided by VK_VERSION_1_3
void vkGetDeviceBufferMemoryRequirements(
VkDevice device,
const VkDeviceBufferMemoryRequirements* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
或等效命令
// Provided by VK_KHR_maintenance4
void vkGetDeviceBufferMemoryRequirementsKHR(
VkDevice device,
const VkDeviceBufferMemoryRequirements* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
-
device是计划拥有缓冲区的逻辑设备。 -
pInfo是指向 VkDeviceBufferMemoryRequirements 结构的指针,该结构包含内存需求查询所需的参数。 -
pMemoryRequirements是指向 VkMemoryRequirements2 结构的指针,其中返回缓冲区对象的内存需求。
VkBufferMemoryRequirementsInfo2 结构的定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkBufferMemoryRequirementsInfo2 {
VkStructureType sType;
const void* pNext;
VkBuffer buffer;
} VkBufferMemoryRequirementsInfo2;
或等效形式:
// Provided by VK_KHR_get_memory_requirements2
typedef VkBufferMemoryRequirementsInfo2 VkBufferMemoryRequirementsInfo2KHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
buffer是要查询的缓冲区。
VkDeviceBufferMemoryRequirements 结构的定义如下:
// Provided by VK_VERSION_1_3
typedef struct VkDeviceBufferMemoryRequirements {
VkStructureType sType;
const void* pNext;
const VkBufferCreateInfo* pCreateInfo;
} VkDeviceBufferMemoryRequirements;
或等效形式:
// Provided by VK_KHR_maintenance4
typedef VkDeviceBufferMemoryRequirements VkDeviceBufferMemoryRequirementsKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
pCreateInfo是指向 VkBufferCreateInfo 结构的指针,该结构包含影响要查询的缓冲区创建的参数。
要确定图像资源的内存需求,请调用
// Provided by VK_VERSION_1_1
void vkGetImageMemoryRequirements2(
VkDevice device,
const VkImageMemoryRequirementsInfo2* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
或等效命令
// Provided by VK_KHR_get_memory_requirements2
void vkGetImageMemoryRequirements2KHR(
VkDevice device,
const VkImageMemoryRequirementsInfo2* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
-
device是拥有该图像的逻辑设备。 -
pInfo是指向 VkImageMemoryRequirementsInfo2 结构的指针,该结构包含内存需求查询所需的参数。 -
pMemoryRequirements是指向 VkMemoryRequirements2 结构的指针,其中返回图像对象的内存需求。
要确定图像资源的内存需求而无需创建对象,请调用
// Provided by VK_VERSION_1_3
void vkGetDeviceImageMemoryRequirements(
VkDevice device,
const VkDeviceImageMemoryRequirements* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
或等效命令
// Provided by VK_KHR_maintenance4
void vkGetDeviceImageMemoryRequirementsKHR(
VkDevice device,
const VkDeviceImageMemoryRequirements* pInfo,
VkMemoryRequirements2* pMemoryRequirements);
-
device是计划拥有图像的逻辑设备。 -
pInfo是指向 VkDeviceImageMemoryRequirements 结构的指针,该结构包含内存需求查询所需的参数。 -
pMemoryRequirements是指向 VkMemoryRequirements2 结构的指针,其中返回图像对象的内存需求。
VkImageMemoryRequirementsInfo2 结构的定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkImageMemoryRequirementsInfo2 {
VkStructureType sType;
const void* pNext;
VkImage image;
} VkImageMemoryRequirementsInfo2;
或等效形式:
// Provided by VK_KHR_get_memory_requirements2
typedef VkImageMemoryRequirementsInfo2 VkImageMemoryRequirementsInfo2KHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
image是要查询的图像。
VkDeviceImageMemoryRequirements 结构定义如下:
// Provided by VK_VERSION_1_3
typedef struct VkDeviceImageMemoryRequirements {
VkStructureType sType;
const void* pNext;
const VkImageCreateInfo* pCreateInfo;
VkImageAspectFlagBits planeAspect;
} VkDeviceImageMemoryRequirements;
或等效形式:
// Provided by VK_KHR_maintenance4
typedef VkDeviceImageMemoryRequirements VkDeviceImageMemoryRequirementsKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
pCreateInfo是一个指向 VkImageCreateInfo 结构体的指针,该结构体包含影响要查询的图像创建的参数。 -
planeAspect是一个 VkImageAspectFlagBits 值,指定要查询的图像平面的 aspect。 除非pCreateInfo->tiling为VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,或者pCreateInfo->flags设置了VK_IMAGE_CREATE_DISJOINT_BIT,否则此参数将被忽略。
要确定分离图像平面的内存需求,请将 VkImagePlaneMemoryRequirementsInfo 结构体添加到 VkImageMemoryRequirementsInfo2 结构体的 pNext 链中。
VkImagePlaneMemoryRequirementsInfo 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkImagePlaneMemoryRequirementsInfo {
VkStructureType sType;
const void* pNext;
VkImageAspectFlagBits planeAspect;
} VkImagePlaneMemoryRequirementsInfo;
或等效形式:
// Provided by VK_KHR_sampler_ycbcr_conversion
typedef VkImagePlaneMemoryRequirementsInfo VkImagePlaneMemoryRequirementsInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
planeAspect是一个 VkImageAspectFlagBits 值,指定要查询的图像平面的 aspect。
VkMemoryRequirements2 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkMemoryRequirements2 {
VkStructureType sType;
void* pNext;
VkMemoryRequirements memoryRequirements;
} VkMemoryRequirements2;
或等效形式:
// Provided by VK_KHR_get_memory_requirements2, VK_NV_ray_tracing with VK_KHR_get_memory_requirements2 or VK_VERSION_1_1
typedef VkMemoryRequirements2 VkMemoryRequirements2KHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
memoryRequirements是一个 VkMemoryRequirements 结构体,描述了资源的内存需求。
VkMemoryDedicatedRequirements 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkMemoryDedicatedRequirements {
VkStructureType sType;
void* pNext;
VkBool32 prefersDedicatedAllocation;
VkBool32 requiresDedicatedAllocation;
} VkMemoryDedicatedRequirements;
或等效形式:
// Provided by VK_KHR_dedicated_allocation
typedef VkMemoryDedicatedRequirements VkMemoryDedicatedRequirementsKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
prefersDedicatedAllocation指定实现更倾向于为此资源使用专用分配。 应用程序仍然可以自由地子分配资源,但如果使用专用分配,则 **可能** 会获得更好的性能。 -
requiresDedicatedAllocation指定此资源需要专用分配。
要确定缓冲区或图像资源的专用分配需求,请将 VkMemoryDedicatedRequirements 结构体添加到作为 vkGetBufferMemoryRequirements2 或 vkGetImageMemoryRequirements2 的 pMemoryRequirements 参数传递的 VkMemoryRequirements2 结构体的 pNext 链中。
缓冲区资源的返回值的约束为:
-
如果用于创建被查询缓冲区的
vkCreateBuffer调用中,VkBufferCreateInfo 的pNext链包含了 VkExternalMemoryBufferCreateInfo 结构体,并且 VkExternalMemoryBufferCreateInfo::handleTypes中指定的任何句柄类型要求专用分配,如 vkGetPhysicalDeviceExternalBufferProperties 在VkExternalBufferProperties::externalMemoryProperties.externalMemoryFeatures中报告的那样,则requiresDedicatedAllocation可能为VK_TRUE。否则,requiresDedicatedAllocation将为VK_FALSE。 -
当实现将
requiresDedicatedAllocation设置为VK_TRUE时,它必须同时将prefersDedicatedAllocation设置为VK_TRUE。 -
如果创建
buffer时,在 VkBufferCreateInfo::flags中设置了VK_BUFFER_CREATE_SPARSE_BINDING_BIT,则prefersDedicatedAllocation和requiresDedicatedAllocation都将为VK_FALSE。
关于图像资源返回值的约束是
-
如果用于创建被查询图像的 vkCreateImage 调用中,VkImageCreateInfo 的
pNext链包含了 VkExternalMemoryImageCreateInfo 结构体,并且 VkExternalMemoryImageCreateInfo::handleTypes中指定的任何句柄类型要求专用分配,如 vkGetPhysicalDeviceImageFormatProperties2 在VkExternalImageFormatProperties::externalMemoryProperties.externalMemoryFeatures中报告的那样,则requiresDedicatedAllocation可能为VK_TRUE。 -
如果图像的平铺方式为
VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则requiresDedicatedAllocation可能为VK_TRUE。 -
否则,
requiresDedicatedAllocation将为VK_FALSE。 -
如果创建
image时,在 VkImageCreateInfo::flags中设置了VK_IMAGE_CREATE_SPARSE_BINDING_BIT,则prefersDedicatedAllocation和requiresDedicatedAllocation都将为VK_FALSE。
要将内存附加到缓冲区对象,请调用
// Provided by VK_VERSION_1_0
VkResult vkBindBufferMemory(
VkDevice device,
VkBuffer buffer,
VkDeviceMemory memory,
VkDeviceSize memoryOffset);
-
device是拥有缓冲区和内存的逻辑设备。 -
buffer是要附加到内存的缓冲区。 -
memory是一个 VkDeviceMemory 对象,描述要附加的设备内存。 -
memoryOffset是要绑定到缓冲区的memory区域的起始偏移量。从memoryOffset字节开始,memory中VkMemoryRequirements::size成员返回的字节数将被绑定到指定的缓冲区。
vkBindBufferMemory 等效于通过 VkBindBufferMemoryInfo 将相同的参数传递给 vkBindBufferMemory2。
要一次为一个或多个缓冲区对象附加内存,请调用
// Provided by VK_VERSION_1_1
VkResult vkBindBufferMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos);
或等效命令
// Provided by VK_KHR_bind_memory2
VkResult vkBindBufferMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos);
-
device是拥有缓冲区和内存的逻辑设备。 -
bindInfoCount是pBindInfos中的元素数量。 -
pBindInfos是指向一个包含bindInfoCount个 VkBindBufferMemoryInfo 结构的数组的指针,这些结构描述了要绑定的缓冲区和内存。
在某些实现中,将内存绑定批处理到单个命令中可能更有效率。
如果启用了 maintenance6 特性,则此命令必须尝试执行 pBindInfos 所描述的所有内存绑定操作,并且必须不因第一个失败而提前退出。
如果 pBindInfos 描述的任何内存绑定操作失败,则此命令返回的 VkResult 必须是任何未返回 VK_SUCCESS 的内存绑定操作的返回值。
|
如果 应用程序应销毁这些缓冲区。 |
VkBindBufferMemoryInfo 包含与 vkBindBufferMemory 的参数对应的成员。
VkBindBufferMemoryInfo 结构定义如下
// Provided by VK_VERSION_1_1
typedef struct VkBindBufferMemoryInfo {
VkStructureType sType;
const void* pNext;
VkBuffer buffer;
VkDeviceMemory memory;
VkDeviceSize memoryOffset;
} VkBindBufferMemoryInfo;
或等效形式:
// Provided by VK_KHR_bind_memory2
typedef VkBindBufferMemoryInfo VkBindBufferMemoryInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
buffer是要附加到内存的缓冲区。 -
memory是一个 VkDeviceMemory 对象,描述要附加的设备内存。 -
memoryOffset是要绑定到缓冲区的memory区域的起始偏移量。从memoryOffset字节开始,memory中VkMemoryRequirements::size成员返回的字节数将被绑定到指定的缓冲区。
VkBindBufferMemoryDeviceGroupInfo 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkBindBufferMemoryDeviceGroupInfo {
VkStructureType sType;
const void* pNext;
uint32_t deviceIndexCount;
const uint32_t* pDeviceIndices;
} VkBindBufferMemoryDeviceGroupInfo;
或等效形式:
// Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
typedef VkBindBufferMemoryDeviceGroupInfo VkBindBufferMemoryDeviceGroupInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
deviceIndexCount是pDeviceIndices中的元素数量。 -
pDeviceIndices是一个指向设备索引数组的指针。
如果 VkBindBufferMemoryInfo 的 pNext 链包含 VkBindBufferMemoryDeviceGroupInfo 结构体,则该结构体决定了如何在设备组中的多个设备上将内存绑定到缓冲区。
如果 deviceIndexCount 大于零,则在设备索引 i 上,缓冲区将附加到物理设备上具有设备索引 pDeviceIndices[i] 的 memory 实例。
如果 deviceIndexCount 为零,并且 memory 来自设置了 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则相当于 pDeviceIndices 包含从零到逻辑设备中物理设备数量减一的连续索引。换句话说,默认情况下,每个物理设备都附加到其自己的 memory 实例。
如果 deviceIndexCount 为零,并且 memory 来自未设置 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则相当于 pDeviceIndices 包含一个零数组。换句话说,默认情况下,每个物理设备都附加到实例零。
VkBindMemoryStatus 结构体定义如下:
// Provided by VK_VERSION_1_4
typedef struct VkBindMemoryStatus {
VkStructureType sType;
const void* pNext;
VkResult* pResult;
} VkBindMemoryStatus;
或等效形式:
// Provided by VK_KHR_maintenance6
typedef VkBindMemoryStatus VkBindMemoryStatusKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
pResult是指向VkResult值的指针。
如果 VkBindBufferMemoryInfo 或 VkBindImageMemoryInfo 的 pNext 链包含 VkBindMemoryStatus 结构体,则 VkBindMemoryStatus::pResult 将填充一个描述相应内存绑定操作结果的值。
要将内存附加到未设置 VK_IMAGE_CREATE_DISJOINT_BIT 的 VkImage 对象,请调用:
// Provided by VK_VERSION_1_0
VkResult vkBindImageMemory(
VkDevice device,
VkImage image,
VkDeviceMemory memory,
VkDeviceSize memoryOffset);
-
device是拥有图像和内存的逻辑设备。 -
image是图像。 -
memory是描述要附加的设备内存的 VkDeviceMemory 对象。 -
memoryOffset是要绑定到图像的memory区域的起始偏移量。memory中VkMemoryRequirements::size成员返回的字节数,从memoryOffset字节开始,将绑定到指定的图像。
vkBindImageMemory 相当于通过 VkBindImageMemoryInfo 将相同的参数传递给 vkBindImageMemory2。
要一次为一个或多个图像对象附加内存,请调用
// Provided by VK_VERSION_1_1
VkResult vkBindImageMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos);
或等效命令
// Provided by VK_KHR_bind_memory2
VkResult vkBindImageMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos);
-
device是拥有图像和内存的逻辑设备。 -
bindInfoCount是pBindInfos中的元素数量。 -
pBindInfos是指向 VkBindImageMemoryInfo 结构体数组的指针,描述要绑定的图像和内存。
在某些实现中,将内存绑定批处理到单个命令中可能更有效率。
如果启用了 maintenance6 特性,则此命令必须尝试执行 pBindInfos 所描述的所有内存绑定操作,并且必须不因第一个失败而提前退出。
如果 pBindInfos 描述的任何内存绑定操作失败,则此命令返回的 VkResult 必须是任何未返回 VK_SUCCESS 的内存绑定操作的返回值。
|
如果 应用程序应销毁这些图像。 |
VkBindImageMemoryInfo 包含与 vkBindImageMemory 参数对应的成员。
VkBindImageMemoryInfo 结构体的定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkBindImageMemoryInfo {
VkStructureType sType;
const void* pNext;
VkImage image;
VkDeviceMemory memory;
VkDeviceSize memoryOffset;
} VkBindImageMemoryInfo;
或等效形式:
// Provided by VK_KHR_bind_memory2
typedef VkBindImageMemoryInfo VkBindImageMemoryInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
image是要附加到内存的图像。 -
memory是一个 VkDeviceMemory 对象,描述要附加的设备内存。 -
memoryOffset是要绑定到图像的memory区域的起始偏移量。memory中VkMemoryRequirements::size成员返回的字节数,从memoryOffset字节开始,将绑定到指定的图像。
VkBindImageMemoryDeviceGroupInfo 结构体定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkBindImageMemoryDeviceGroupInfo {
VkStructureType sType;
const void* pNext;
uint32_t deviceIndexCount;
const uint32_t* pDeviceIndices;
uint32_t splitInstanceBindRegionCount;
const VkRect2D* pSplitInstanceBindRegions;
} VkBindImageMemoryDeviceGroupInfo;
或等效形式:
// Provided by VK_KHR_bind_memory2 with VK_KHR_device_group
typedef VkBindImageMemoryDeviceGroupInfo VkBindImageMemoryDeviceGroupInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
deviceIndexCount是pDeviceIndices中的元素数量。 -
pDeviceIndices是一个指向设备索引数组的指针。 -
splitInstanceBindRegionCount是pSplitInstanceBindRegions中的元素数量。 -
pSplitInstanceBindRegions是指向 VkRect2D 结构体数组的指针,该数组描述了图像的哪些区域连接到每个内存实例。
如果 VkBindImageMemoryInfo 的 pNext 链包含 VkBindImageMemoryDeviceGroupInfo 结构体,则该结构体决定了如何在设备组中跨多个设备将内存绑定到图像。
如果 deviceIndexCount 大于零,则在设备索引 i 上,image 连接到物理设备上具有设备索引 pDeviceIndices[i] 的内存实例。
令 N 为逻辑设备中物理设备的数量。如果 splitInstanceBindRegionCount 大于零,则 pSplitInstanceBindRegions 是指向 N2 个矩形数组的指针,其中资源实例 i 中元素 i*N+j 处的矩形指定的图像区域绑定到内存实例 j。绑定到每个稀疏图像块区域的内存块使用内存中的偏移量,相对于 memoryOffset 进行计算,就好像整个图像都被绑定到连续的内存范围一样。换句话说,水平相邻的图像块使用连续的内存块,垂直相邻的图像块由每个块的字节数乘以 image 的块宽度分隔,且 (0,0) 处的块对应于从 memoryOffset 开始的内存。
如果 splitInstanceBindRegionCount 和 deviceIndexCount 为零,且内存来自设置了 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则等效于 pDeviceIndices 包含从零到逻辑设备中物理设备数量减一的连续索引。换句话说,默认情况下,每个物理设备连接到其自己的内存实例。
如果 splitInstanceBindRegionCount 和 deviceIndexCount 为零,且内存来自没有设置 VK_MEMORY_HEAP_MULTI_INSTANCE_BIT 位的内存堆,则等效于 pDeviceIndices 包含一个零数组。换句话说,默认情况下,每个物理设备连接到实例零。
如果 VkBindImageMemoryInfo 的 pNext 链包含 VkBindImageMemorySwapchainInfoKHR 结构,则该结构包含一个交换链句柄和图像索引,指示该图像将绑定到该交换链的内存。
VkBindImageMemorySwapchainInfoKHR 结构定义如下:
// Provided by VK_VERSION_1_1 with VK_KHR_swapchain, VK_KHR_device_group with VK_KHR_swapchain
typedef struct VkBindImageMemorySwapchainInfoKHR {
VkStructureType sType;
const void* pNext;
VkSwapchainKHR swapchain;
uint32_t imageIndex;
} VkBindImageMemorySwapchainInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
swapchain是 VK_NULL_HANDLE 或交换链句柄。 -
imageIndex是swapchain中的一个图像索引。
如果 swapchain 不为 NULL,则使用 swapchain 和 imageIndex 来确定图像绑定的内存,而不是 memory 和 memoryOffset。
内存可以绑定到交换链,并使用 VkBindImageMemoryDeviceGroupInfo 的 pDeviceIndices 或 pSplitInstanceBindRegions 成员。
为了绑定不相交图像的平面,请将 VkBindImagePlaneMemoryInfo 结构添加到 VkBindImageMemoryInfo 的 pNext 链。
VkBindImagePlaneMemoryInfo 结构定义如下:
// Provided by VK_VERSION_1_1
typedef struct VkBindImagePlaneMemoryInfo {
VkStructureType sType;
const void* pNext;
VkImageAspectFlagBits planeAspect;
} VkBindImagePlaneMemoryInfo;
或等效形式:
// Provided by VK_KHR_sampler_ycbcr_conversion
typedef VkBindImagePlaneMemoryInfo VkBindImagePlaneMemoryInfoKHR;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
planeAspect是一个VkImageAspectFlagBits值,用于指定要绑定的不相交图像平面的方面。
与实现相关的限制 bufferImageGranularity 指定了一个类似页面的粒度,线性资源和非线性资源必须以该粒度放置在相邻的内存位置,以避免别名。不满足此粒度要求的两个资源被称为别名。bufferImageGranularity 以字节为单位指定,并且必须是 2 的幂。不施加粒度限制的实现可以报告 bufferImageGranularity 值为 1。
|
尽管名称如此, |
给定同一 VkDeviceMemory 对象中较低内存偏移量的 resourceA 和较高内存偏移量的 resourceB,其中一个资源是线性的,另一个资源是非线性的(如 术语表 中定义的那样),并且有以下情况
resourceA.end = resourceA.memoryOffset + resourceA.size - 1
resourceA.endPage = resourceA.end & ~(bufferImageGranularity-1)
resourceB.start = resourceB.memoryOffset
resourceB.startPage = resourceB.start & ~(bufferImageGranularity-1)
以下属性必须成立:
resourceA.endPage < resourceB.startPage
也就是说,第一个资源 (A) 的末尾和第二个资源 (B) 的开头必须位于大小为 bufferImageGranularity 的单独的“页面”上。bufferImageGranularity 可以与内存堆的物理页面大小不同。只有当线性资源和非线性资源在内存中相邻并且将同时使用时,才需要此限制。相邻资源的内存范围可以小于 bufferImageGranularity,前提是它们满足相关对象的 alignment 要求。
字节形式的稀疏块大小以及稀疏图像和缓冲区内存对齐必须都是 bufferImageGranularity 的倍数。因此,绑定到稀疏资源的内存自然满足 bufferImageGranularity。
资源共享模式
缓冲区和图像对象是使用共享模式创建的,该模式控制它们如何从队列访问。支持的共享模式有:
// Provided by VK_VERSION_1_0
typedef enum VkSharingMode {
VK_SHARING_MODE_EXCLUSIVE = 0,
VK_SHARING_MODE_CONCURRENT = 1,
} VkSharingMode;
-
VK_SHARING_MODE_EXCLUSIVE指定对对象的任何范围或图像子资源的访问一次仅对单个队列族是排他的。 -
VK_SHARING_MODE_CONCURRENT指定支持从多个队列族并发访问对象的任何范围或图像子资源。
|
与 |
使用 VK_SHARING_MODE_EXCLUSIVE 创建的图像对象的缓冲区范围和图像子资源必须只能由拥有该资源的队列族的队列访问。在创建时,此类资源不属于任何队列族;在队列中首次使用时会隐式获取所有权。一旦使用 VK_SHARING_MODE_EXCLUSIVE 的资源被某个队列族拥有,应用程序必须执行队列族所有权转移,以使不同队列族可以访问范围或图像子资源的内存内容。
|
图像在首次在队列上使用之前,仍然需要从 |
一个队列族可以像对待刚刚创建的资源一样,在没有所有权转移的情况下,获取使用 VK_SHARING_MODE_EXCLUSIVE 创建的资源的图像子资源或缓冲区范围的所有权;但是,以这种方式获取所有权的效果是图像子资源或缓冲区范围的内容是未定义的。
使用 VK_SHARING_MODE_CONCURRENT 创建的图像对象的缓冲区范围和图像子资源必须只能由通过相应创建信息结构的 queueFamilyIndexCount 和 pQueueFamilyIndices 成员指定的队列族的队列访问。
外部资源共享
资源应该只在其底层内存的独占所有权的 Vulkan 实例中访问。在给定时间,只有一个 Vulkan 实例拥有资源的底层内存的独占所有权,无论资源是使用 VK_SHARING_MODE_EXCLUSIVE 还是 VK_SHARING_MODE_CONCURRENT 创建的。只有在内存已从另一个实例或使用外部内存句柄的外部 API 导入或导出后,应用程序才能转移资源的底层内存的所有权。在实例之外转移所有权的语义与在队列之间转移 VK_SHARING_MODE_EXCLUSIVE 资源的所有权所使用的语义类似,并且也使用 VkBufferMemoryBarrier 或 VkImageMemoryBarrier 操作来完成。为了使底层内存的内容在目标实例或 API 中可访问,应用程序必须
-
从源实例或 API 释放独占所有权。
-
使用信号量或栅栏确保释放操作已完成。
-
在目标实例或 API 中获取独占所有权
与队列族所有权转移不同,释放所有权时不会显式指定目标实例或 API,获取所有权时也不会指定源实例或 API。相反,图像或内存屏障的 dstQueueFamilyIndex 或 srcQueueFamilyIndex 参数被设置为保留的队列族索引 VK_QUEUE_FAMILY_EXTERNAL 或 VK_QUEUE_FAMILY_FOREIGN_EXT,以分别表示外部目标或源。
将资源绑定到多个 Vulkan 实例或其他 API 之间共享的内存对象不会更改底层内存的所有权。第一个访问该资源的实体会隐式获取所有权。一个实体可以以相同的方式从另一个实体隐式获取所有权,而无需显式的所有权转移。但是,以这种方式获取所有权的效果是底层内存的内容是未定义的。
访问由特定实例或 API 拥有的内存支持的资源,其语义与访问 VK_SHARING_MODE_EXCLUSIVE 资源相同,但有一个例外:实现必须确保对同一底层内存对象别名的同一图像的一组相同子资源的一个成员执行的布局转换会影响该组中所有子资源的布局。
作为推论,对此类集合中的任何图像子资源的写入必须不会使该集合中其他子资源使用的内存内容变为未定义的。应用程序可以通过对另一个图像的相同子资源执行设备写入来定义一个图像子资源的内容,前提是两个图像都绑定到外部内存的相同区域。应用程序可以在现有集合成员的内容被定义后,将资源添加到这样的集合中,而不会使内容未定义,方法是创建一个初始布局为 VK_IMAGE_LAYOUT_UNDEFINED 的新图像,并将其绑定到与现有图像相同的外部内存区域。
|
由于布局转换适用于所有别名相同外部内存区域的相同图像,因此新图像以及具有已定义内容的现有图像的后备内存的实际布局不会是未定义的。在从现有所有者获取其内存所有权之前,此类图像不可用。因此,作为此转换的一部分指定的布局将是图像的真正初始布局。创建它时指定的未定义的布局是一个占位符,用于简化有效的使用要求。 |
内存别名
如果通过 vkBindImageMemory、 vkBindBufferMemory、 vkBindAccelerationStructureMemoryNV、通过 稀疏内存绑定,或通过使用外部内存句柄导出和导入机制将内存绑定到多个 Vulkan 实例或外部 API 中的资源,则 VkDeviceMemory 分配的范围是别名的,如下所述。
考虑两个资源,resourceA 和 resourceB,分别绑定到 memory rangeA 和 rangeB。令 paddedRangeA 和 paddedRangeB 分别为 rangeA 和 rangeB 对齐到 bufferImageGranularity。如果资源都是线性的或都是非线性的(如词汇表中所定义),则资源别名 rangeA 和 rangeB 交集中的内存。如果一个资源是线性的,另一个资源是非线性的,则资源别名 paddedRangeA 和 paddedRangeB 交集中的内存。
应用程序可以别名内存,但是使用多个别名会受到一些约束。
|
如果一些大型资源在不相交的时间段内使用,则内存别名可以用于减少应用程序的总设备内存占用。 |
当一个 非线性、非 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 图像绑定到别名范围时,该图像的所有图像子资源都重叠该范围。当一个线性图像绑定到别名范围时,(根据图像的广告布局)包含来自别名范围的字节的图像子资源将重叠该范围。当 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT 图像的稀疏图像块绑定到别名范围时,只有包含这些稀疏图像块的图像子资源才会重叠该范围,并且当绑定到图像 mip 尾部的内存与别名范围重叠时,mip 尾部中的所有图像子资源都会重叠该范围。
缓冲区以及布局为 VK_IMAGE_LAYOUT_PREINITIALIZED 或 VK_IMAGE_LAYOUT_GENERAL 的线性图像子资源是主机可访问的子资源。也就是说,主机有一个明确的寻址方案来解释内容,因此,如果每个别名都是主机可访问的子资源,则内存中的数据布局可以在别名之间得到一致的解释。非线性图像以及其他布局中的线性图像子资源不是主机可访问的。
如果两个别名都是主机可访问的,那么它们以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。
如果两个别名都是使用相同的创建参数创建的图像,并且都设置了 VK_IMAGE_CREATE_ALIAS_BIT 标志,并且除了 VkBindImageMemoryDeviceGroupInfo::pDeviceIndices 和 VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions 之外,它们都以相同的方式绑定到内存,那么它们以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。
此外,如果多平面图像的单个平面和单平面图像别名相同的内存,那么在相同条件下,它们也会以一致的方式解释内存的内容,但有以下修改:
-
两者都必须使用
VK_IMAGE_CREATE_DISJOINT_BIT标志创建。 -
单平面图像和多平面图像的单个平面必须以相同的方式绑定到内存,除了 VkBindImageMemoryDeviceGroupInfo::
pDeviceIndices和 VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions。 -
单平面图像的
width和height是从多平面图像的尺寸以 平面兼容性 中列出的方式为别名平面派生的。 -
如果任一图像的
tiling为VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,则两个图像都必须是线性的。 -
所有其他创建参数必须相同。
通过将相同的内存绑定到多个 Vulkan 实例或使用外部内存句柄导出和导入机制的外部 API 中的资源而创建的别名,以一致的方式解释内存的内容,并且写入一个别名的数据可以被另一个别名读取。
否则,别名会以不同的方式解释内存的内容,并且通过一个别名写入会使内存的内容对另一个别名部分或完全未定义。如果第一个别名是主机可访问的子资源,那么受影响的字节是根据其寻址方案由内存操作写入的字节。如果第一个别名不是主机可访问的,那么受影响的字节是被写入的图像子资源重叠的字节。如果第二个别名是主机可访问的子资源,那么受影响的字节将变为未定义。如果第二个别名不是主机可访问的,则所有重叠受影响字节的稀疏图像块(对于稀疏部分驻留的图像)或所有图像子资源(对于非稀疏图像和完全驻留的稀疏图像)都将变为未定义。
如果任何图像子资源由于写入别名而变得未定义,那么每个图像子资源必须将其布局从 VK_IMAGE_LAYOUT_UNDEFINED 过渡到有效的布局,然后才能使用它,或者,如果内存已由主机写入,则从 VK_IMAGE_LAYOUT_PREINITIALIZED 过渡。如果稀疏图像的任何稀疏块已变得未定义,则只有包含它们的图像子资源必须进行过渡。
如果至少有一个使用执行写入,则两个别名使用重叠范围必须通过使用适当的 访问类型 的内存依赖关系来分隔,无论别名是否一致地解释内存。如果使用缓冲区或图像内存屏障,则屏障的范围必须包含重叠的整个范围和/或图像子资源集。
如果两个别名图像视图在同一个帧缓冲区中使用,那么渲染通道必须使用 VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT 声明附件,并遵循该部分中列出的其他规则。
|
通过应用程序子分配器回收的内存(即,不释放和重新分配内存对象)与内存别名本质上没有区别。但是,子分配器通常会在回收内存区域之前等待栅栏,并且发出栅栏信号涉及足够的隐式依赖关系以满足上述所有要求。 |
资源内存重叠
只要访问的内存位置保证不重叠(如内存位置中所定义),并且操作、资源和访问在其他方面都是独立的有效,应用程序可以通过单独的设备和主机操作安全地并发访问资源。
某些操作有对齐要求或访问不明确的内存位置,因此在确定重叠时应该考虑特定操作的语义。此类要求将在操作旁边描述。当使用非一致性内存时,主机和设备之间的操作会与 nonCoherentAtomSize 对齐,如 vkFlushMappedMemoryRanges 和 vkInvalidateMappedMemoryRanges 所定义。
|
目的是可以并发访问缓冲区(或线性图像),即使它们共享缓存行,但否则不会访问相同的内存范围。设备缓存行大小的概念未在内存模型中公开。 |
缓冲区集合
Fuchsia 基于 FIDL 的 Sysmem 服务通过 VK_FUCHSIA_buffer_collection 扩展与 Vulkan 互操作。
缓冲区集合是一组或多组一起分配并且都具有相同属性的缓冲区。这些属性描述了缓冲区的内部表示形式,例如其维度和内存布局。这确保了所有缓冲区都可以被需要在多个缓冲区之间交换的任务(例如双缓冲图形渲染)互换使用。
在 Fuchsia 上,Sysmem 服务使用缓冲区集合作为其设计中的核心构造。
缓冲区集合由 VkBufferCollectionFUCHSIA 句柄表示
// Provided by VK_FUCHSIA_buffer_collection
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferCollectionFUCHSIA)
定义
-
FIDL - Fuchsia 接口定义语言。一种声明式语言,用于在 Fuchsia 上定义 FIDL 进程间通信接口。FIDL 文件使用
fidl扩展名。FIDL 也用于指代 FIDL 语言中声明的接口定义的服务 -
Sysmem - Fuchsia 上促进最佳缓冲区共享和重用的 FIDL 服务
-
客户端 - 缓冲区集合的任何参与者,例如 Vulkan 应用程序
-
令牌 -
zx_handle_tZircon 通道对象,允许参与缓冲区集合
缓冲区集合的平台初始化
要在 Fuchsia 上初始化缓冲区集合
-
连接到 Sysmem 服务以初始化 Sysmem 分配器
-
使用 Sysmem 分配器创建初始缓冲区集合令牌
-
为发起者之外的每个参与者复制令牌
-
有关更多详细信息,请参阅 fuchsia.dev 上的 Sysmem 概述和 fuchsia.sysmem FIDL 文档
创建缓冲区集合
要创建一个 VkBufferCollectionFUCHSIA 以供 Vulkan 参与缓冲区集合
// Provided by VK_FUCHSIA_buffer_collection
VkResult vkCreateBufferCollectionFUCHSIA(
VkDevice device,
const VkBufferCollectionCreateInfoFUCHSIA* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkBufferCollectionFUCHSIA* pCollection);
-
device是创建VkBufferCollectionFUCHSIA的逻辑设备 -
pCreateInfo是指向 VkBufferCollectionCreateInfoFUCHSIA 结构的指针,该结构包含影响缓冲区集合创建的参数 -
pAllocator是指向 VkAllocationCallbacks 结构的指针,用于控制主机内存分配,如 内存分配 章节所述 -
pBufferCollection是指向 VkBufferCollectionFUCHSIA 句柄的指针,将在其中返回生成的缓冲区集合对象
VkBufferCollectionCreateInfoFUCHSIA 结构定义如下
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionCreateInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
zx_handle_t collectionToken;
} VkBufferCollectionCreateInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
collectionToken是一个zx_handle_t,其中包含 Sysmem 客户端的缓冲区集合令牌
设置约束
设置基于图像的缓冲区集合约束
设置缓冲区集合的约束会启动缓冲区集合的格式协商和分配。要设置 VkImage 缓冲区集合的约束,请调用
// Provided by VK_FUCHSIA_buffer_collection
VkResult vkSetBufferCollectionImageConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkImageConstraintsInfoFUCHSIA* pImageConstraintsInfo);
-
device是逻辑设备 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
pImageConstraintsInfo是指向 VkImageConstraintsInfoFUCHSIA 结构的指针
如果 pImageConstraintsInfo->formatConstraintsCount 大于实现定义的限制,则 vkSetBufferCollectionImageConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionImageConstraintsFUCHSIA 将返回 VK_ERROR_INITIALIZATION_FAILED。
如果实现不支持 pImageConstraintsInfo 结构描述的任何格式,则 vkSetBufferCollectionImageConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionImageConstraintsFUCHSIA 将返回 VK_ERROR_FORMAT_NOT_SUPPORTED。
VkImageConstraintsInfoFUCHSIA 结构定义如下
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImageConstraintsInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
uint32_t formatConstraintsCount;
const VkImageFormatConstraintsInfoFUCHSIA* pFormatConstraints;
VkBufferCollectionConstraintsInfoFUCHSIA bufferCollectionConstraints;
VkImageConstraintsInfoFlagsFUCHSIA flags;
} VkImageConstraintsInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
formatConstraintsCount是pFormatConstraints中的元素数。 -
pFormatConstraints是指向大小为formatConstraintsCount的 VkImageFormatConstraintsInfoFUCHSIA 结构数组的指针,该数组用于进一步约束基于图像的缓冲区集合的格式选择。 -
bufferCollectionConstraints是一个 VkBufferCollectionConstraintsInfoFUCHSIA 结构,用于为基于缓冲区的缓冲区集合的协商和分配提供参数。 -
flags是一个 VkImageConstraintsInfoFlagBitsFUCHSIA 值,指定有关 Sysmem 应为缓冲区集合分配的内存类型的提示。
// Provided by VK_FUCHSIA_buffer_collection
typedef VkFlags VkImageConstraintsInfoFlagsFUCHSIA;
VkImageConstraintsInfoFlagsFUCHSIA 是一个位掩码类型,用于设置零个或多个 VkImageConstraintsInfoFlagBitsFUCHSIA 位的掩码。
在 VkImageConstraintsInfoFlagBitsFUCHSIA::flags 中可以设置的位包括:
// Provided by VK_FUCHSIA_buffer_collection
typedef enum VkImageConstraintsInfoFlagBitsFUCHSIA {
VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA = 0x00000001,
VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA = 0x00000002,
VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA = 0x00000004,
VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA = 0x00000008,
VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA = 0x00000010,
} VkImageConstraintsInfoFlagBitsFUCHSIA;
关于 Sysmem 应根据缓冲区集合中图像的预期用途分配的内存类型的一般提示包括:
-
VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_RARELY_FUCHSIA -
VK_IMAGE_CONSTRAINTS_INFO_CPU_READ_OFTEN_FUCHSIA -
VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_RARELY_FUCHSIA -
VK_IMAGE_CONSTRAINTS_INFO_CPU_WRITE_OFTEN_FUCHSIA
对于受保护的内存:
-
VK_IMAGE_CONSTRAINTS_INFO_PROTECTED_OPTIONAL_FUCHSIA指定缓冲区集合的受保护内存是可选的。
请注意,如果缓冲区集合中的所有参与者(Vulkan 或其他)都指定受保护的内存是可选的,则 Sysmem 将不会分配受保护的内存。
VkImageFormatConstraintsInfoFUCHSIA 结构体的定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImageFormatConstraintsInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
VkImageCreateInfo imageCreateInfo;
VkFormatFeatureFlags requiredFormatFeatures;
VkImageFormatConstraintsFlagsFUCHSIA flags;
uint64_t sysmemPixelFormat;
uint32_t colorSpaceCount;
const VkSysmemColorSpaceFUCHSIA* pColorSpaces;
} VkImageFormatConstraintsInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
imageCreateInfo是用于创建 VkImage 的 VkImageCreateInfo,该 VkImage 将使用来自 VkBufferCollectionFUCHSIA 的内存。 -
requiredFormatFeatures是一个VkFormatFeatureFlagBits的位掩码,指定缓冲区集合中所需的缓冲区功能。 -
flags保留供将来使用。 -
sysmemPixelFormat是来自fuchsia.sysmem/image_formats.fidlFIDL 接口的PixelFormatType值。 -
colorSpaceCount是pColorSpaces的元素计数。 -
pColorSpaces是指向大小为colorSpaceCount的 VkSysmemColorSpaceFUCHSIA 结构体数组的指针。
// Provided by VK_FUCHSIA_buffer_collection
typedef VkFlags VkImageFormatConstraintsFlagsFUCHSIA;
VkImageFormatConstraintsFlagsFUCHSIA 是一个用于设置掩码的位掩码类型,但目前保留供将来使用。
VkBufferCollectionConstraintsInfoFUCHSIA 结构体的定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionConstraintsInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
uint32_t minBufferCount;
uint32_t maxBufferCount;
uint32_t minBufferCountForCamping;
uint32_t minBufferCountForDedicatedSlack;
uint32_t minBufferCountForSharedSlack;
} VkBufferCollectionConstraintsInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
minBufferCount是集合中可用的最小缓冲区数。 -
maxBufferCount是集合中允许的最大缓冲区数。 -
minBufferCountForCamping是每个参与者的最小缓冲露营数。 -
minBufferCountForDedicatedSlack是每个参与者的专用松弛的最小缓冲区数。 -
minBufferCountForSharedSlack是每个参与者的共享松弛的最小缓冲区数。
Sysmem 结合使用所有缓冲区计数参数来确定它将分配的缓冲区数量。 Sysmem 在 fuchsia.sysmem/constraints.fidl 中定义缓冲区计数约束。
minBufferCountForCamping 中提到的露营是指参与者不用于临时使用的可用缓冲区数量。此数量的缓冲区是参与者逻辑操作所必需的。
minBufferCountForDedicatedSlack 和 minBufferCountForSharedSlack 中提到的Slack,指的是参与者为了获得最佳性能而期望的缓冲区数量。minBufferCountForDedicatedSlack 指的是当前参与者。minBufferCountForSharedSlack 指的是集合中所有参与者的缓冲区空闲量。
VkSysmemColorSpaceFUCHSIA 结构定义如下
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkSysmemColorSpaceFUCHSIA {
VkStructureType sType;
const void* pNext;
uint32_t colorSpace;
} VkSysmemColorSpaceFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
Sysmem
ColorSpaceType的colorSpace值
设置基于缓冲区的缓冲区集合约束
要设置 VkBuffer 缓冲区集合的约束,请调用
// Provided by VK_FUCHSIA_buffer_collection
VkResult vkSetBufferCollectionBufferConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo);
-
device是逻辑设备 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
pBufferConstraintsInfo是指向 VkBufferConstraintsInfoFUCHSIA 结构的指针
如果实现不支持 bufferCollectionConstraints 结构中指定的约束,则 vkSetBufferCollectionBufferConstraintsFUCHSIA 可能会失败。如果发生这种情况,vkSetBufferCollectionBufferConstraintsFUCHSIA 将返回 VK_ERROR_FORMAT_NOT_SUPPORTED。
VkBufferConstraintsInfoFUCHSIA 结构定义如下
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferConstraintsInfoFUCHSIA {
VkStructureType sType;
const void* pNext;
VkBufferCreateInfo createInfo;
VkFormatFeatureFlags requiredFormatFeatures;
VkBufferCollectionConstraintsInfoFUCHSIA bufferCollectionConstraints;
} VkBufferConstraintsInfoFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
pBufferCreateInfo是指向 VkBufferCreateInfo 结构的指针,该结构描述了缓冲区集合的缓冲区属性 -
requiredFormatFeatures是VkFormatFeatureFlagBits的位掩码,表示缓冲区集合中缓冲区的所需特性 -
bufferCollectionConstraints用于提供缓冲区集合的协商和分配参数
检索缓冲区集合属性
通过调用 vkSetBufferCollectionImageConstraintsFUCHSIA 或 vkSetBufferCollectionBufferConstraintsFUCHSIA 在缓冲区集合上设置约束后,调用 vkGetBufferCollectionPropertiesFUCHSIA 来检索缓冲区集合的协商和最终属性。
对 vkGetBufferCollectionPropertiesFUCHSIA 的调用是同步的。它会等待 Sysmem 格式协商和缓冲区集合分配完成,然后再返回。
// Provided by VK_FUCHSIA_buffer_collection
VkResult vkGetBufferCollectionPropertiesFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
VkBufferCollectionPropertiesFUCHSIA* pProperties);
-
device是逻辑设备句柄 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
pProperties是指向检索到的 VkBufferCollectionPropertiesFUCHSIA 结构的指针
对于基于图像的缓冲区集合,在调用 vkGetBufferCollectionPropertiesFUCHSIA 时,Sysmem 将选择 VkImageConstraintsInfoFUCHSIA::pImageCreateInfos 的一个元素,该元素由先前对 vkSetBufferCollectionImageConstraintsFUCHSIA 的调用建立。所选元素的索引存储在 VkBufferCollectionPropertiesFUCHSIA::createInfoIndex 中,并可从中检索。
对于基于缓冲区的缓冲区集合,将单个 VkBufferCreateInfo 指定为 VkBufferConstraintsInfoFUCHSIA::createInfo。VkBufferCollectionPropertiesFUCHSIA::createInfoIndex 因此始终为零。
如果 Sysmem 无法解析缓冲区集合中所有参与者的约束,则 vkGetBufferCollectionPropertiesFUCHSIA 可能会失败。如果发生这种情况,vkGetBufferCollectionPropertiesFUCHSIA 将返回 VK_ERROR_INITIALIZATION_FAILED。
VkBufferCollectionPropertiesFUCHSIA 结构的定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkBufferCollectionPropertiesFUCHSIA {
VkStructureType sType;
void* pNext;
uint32_t memoryTypeBits;
uint32_t bufferCount;
uint32_t createInfoIndex;
uint64_t sysmemPixelFormat;
VkFormatFeatureFlags formatFeatures;
VkSysmemColorSpaceFUCHSIA sysmemColorSpaceIndex;
VkComponentMapping samplerYcbcrConversionComponents;
VkSamplerYcbcrModelConversion suggestedYcbcrModel;
VkSamplerYcbcrRange suggestedYcbcrRange;
VkChromaLocation suggestedXChromaOffset;
VkChromaLocation suggestedYChromaOffset;
} VkBufferCollectionPropertiesFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
memoryTypeBits是一个位掩码,其中为每个可以作为缓冲集合导入的内存类型设置一位。 -
bufferCount是集合中缓冲区的数量。 -
createInfoIndex如 Sysmem 选择的创建信息 中所述。 -
sysmemPixelFormat是 Sysmem 的PixelFormatType,定义在fuchsia.sysmem/image_formats.fidl中。 -
formatFeatures是缓冲集合共享的 VkFormatFeatureFlagBits 的位掩码。 -
sysmemColorSpaceIndex是一个 VkSysmemColorSpaceFUCHSIA 结构,指定颜色空间。 -
samplerYcbcrConversionComponents是一个 VkComponentMapping 结构,指定组件映射。 -
suggestedYcbcrModel是一个 VkSamplerYcbcrModelConversion 值,指定建议的 Y′CBCR 模型。 -
suggestedYcbcrRange是一个 VkSamplerYcbcrRange 值,指定建议的 Y′CBCR 范围。 -
suggestedXChromaOffset是一个 VkChromaLocation 值,指定建议的 X 色度偏移。 -
suggestedYChromaOffset是一个 VkChromaLocation 值,指定建议的 Y 色度偏移。
sysmemColorSpace 仅针对基于图像的缓冲集合设置,其中约束条件是在调用 vkSetBufferCollectionImageConstraintsFUCHSIA 时使用 VkImageConstraintsInfoFUCHSIA 指定的。
对于基于图像的缓冲集合,createInfoIndex 将标识 VkImageConstraintsInfoFUCHSIA::pImageCreateInfos 元素和 VkImageConstraintsInfoFUCHSIA::pFormatConstraints 元素,这些元素是由 Sysmem 在调用 vkSetBufferCollectionImageConstraintsFUCHSIA 时选择的。sysmemColorSpaceIndex 的值将是 VkImageFormatConstraintsInfoFUCHSIA::pColorSpaces 数组中提供的颜色空间之一的索引。
实现必须使 formatFeatures 具有所有在 VkImageFormatConstraintsInfoFUCHSIA::requiredFormatFeatures 中设置的位,这些位是通过调用 vkSetBufferCollectionImageConstraintsFUCHSIA 在 createInfoIndex 处设置的(其他位也可以设置)。
内存分配
要将内存从缓冲集合导入到 VkImage 或 VkBuffer 中,请将 VkImportMemoryBufferCollectionFUCHSIA 结构链接到调用 vkAllocateMemory 时 VkMemoryAllocateInfo 的 pNext 成员。
VkImportMemoryBufferCollectionFUCHSIA 结构的定义如下:
// Provided by VK_FUCHSIA_buffer_collection
typedef struct VkImportMemoryBufferCollectionFUCHSIA {
VkStructureType sType;
const void* pNext;
VkBufferCollectionFUCHSIA collection;
uint32_t index;
} VkImportMemoryBufferCollectionFUCHSIA;
-
sType是一个 VkStructureType 值,用于标识此结构。 -
pNext为NULL或指向扩展此结构的结构的指针。 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
index要从collection导入的缓冲区的索引。
要释放一个 VkBufferCollectionFUCHSIA:
// Provided by VK_FUCHSIA_buffer_collection
void vkDestroyBufferCollectionFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkAllocationCallbacks* pAllocator);
-
device是创建VkBufferCollectionFUCHSIA的逻辑设备 -
collection是 VkBufferCollectionFUCHSIA 句柄 -
pAllocator是指向 VkAllocationCallbacks 结构的指针,用于控制主机内存分配,如 内存分配 章节所述