diff --git a/plugins/win-capture/graphics-hook/vulkan-capture.c b/plugins/win-capture/graphics-hook/vulkan-capture.c index f74b635c9..5555b04f3 100644 --- a/plugins/win-capture/graphics-hook/vulkan-capture.c +++ b/plugins/win-capture/graphics-hook/vulkan-capture.c @@ -200,6 +200,22 @@ static void init_obj_list(struct vk_obj_list *list) InitializeSRWLock(&list->mutex); } +static struct vk_obj_node *obj_walk_begin(struct vk_obj_list *list) +{ + AcquireSRWLockExclusive(&list->mutex); + return list->root; +} + +static struct vk_obj_node *obj_walk_next(struct vk_obj_node *node) +{ + return node->next; +} + +static void obj_walk_end(struct vk_obj_list *list) +{ + ReleaseSRWLockExclusive(&list->mutex); +} + /* ------------------------------------------------------------------------- */ static struct vk_obj_list devices; @@ -283,6 +299,22 @@ static void remove_free_queue_all(struct vk_data *data, } } +static struct vk_queue_data *queue_walk_begin(struct vk_data *data) +{ + return (struct vk_queue_data *)obj_walk_begin(&data->queues); +} + +static struct vk_queue_data *queue_walk_next(struct vk_queue_data *queue_data) +{ + return (struct vk_queue_data *)obj_walk_next( + (struct vk_obj_node *)queue_data); +} + +static void queue_walk_end(struct vk_data *data) +{ + obj_walk_end(&data->queues); +} + /* ------------------------------------------------------------------------- */ static struct vk_swap_data *alloc_swap_data(const VkAllocationCallbacks *ac) @@ -314,6 +346,22 @@ static void remove_free_swap_data(struct vk_data *data, VkSwapchainKHR sc, vk_free(ac, swap_data); } +static struct vk_swap_data *swap_walk_begin(struct vk_data *data) +{ + return (struct vk_swap_data *)obj_walk_begin(&data->swaps); +} + +static struct vk_swap_data *swap_walk_next(struct vk_swap_data *swap_data) +{ + return (struct vk_swap_data *)obj_walk_next( + (struct vk_obj_node *)swap_data); +} + +static void swap_walk_end(struct vk_data *data) +{ + obj_walk_end(&data->swaps); +} + /* ------------------------------------------------------------------------- */ static void vk_shtex_clear_fence(const struct vk_data *data, @@ -355,9 +403,8 @@ static void vk_shtex_free(struct vk_data *data) vk_shtex_wait_until_idle(data); - AcquireSRWLockExclusive(&data->swaps.mutex); + struct vk_swap_data *swap = swap_walk_begin(data); - struct vk_swap_data *swap = (struct vk_swap_data *)data->swaps.root; while (swap) { VkDevice device = data->device; if (swap->export_image) @@ -378,10 +425,10 @@ static void vk_shtex_free(struct vk_data *data) swap->captured = false; - swap = (struct vk_swap_data *)swap->node.next; + swap = swap_walk_next(swap); } - ReleaseSRWLockExclusive(&data->swaps.mutex); + swap_walk_end(data); if (data->d3d11_context) { ID3D11DeviceContext_Release(data->d3d11_context);