面向 Vulkan 的 Swappy
Swappy 的 Vulkan 部分。
摘要
类型定义 |
|
---|---|
SwappyVkFunctionProvider
|
typedefstruct SwappyVkFunctionProvider
通过调用 SwappyVk_setFunctionProvider,您可以使用此结构提供您自己的 Vulkan 函数封装器。 |
函数 |
|
---|---|
SwappyVk_clearStats(VkSwapchainKHR swapchain)
|
void
清除目前收集到的帧统计信息。
|
SwappyVk_destroyDevice(VkDevice device)
|
void
销毁与设备关联的所有交换链,并清理设备资源。
|
SwappyVk_destroySwapchain(VkDevice device, VkSwapchainKHR swapchain)
|
void
销毁与交换链关联的 SwappyVk 实例。
|
SwappyVk_determineDeviceExtensions(VkPhysicalDevice physicalDevice, uint32_t availableExtensionCount, VkExtensionProperties *pAvailableExtensions, uint32_t *pRequiredExtensionCount, char **pRequiredExtensions)
|
void
确定必须为新的 VkDevice 启用的任何 Vulkan 设备扩展。
|
SwappyVk_enableStats(VkSwapchainKHR swapchain, bool enabled)
|
void
开启/关闭统计信息收集功能。
|
SwappyVk_getFenceTimeoutNS()
|
uint64_t
获取围栏超时参数,适用于驱动程序有故障的设备。
|
SwappyVk_getStats(VkSwapchainKHR swapchain, SwappyStats *swappyStats)
|
void
如果开启了统计信息收集功能,则返回收集到的统计信息。
|
SwappyVk_getSupportedRefreshPeriodsNS(uint64_t *out_refreshrates, int allocated_entries, VkSwapchainKHR swapchain)
|
int
获取此设备支持的刷新周期。
|
SwappyVk_getSwapIntervalNS(VkSwapchainKHR swapchain)
|
uint64_t
获取给定交换链的交换间隔值(以纳秒为单位)。
|
SwappyVk_initAndGetRefreshCycleDuration(JNIEnv *env, jobject jactivity, VkPhysicalDevice physicalDevice, VkDevice device, VkSwapchainKHR swapchain, uint64_t *pRefreshDuration)
|
bool
为给定的设备和交换链初始化 SwappyVk,并获取垂直空白周期之间的近似时间持续时间。
|
SwappyVk_injectTracer(const SwappyTracer *tracer)
|
void
注入每个帧将调用的回调函数。
|
SwappyVk_isEnabled(VkSwapchainKHR swapchain, bool *isEnabled)
|
bool
检查是否为指定的交换链启用了 Swappy。
|
SwappyVk_queuePresent(VkQueue queue, const VkPresentInfoKHR *pPresentInfo)
|
VkResult
告知 Swappy 将一个或多个图像呈现给相应的交换链。
|
SwappyVk_recordFrameStart(VkQueue queue, VkSwapchainKHR swapchain, uint32_t image)
|
void
如果已通过 SwappyVk_enableStats 启用统计信息,则应调用此函数。
|
SwappyVk_setAutoPipelineMode(bool enabled)
|
void
为所有实例启用自动流水线模式功能。
|
SwappyVk_setAutoSwapInterval(bool enabled)
|
void
为所有实例启用自动交换间隔功能。
|
SwappyVk_setFenceTimeoutNS(uint64_t fence_timeout_ns)
|
void
可以为驱动程序有故障的设备设置围栏超时参数。
|
SwappyVk_setFunctionProvider(const SwappyVkFunctionProvider *pSwappyVkFunctionProvider)
|
void
设置 Vulkan 函数提供程序。
|
SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns)
|
void
设置所有实例的最大交换持续时间。
|
SwappyVk_setQueueFamilyIndex(VkDevice device, VkQueue queue, uint32_t queueFamilyIndex)
|
void
告知 Swappy 用于创建特定 VkQueue 的 queueFamilyIndex。
|
SwappyVk_setSwapIntervalNS(VkDevice device, VkSwapchainKHR swapchain, uint64_t swap_ns)
|
void
告知 Swappy 每个呈现的图像应保持可见的持续时间。
|
SwappyVk_setWindow(VkDevice device, VkSwapchainKHR swapchain, ANativeWindow *window)
|
void
告知 Swappy 在调用 ANativeWindow_* API 时使用哪个 ANativeWindow。
|
SwappyVk_uninjectTracer(const SwappyTracer *tracer)
|
void
移除之前使用 SwappyVk_injectTracer 添加的回调函数。
|
宏 |
|
---|---|
VK_NO_PROTOTYPES 1
|
结构体 |
|
---|---|
SwappyVkFunctionProvider |
通过调用 SwappyVk_setFunctionProvider,您可以使用此结构提供您自己的 Vulkan 函数封装器。 |
类型定义
SwappyVkFunctionProvider
struct SwappyVkFunctionProvider SwappyVkFunctionProvider
通过调用 SwappyVk_setFunctionProvider,您可以使用此结构提供您自己的 Vulkan 函数封装器。
此功能的使用是可选的。
函数
SwappyVk_clearStats
void SwappyVk_clearStats( VkSwapchainKHR swapchain )
清除目前收集到的帧统计信息。
所有收集到的帧统计信息都重置为 0,此调用后会正常收集帧统计信息。有关更多条件,请参阅 SwappyVk_enableStats。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_destroyDevice
void SwappyVk_destroyDevice( VkDevice device )
销毁与设备关联的所有交换链,并清理设备资源。
如果您不再需要该设备,应在 SwappyVk_destroySwapchain 后调用此函数。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_destroySwapchain
void SwappyVk_destroySwapchain( VkDevice device, VkSwapchainKHR swapchain )
销毁与交换链关联的 SwappyVk 实例。
预期应在调用 vkDestroySwapchainKHR() 之前调用此 API,以便 Swappy 清理其内部状态。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
SwappyVk_determineDeviceExtensions
void SwappyVk_determineDeviceExtensions( VkPhysicalDevice physicalDevice, uint32_t availableExtensionCount, VkExtensionProperties *pAvailableExtensions, uint32_t *pRequiredExtensionCount, char **pRequiredExtensions )
确定必须为新的 VkDevice 启用的任何 Vulkan 设备扩展。
面向 Vulkan 的 Swappy (SwappyVk) 受益于某些 Vulkan 设备扩展(例如 VK_GOOGLE_display_timing)。在应用调用 vkCreateDevice 之前,SwappyVk 需要查看可用扩展列表(由 vkEnumerateDeviceExtensionProperties 返回),并可能确定应用必须添加到
- VkDeviceCreateInfo::enabledExtensionCount
- VkDeviceCreateInfo::ppEnabledExtensionNames
中,然后再调用 vkCreateDevice。对于应用将调用 vkCreateDevice 的每个 VkPhysicalDevice,应用都必须调用此函数,然后必须将确定的扩展添加到为 VkDevice 启用的列表中。与许多 Vulkan 函数类似,此函数可以调用两次,第一次调用以确定所需扩展的数量,第二次调用则使用应用分配的内存,函数可以写入其中。
详细信息 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
参数 |
|
SwappyVk_enableStats
void SwappyVk_enableStats( VkSwapchainKHR swapchain, bool enabled )
开启/关闭统计信息收集功能。
默认情况下,统计信息收集处于关闭状态,且不产生与统计信息相关的开销。应用可以通过调用 SwappyVk_enableStats(swapchain, true)
来开启统计信息收集。然后,应用应在开始执行任何与 CPU 相关的工作之前,为每个帧调用 SwappyVk_recordFrameStart。统计信息将使用“FrameStatistics”标签记录到 logcat 中。应用可以通过调用 SwappyVk_getStats 来获取统计信息。
之前必须为此交换链成功调用过 SwappyVk_initAndGetRefreshCycleDuration,否则此调用无效。仅当平台支持 VK_GOOGLE_display_timing 扩展时,才提供帧统计信息。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
SwappyVk_getFenceTimeoutNS
uint64_t SwappyVk_getFenceTimeoutNS()
获取围栏超时参数,适用于驱动程序有故障的设备。
其默认值为 50,000,000。
SwappyVk_getStats
void SwappyVk_getStats( VkSwapchainKHR swapchain, SwappyStats *swappyStats )
如果开启了统计信息收集功能,则返回收集到的统计信息。
鉴于此 API 使用 VkSwapchainKHR 并且此调用可能在不同线程上执行,对 SwappyVk_getStats 的所有调用都必须与 SwappyVk 的其他调用进行外部同步。未同步的调用可能导致未定义的行为。有关更多条件,请参阅 SwappyVk_enableStats。
另请参阅: SwappyStats
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
SwappyVk_getSupportedRefreshPeriodsNS
int SwappyVk_getSupportedRefreshPeriodsNS( uint64_t *out_refreshrates, int allocated_entries, VkSwapchainKHR swapchain )
获取此设备支持的刷新周期。
第一次调用时将 out_refreshrates 设为 nullptr 以获取支持的刷新周期数,然后再次调用时将该数字作为 allocated_entries 传递,并传递一个大小等于 allocated_entries 的数组,该数组将填充刷新周期。
- 要查询的交换链
uint64_t SwappyVk_getSwapIntervalNS( VkSwapchainKHR swapchain )
获取给定交换链的交换间隔值(以纳秒为单位)。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_initAndGetRefreshCycleDuration
bool SwappyVk_initAndGetRefreshCycleDuration( JNIEnv *env, jobject jactivity, VkPhysicalDevice physicalDevice, VkDevice device, VkSwapchainKHR swapchain, uint64_t *pRefreshDuration )
为给定的设备和交换链初始化 SwappyVk,并获取垂直空白周期之间的近似时间持续时间。
使用 JNI 查询 AppVsyncOffset 和 PresentationDeadline。
如果您的应用同时呈现到多个交换链,则必须在调用 swappyVkSetSwapInterval() 之前为每个交换链调用此函数。
垂直空白周期之间的持续时间(一个间隔)表示为交换链物理显示器垂直空白周期之间的近似纳秒数。
如果应用将此数字转换为分数(例如,16,666,666 纳秒转换为 0.016666666),并用一除以此分数,则将得到显示器的近似刷新率(例如,16,666,666 纳秒对应于 60Hz 显示器,11,111,111 纳秒对应于 90Hz 显示器)。
详细信息 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
参数 |
|
||||||||||||
返回值 |
bool - 如果 pRefreshDuration 返回的值有效,则为 true;否则(如果发生错误)为 false。
|
SwappyVk_injectTracer
void SwappyVk_injectTracer( const SwappyTracer *tracer )
注入每个帧将调用的回调函数。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_isEnabled
bool SwappyVk_isEnabled( VkSwapchainKHR swapchain, bool *isEnabled )
检查是否为指定的交换链启用了 Swappy。
详细信息 | |
---|---|
返回值 |
如果未为指定的交换链调用 SwappyVk_initAndGetRefreshCycleDuration,则为 false;否则为 true。
|
SwappyVk_queuePresent
VkResult SwappyVk_queuePresent( VkQueue queue, const VkPresentInfoKHR *pPresentInfo )
告知 Swappy 将一个或多个图像呈现给相应的交换链。
Swappy 将为您的应用调用 vkQueuePresentKHR。Swappy 可能会在 VkPresentInfoKHR 的 pNext 链中插入一个结构体,或者插入其他 Vulkan 命令,以便尝试遵守所需的交换间隔。
注意:如果您的应用同时呈现到多个交换链,并且您对每个交换链使用不同的交换间隔,Swappy 将尝试遵守每个交换链的交换间隔(在支持基础呈现时间扩展(例如 VK_GOOGLE_display_timing)的设备上会更成功)。
详细信息 | |||||
---|---|---|---|---|---|
参数 |
|
SwappyVk_recordFrameStart
void SwappyVk_recordFrameStart( VkQueue queue, VkSwapchainKHR swapchain, uint32_t image )
如果已通过 SwappyVk_enableStats 启用统计信息,则应调用此函数。
使用 SwappyVk_enableStats 启用统计信息收集后,应用应在开始执行任何与 CPU 相关的工作之前为每个帧调用此函数。假设此函数将在成功调用 vkAcquireNextImageKHR 后调用。有关更多条件,请参阅 SwappyVk_enableStats。
另请参阅:SwappyVk_enableStats。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
SwappyVk_setAutoPipelineMode
void SwappyVk_setAutoPipelineMode( bool enabled )
为所有实例启用自动流水线模式功能。
默认情况下,此功能处于启用状态。更改它完全可选,用于微调 swappy 行为。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_setAutoSwapInterval
void SwappyVk_setAutoSwapInterval( bool enabled )
为所有实例启用自动交换间隔功能。
默认情况下,此功能处于启用状态。更改它完全可选,用于微调 swappy 行为。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_setFenceTimeoutNS
void SwappyVk_setFenceTimeoutNS( uint64_t fence_timeout_ns )
可以为驱动程序有故障的设备设置围栏超时参数。
其默认值为 50,000,000。
SwappyVk_setFunctionProvider
void SwappyVk_setFunctionProvider( const SwappyVkFunctionProvider *pSwappyVkFunctionProvider )
设置 Vulkan 函数提供程序。
这使您能够提供一个对象,该对象将用于查找 Vulkan 函数,例如,用于挂钩这些函数的使用。
要使用此功能,您必须在调用任何其他函数之前调用此函数。
此函数的使用完全可选。如果您不使用它,Swappy 所需的 Vulkan 函数将从 libvulkan.so 动态加载。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_setMaxAutoSwapIntervalNS
void SwappyVk_setMaxAutoSwapIntervalNS( uint64_t max_swap_ns )
设置所有实例的最大交换持续时间。
设置自动交换间隔的最大持续时间(以毫秒为单位)。如果 SwappyVk 在自动交换间隔模式下运行,并且帧持续时间长于提供的持续时间,SwappyVk 将不会进行任何步调调整,而是尽快提交帧。
详细信息 | |||
---|---|---|---|
参数 |
|
SwappyVk_setQueueFamilyIndex
void SwappyVk_setQueueFamilyIndex( VkDevice device, VkQueue queue, uint32_t queueFamilyIndex )
告知 Swappy 用于创建特定 VkQueue 的 queueFamilyIndex。
Swappy 需要知道用于创建特定 VkQueue 的 queueFamilyIndex,以便在呈现时使用它。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
SwappyVk_setSwapIntervalNS
void SwappyVk_setSwapIntervalNS( VkDevice device, VkSwapchainKHR swapchain, uint64_t swap_ns )
告知 Swappy 每个呈现的图像应保持可见的持续时间。
如果您的应用同时呈现到多个交换链,则必须在呈现之前为每个交换链调用此函数。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
SwappyVk_setWindow
void SwappyVk_setWindow( VkDevice device, VkSwapchainKHR swapchain, ANativeWindow *window )
告知 Swappy 在调用 ANativeWindow_* API 时使用哪个 ANativeWindow。
详细信息 | |||||||
---|---|---|---|---|---|---|---|
参数 |
|
SwappyVk_uninjectTracer
void SwappyVk_uninjectTracer( const SwappyTracer *tracer )
移除之前使用 SwappyVk_injectTracer 添加的回调函数。
仅移除之前使用 SwappyVK_injectTracer 添加的回调函数。如果未调用 SwappyVK_injectTracker 并传入 tracer,则没有效果。
详细信息 | |||
---|---|---|---|
参数 |
|
宏
VK_NO_PROTOTYPES
VK_NO_PROTOTYPES 1