VkSemaphore

---
title: VkSemaphore interface
---
classDiagram
    VkSemaphore ()-- vk_semaphore
    vk_object_base <|-- vk_semaphore
    vk_semaphore <|.. vk_sync
    vk_sync -- vk_sync_type
    link vk_semaphore "https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/vulkan/runtime/vk_semaphore.h" "vk_semaphore"
    link vk_sync "https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/vulkan/runtime/vk_sync.h" "vk_sync"
    link vk_sync_type "https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/vulkan/runtime/vk_sync.h" "vk_sync_type"
    class vk_object_base{
        VK_LOADER_DATA _loader_data
        VkObjectType type
        bool client_visible
        vk_device *device
        vk_instance *instance
        util_sparse_array private_data
        char *object_name
    }
    class vk_semaphore{
        VkSemaphoreType type
        vk_sync *temporary
        vk_sync permanent
    }
    class vk_sync{
        vk_sync_type *type
        vk_sync_flags flags
    }
    class vk_sync_type{
        size_t size
        vk_sync_features features
        init() VkResult
        finish() void
        signal() VkResult
        get_value() VkResult
        reset() VkResult
        move() VkResult
        wait() VkResult
        wait_many() VkResult
        import_opaque_fd() VkResult
        export_opaque_fd() VkResult
        import_sync_file() VkResult
        export_sync_file() VkResult
        import_win32_handle() VkResult
        export_win32_handle() VkResult
        set_win32_export_params() VkResult
    }
    <<interface>> vk_sync_type

如果把基于 Vulkan 的渲染看成一个图,那么 VkCommandBuffer 是节点 (node),VkSemaphore 是边 (edge)

flowchart LR
    subgraph "Process 1"
        c1((VkCommandBuffer 1))
    end
    subgraph "Process 2"
        c2((VkCommandBuffer 2))
        c3((VkCommandBuffer 3))
    end
    subgraph "Process 3"
        c4((VkCommandBuffer 4))
        c5((VkCommandBuffer 5))
    end

    c1 --VkSemaphore 1--> c2
    c2 --VkSemaphore 2--> c4
    c3 --VkSemaphore 3--> c5
    c1 --VkSemaphore 4--> c5

Implicit Sync 好好的,为什么在 Vulkan 里要搞 Explicit Sync?

Implicit Sync 由内核负责,应用(甚至 UMD) 不用操心,确实也能工作,但是 implicit sync 存在过度同步 (over-synchronization) 的问题,必然导致不能最大限度地发挥出 CPU 和 GPU 的并行能力。

为什么 implicit sync 会有过度同步的问题? implicit sync 说白了,是由内核在不知道应用确切同步要求(谁等什么,什么时候完成)的情况下一股脑儿地给你进行不分青红皂白地阻塞式同步,是能正常工作,但不够精细,好多地方可能是白等了。

参考