资源创建
缓冲区
缓冲区表示数据的线性数组,通过将它们绑定到图形或计算管线(通过描述符集或某些命令),或直接将它们指定为某些命令的参数,从而用于各种目的。
缓冲区由 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
数组的第 i
th 个成员指定图像的第 i
th 个平面的允许压缩率。
如果 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 的尺寸为
-
width
n+1 = max(⌊width
n/2⌋, 1) -
height
n+1 = max(⌊height
n/2⌋, 1) -
depth
n+1 = max(⌊depth
n/2⌋, 1)
其中 width
n、height
n 和 depth
n 是下一个较大 mip 级别 n 的尺寸。
最小 mip 级别大小为
-
一维图像为 1,
-
二维图像为 1x1,以及
-
三维图像为 1x1x1。
完整 mipmap 链中的级别数为
-
⌊log2(max(
width
0,height
0,depth
0))⌋ + 1
其中 width
0、height
0 和 depth
0 是最大(最详细)mip 级别 0
的尺寸。
角采样图像
对于角采样图像,每个连续的 mip 级别 n+1 的尺寸为
-
width
n+1 = max(⌈width
n/2⌉, 2) -
height
n+1 = max(⌈height
n/2⌉, 2) -
depth
n+1 = max(⌈depth
n/2⌉, 2)
其中 width
n、height
n 和 depth
n 是下一个较大 mip 级别 n 的尺寸。
最小 mip 级别大小为
-
二维图像为 2x2,以及
-
三维图像为 2x2x2。
完整 mipmap 链中的级别数为
-
⌈log2(max(
width
0,height
0,depth
0))⌉
其中 width
0、height
0 和 depth
0 是最大(最详细)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_t
Zircon 通道对象,允许参与缓冲区集合
缓冲区集合的平台初始化
要在 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.fidl
FIDL 接口的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 结构的指针,用于控制主机内存分配,如 内存分配 章节所述