1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2019 Google LLC 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * based in part on anv and radv which are: 6*61046927SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation 7*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Red Hat. 8*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Bas Nieuwenhuizen 9*61046927SAndroid Build Coastguard Worker */ 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker #ifndef VN_QUEUE_H 12*61046927SAndroid Build Coastguard Worker #define VN_QUEUE_H 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker #include "vn_common.h" 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker struct vn_queue { 17*61046927SAndroid Build Coastguard Worker struct vn_queue_base base; 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard Worker /* only used if renderer supports multiple timelines */ 20*61046927SAndroid Build Coastguard Worker uint32_t ring_idx; 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker /* wait fence used for vn_QueueWaitIdle */ 23*61046927SAndroid Build Coastguard Worker VkFence wait_fence; 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker /* semaphore for gluing vkQueueSubmit feedback commands to 26*61046927SAndroid Build Coastguard Worker * vkQueueBindSparse 27*61046927SAndroid Build Coastguard Worker */ 28*61046927SAndroid Build Coastguard Worker VkSemaphore sparse_semaphore; 29*61046927SAndroid Build Coastguard Worker uint64_t sparse_semaphore_counter; 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Worker /* for vn_queue_submission storage */ 32*61046927SAndroid Build Coastguard Worker struct vn_cached_storage storage; 33*61046927SAndroid Build Coastguard Worker }; 34*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(vn_queue, base.base.base, VkQueue, VK_OBJECT_TYPE_QUEUE) 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker enum vn_sync_type { 37*61046927SAndroid Build Coastguard Worker /* no payload */ 38*61046927SAndroid Build Coastguard Worker VN_SYNC_TYPE_INVALID, 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker /* device object */ 41*61046927SAndroid Build Coastguard Worker VN_SYNC_TYPE_DEVICE_ONLY, 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker /* payload is an imported sync file */ 44*61046927SAndroid Build Coastguard Worker VN_SYNC_TYPE_IMPORTED_SYNC_FD, 45*61046927SAndroid Build Coastguard Worker }; 46*61046927SAndroid Build Coastguard Worker 47*61046927SAndroid Build Coastguard Worker struct vn_sync_payload { 48*61046927SAndroid Build Coastguard Worker enum vn_sync_type type; 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker /* If type is VN_SYNC_TYPE_IMPORTED_SYNC_FD, fd is a sync file. */ 51*61046927SAndroid Build Coastguard Worker int fd; 52*61046927SAndroid Build Coastguard Worker }; 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker /* For external fences and external semaphores submitted to be signaled. The 55*61046927SAndroid Build Coastguard Worker * Vulkan spec guarantees those external syncs are on permanent payload. 56*61046927SAndroid Build Coastguard Worker */ 57*61046927SAndroid Build Coastguard Worker struct vn_sync_payload_external { 58*61046927SAndroid Build Coastguard Worker /* ring_idx of the last queue submission */ 59*61046927SAndroid Build Coastguard Worker uint32_t ring_idx; 60*61046927SAndroid Build Coastguard Worker /* valid when NO_ASYNC_QUEUE_SUBMIT perf option is not used */ 61*61046927SAndroid Build Coastguard Worker bool ring_seqno_valid; 62*61046927SAndroid Build Coastguard Worker /* ring seqno of the last queue submission */ 63*61046927SAndroid Build Coastguard Worker uint32_t ring_seqno; 64*61046927SAndroid Build Coastguard Worker }; 65*61046927SAndroid Build Coastguard Worker 66*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot; 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker struct vn_fence { 69*61046927SAndroid Build Coastguard Worker struct vn_object_base base; 70*61046927SAndroid Build Coastguard Worker 71*61046927SAndroid Build Coastguard Worker struct vn_sync_payload *payload; 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Worker struct vn_sync_payload permanent; 74*61046927SAndroid Build Coastguard Worker struct vn_sync_payload temporary; 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker struct { 77*61046927SAndroid Build Coastguard Worker /* non-NULL if VN_PERF_NO_FENCE_FEEDBACK is disabled */ 78*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot *slot; 79*61046927SAndroid Build Coastguard Worker VkCommandBuffer *commands; 80*61046927SAndroid Build Coastguard Worker } feedback; 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker bool is_external; 83*61046927SAndroid Build Coastguard Worker struct vn_sync_payload_external external_payload; 84*61046927SAndroid Build Coastguard Worker }; 85*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_fence, 86*61046927SAndroid Build Coastguard Worker base.base, 87*61046927SAndroid Build Coastguard Worker VkFence, 88*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_FENCE) 89*61046927SAndroid Build Coastguard Worker 90*61046927SAndroid Build Coastguard Worker struct vn_semaphore { 91*61046927SAndroid Build Coastguard Worker struct vn_object_base base; 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker VkSemaphoreType type; 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker struct vn_sync_payload *payload; 96*61046927SAndroid Build Coastguard Worker 97*61046927SAndroid Build Coastguard Worker struct vn_sync_payload permanent; 98*61046927SAndroid Build Coastguard Worker struct vn_sync_payload temporary; 99*61046927SAndroid Build Coastguard Worker 100*61046927SAndroid Build Coastguard Worker struct { 101*61046927SAndroid Build Coastguard Worker /* non-NULL if VN_PERF_NO_SEMAPHORE_FEEDBACK is disabled */ 102*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot *slot; 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker /* Lists of allocated vn_semaphore_feedback_cmd 105*61046927SAndroid Build Coastguard Worker * 106*61046927SAndroid Build Coastguard Worker * On submission prepare, sfb cmd is cache allocated from the free list 107*61046927SAndroid Build Coastguard Worker * and is moved to the pending list after initialization. 108*61046927SAndroid Build Coastguard Worker * 109*61046927SAndroid Build Coastguard Worker * On submission cleanup, sfb cmds of the owner semaphores are checked 110*61046927SAndroid Build Coastguard Worker * and cached to the free list if they have been "signaled", which is 111*61046927SAndroid Build Coastguard Worker * proxyed via the src slot value having been reached. 112*61046927SAndroid Build Coastguard Worker */ 113*61046927SAndroid Build Coastguard Worker struct list_head pending_cmds; 114*61046927SAndroid Build Coastguard Worker struct list_head free_cmds; 115*61046927SAndroid Build Coastguard Worker uint32_t free_cmd_count; 116*61046927SAndroid Build Coastguard Worker 117*61046927SAndroid Build Coastguard Worker /* Lock for accessing free/pending sfb cmds */ 118*61046927SAndroid Build Coastguard Worker simple_mtx_t cmd_mtx; 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker /* Cached counter value to track if an async sem wait call is needed */ 121*61046927SAndroid Build Coastguard Worker uint64_t signaled_counter; 122*61046927SAndroid Build Coastguard Worker 123*61046927SAndroid Build Coastguard Worker /* Lock for checking if an async sem wait call is needed based on 124*61046927SAndroid Build Coastguard Worker * the current counter value and signaled_counter to ensure async 125*61046927SAndroid Build Coastguard Worker * wait order across threads. 126*61046927SAndroid Build Coastguard Worker */ 127*61046927SAndroid Build Coastguard Worker simple_mtx_t async_wait_mtx; 128*61046927SAndroid Build Coastguard Worker } feedback; 129*61046927SAndroid Build Coastguard Worker 130*61046927SAndroid Build Coastguard Worker bool is_external; 131*61046927SAndroid Build Coastguard Worker struct vn_sync_payload_external external_payload; 132*61046927SAndroid Build Coastguard Worker }; 133*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_semaphore, 134*61046927SAndroid Build Coastguard Worker base.base, 135*61046927SAndroid Build Coastguard Worker VkSemaphore, 136*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_SEMAPHORE) 137*61046927SAndroid Build Coastguard Worker 138*61046927SAndroid Build Coastguard Worker struct vn_event { 139*61046927SAndroid Build Coastguard Worker struct vn_object_base base; 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker /* non-NULL if below are satisfied: 142*61046927SAndroid Build Coastguard Worker * - event is created without VK_EVENT_CREATE_DEVICE_ONLY_BIT 143*61046927SAndroid Build Coastguard Worker * - VN_PERF_NO_EVENT_FEEDBACK is disabled 144*61046927SAndroid Build Coastguard Worker */ 145*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot *feedback_slot; 146*61046927SAndroid Build Coastguard Worker }; 147*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_event, 148*61046927SAndroid Build Coastguard Worker base.base, 149*61046927SAndroid Build Coastguard Worker VkEvent, 150*61046927SAndroid Build Coastguard Worker VK_OBJECT_TYPE_EVENT) 151*61046927SAndroid Build Coastguard Worker 152*61046927SAndroid Build Coastguard Worker void 153*61046927SAndroid Build Coastguard Worker vn_fence_signal_wsi(struct vn_device *dev, struct vn_fence *fence); 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker void 156*61046927SAndroid Build Coastguard Worker vn_semaphore_signal_wsi(struct vn_device *dev, struct vn_semaphore *sem); 157*61046927SAndroid Build Coastguard Worker 158*61046927SAndroid Build Coastguard Worker #endif /* VN_QUEUE_H */ 159