私有数据
私有数据扩展为用户提供了一种将任意应用程序定义的数据与 Vulkan 对象关联起来的方法。这种关联是通过将应用程序定义的 64 位无符号整数存储在私有数据槽中来实现的。私有数据槽表示设备每个子对象的单个数据项的存储分配。
应用程序可以在设备创建时预留私有数据槽。要预留私有数据槽,请在设备创建之前,将 VkDevicePrivateDataCreateInfo 插入到 VkDeviceCreateInfo 中的 pNext
链中。可以将多个 VkDevicePrivateDataCreateInfo 结构链接在一起,并且将预留请求的槽的总和。这是结构指针链指定的有效用法的例外。以这种方式预留槽并非绝对必要,但它可能会提高性能。
私有数据槽由 VkPrivateDataSlot
句柄表示
// Provided by VK_VERSION_1_3
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPrivateDataSlot)
或等效项
// Provided by VK_EXT_private_data
typedef VkPrivateDataSlot VkPrivateDataSlotEXT;
要创建私有数据槽,请调用
// Provided by VK_VERSION_1_3
VkResult vkCreatePrivateDataSlot(
VkDevice device,
const VkPrivateDataSlotCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkPrivateDataSlot* pPrivateDataSlot);
或等效的命令
// Provided by VK_EXT_private_data
VkResult vkCreatePrivateDataSlotEXT(
VkDevice device,
const VkPrivateDataSlotCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkPrivateDataSlot* pPrivateDataSlot);
-
device
是与持有私有数据槽的对象创建关联的逻辑设备。 -
pCreateInfo
是指向VkPrivateDataSlotCreateInfo
的指针 -
pAllocator
控制主机内存分配,如内存分配章节所述。 -
pPrivateDataSlot
是指向 VkPrivateDataSlot 句柄的指针,将在其中返回生成的私有数据槽
VkPrivateDataSlotCreateInfo
结构定义为
// Provided by VK_VERSION_1_3
typedef struct VkPrivateDataSlotCreateInfo {
VkStructureType sType;
const void* pNext;
VkPrivateDataSlotCreateFlags flags;
} VkPrivateDataSlotCreateInfo;
或等效项
// Provided by VK_EXT_private_data
typedef VkPrivateDataSlotCreateInfo VkPrivateDataSlotCreateInfoEXT;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。
// Provided by VK_VERSION_1_3
typedef VkFlags VkPrivateDataSlotCreateFlags;
或等效项
// Provided by VK_EXT_private_data
typedef VkPrivateDataSlotCreateFlags VkPrivateDataSlotCreateFlagsEXT;
VkPrivateDataSlotCreateFlags
是一个用于设置掩码的位掩码类型,但目前保留供将来使用。
要销毁私有数据槽,请调用
// Provided by VK_VERSION_1_3
void vkDestroyPrivateDataSlot(
VkDevice device,
VkPrivateDataSlot privateDataSlot,
const VkAllocationCallbacks* pAllocator);
或等效的命令
// Provided by VK_EXT_private_data
void vkDestroyPrivateDataSlotEXT(
VkDevice device,
VkPrivateDataSlot privateDataSlot,
const VkAllocationCallbacks* pAllocator);
-
device
是与持有私有数据槽的对象创建关联的逻辑设备。 -
pAllocator
控制主机内存分配,如内存分配章节所述。 -
privateDataSlot
是要销毁的私有数据槽。
要将应用程序定义的数据存储在与 Vulkan 对象关联的槽中,请调用
// Provided by VK_VERSION_1_3
VkResult vkSetPrivateData(
VkDevice device,
VkObjectType objectType,
uint64_t objectHandle,
VkPrivateDataSlot privateDataSlot,
uint64_t data);
或等效的命令
// Provided by VK_EXT_private_data
VkResult vkSetPrivateDataEXT(
VkDevice device,
VkObjectType objectType,
uint64_t objectHandle,
VkPrivateDataSlot privateDataSlot,
uint64_t data);
-
device
是创建该对象的设备。 -
objectType
是一个 VkObjectType,指定要关联数据的对象类型。 -
objectHandle
是要关联数据的对象的句柄。 -
privateDataSlot
是一个 VkPrivateDataSlot 的句柄,指定私有数据存储的位置。 -
data
是要与对象关联的应用程序定义的数据。此数据将存储在privateDataSlot
中。
要从与 Vulkan 对象关联的槽中检索应用程序定义的数据,请调用
// Provided by VK_VERSION_1_3
void vkGetPrivateData(
VkDevice device,
VkObjectType objectType,
uint64_t objectHandle,
VkPrivateDataSlot privateDataSlot,
uint64_t* pData);
或等效的命令
// Provided by VK_EXT_private_data
void vkGetPrivateDataEXT(
VkDevice device,
VkObjectType objectType,
uint64_t objectHandle,
VkPrivateDataSlot privateDataSlot,
uint64_t* pData);
-
device
是创建该对象的设备 -
objectType
是一个 VkObjectType,指定与数据关联的对象类型。 -
objectHandle
是与数据关联的对象的句柄。 -
privateDataSlot
是一个 VkPrivateDataSlot 的句柄,指定私有数据指针存储的位置。 -
pData
是一个指针,用于指定返回应用程序定义的数据的位置。如果在先前没有使用objectHandle
指定的对象调用vkSetPrivateData
,则将写入0
。
由于 Android 上的平台细节,对于先前没有调用 |