私有数据

私有数据扩展为用户提供了一种将任意应用程序定义的数据与 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 句柄的指针,将在其中返回生成的私有数据槽

有效用法
  • VUID-vkCreatePrivateDataSlot-privateData-04564
    必须启用privateData功能

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

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

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

  • VUID-vkCreatePrivateDataSlot-pPrivateDataSlot-parameter
    pPrivateDataSlot 必须是指向 VkPrivateDataSlot 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

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 值,用于标识此结构。

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

  • flags 保留供将来使用。

有效用法(隐式)
  • VUID-VkPrivateDataSlotCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO

  • VUID-VkPrivateDataSlotCreateInfo-pNext-pNext
    pNext 必须NULL

  • VUID-VkPrivateDataSlotCreateInfo-flags-zerobitmask
    flags 必须0

// 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 是要销毁的私有数据槽。

有效用法
  • VUID-vkDestroyPrivateDataSlot-privateDataSlot-04062
    如果在创建 privateDataSlot 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyPrivateDataSlot-privateDataSlot-04063
    如果在创建 privateDataSlot 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

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

  • VUID-vkDestroyPrivateDataSlot-privateDataSlot-parameter
    如果 privateDataSlot 不是 VK_NULL_HANDLE,则 privateDataSlot 必须是一个有效的 VkPrivateDataSlot 句柄

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

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

主机同步
  • 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 中。

有效用法
  • VUID-vkSetPrivateData-objectHandle-04016
    objectHandle 必须devicedevice 的子对象

  • VUID-vkSetPrivateData-objectHandle-04017
    objectHandle 必须是类型为 objectType 的对象的有效句柄

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

  • VUID-vkSetPrivateData-objectType-parameter
    objectType 必须是一个有效的 VkObjectType

  • VUID-vkSetPrivateData-privateDataSlot-parameter
    privateDataSlot 必须是一个有效的 VkPrivateDataSlot 句柄

  • VUID-vkSetPrivateData-privateDataSlot-parent
    privateDataSlot 必须是从 device 创建、分配或检索的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

要从与 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 上的平台细节,对于先前没有调用 vkSetPrivateDataVkSwapchainKHR 对象,实现可能无法可靠地从 vkGetPrivateData 调用返回 0。 此勘误仅限于 Android 平台和 VkSwapchainKHR 类型的对象。

有效用法
  • VUID-vkGetPrivateData-objectType-04018
    objectHandle 必须devicedevice 的子对象

  • VUID-vkGetPrivateData-objectHandle-09498
    objectHandle 必须是类型为 objectType 的对象的有效句柄

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

  • VUID-vkGetPrivateData-objectType-parameter
    objectType 必须是一个有效的 VkObjectType

  • VUID-vkGetPrivateData-privateDataSlot-parameter
    privateDataSlot 必须是一个有效的 VkPrivateDataSlot 句柄

  • VUID-vkGetPrivateData-pData-parameter
    pData 必须是一个指向 uint64_t 值的有效指针

  • VUID-vkGetPrivateData-privateDataSlot-parent
    privateDataSlot 必须是从 device 创建、分配或检索的