From: Yiwei Zhang Date: Wed, 8 Mar 2023 01:53:28 +0000 (-0800) Subject: venus: refactor to add vn_sync_payload_external X-Git-Tag: upstream/23.3.3~11670 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a37771b42a15ac9a68c4ec83e90b667b185a8e24;p=platform%2Fupstream%2Fmesa.git venus: refactor to add vn_sync_payload_external Signed-off-by: Yiwei Zhang Part-of: --- diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index 306d0c8..c4f89fe 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -63,9 +63,7 @@ struct vn_queue_submission { bool has_feedback_semaphore; const struct vn_device_memory *wsi_mem; uint32_t sem_cmd_buffer_count; - - bool ring_seqno_valid; - uint32_t ring_seqno; + struct vn_sync_payload_external external; /* Temporary storage allocation for submission * A single alloc for storage is performed and the offsets inside @@ -285,6 +283,7 @@ vn_queue_submission_prepare(struct vn_queue_submission *submit) * - has an external signal semaphore */ struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle); + submit->external.ring_idx = queue->ring_idx; submit->synchronous = has_external_fence || (!queue->device->instance->experimental.asyncRoundtrip && @@ -805,15 +804,15 @@ vn_queue_wsi_present(struct vn_queue_submission *submit) if (dev->instance->renderer->info.has_implicit_fencing) { struct vn_renderer_submit_batch batch = { - .ring_idx = queue->ring_idx, + .ring_idx = submit->external.ring_idx, }; uint32_t local_data[8]; struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(local_data, sizeof(local_data)); - if (submit->ring_seqno_valid) { + if (submit->external.ring_seqno_valid) { vn_encode_vkWaitRingSeqno100000MESA(&local_enc, 0, instance->ring.id, - submit->ring_seqno); + submit->external.ring_seqno); batch.cs_data = local_data; batch.cs_size = vn_cs_encoder_get_len(&local_enc); } @@ -883,8 +882,8 @@ vn_queue_submit(struct vn_queue_submission *submit) vn_queue_submission_cleanup(submit); return vn_error(dev->instance, VK_ERROR_DEVICE_LOST); } - submit->ring_seqno_valid = true; - submit->ring_seqno = instance_submit.ring_seqno; + submit->external.ring_seqno_valid = true; + submit->external.ring_seqno = instance_submit.ring_seqno; } /* If external fence, track the submission's ring_idx to facilitate @@ -894,9 +893,10 @@ vn_queue_submit(struct vn_queue_submission *submit) * because an fd is already available. */ struct vn_fence *fence = vn_fence_from_handle(submit->fence_handle); - if (fence && fence->is_external && - fence->payload->type == VN_SYNC_TYPE_DEVICE_ONLY) - fence->ring_idx = queue->ring_idx; + if (fence && fence->is_external) { + assert(fence->payload->type == VN_SYNC_TYPE_DEVICE_ONLY); + fence->external = submit->external; + } for (uint32_t i = 0; i < submit->batch_count; i++) { uint32_t signal_semaphore_count = @@ -904,9 +904,9 @@ vn_queue_submit(struct vn_queue_submission *submit) for (uint32_t j = 0; j < signal_semaphore_count; j++) { struct vn_semaphore *sem = vn_semaphore_from_handle(vn_get_signal_semaphore(submit, i, j)); - if (sem->is_external && - sem->payload->type == VN_SYNC_TYPE_DEVICE_ONLY) { - sem->ring_idx = queue->ring_idx; + if (sem->is_external) { + assert(sem->payload->type == VN_SYNC_TYPE_DEVICE_ONLY); + sem->external = submit->external; } } } @@ -1351,7 +1351,9 @@ vn_WaitForFences(VkDevice device, } static VkResult -vn_create_sync_file(struct vn_device *dev, uint32_t ring_idx, int *out_fd) +vn_create_sync_file(struct vn_device *dev, + struct vn_sync_payload_external *payload, + int *out_fd) { struct vn_renderer_sync *sync; VkResult result = vn_renderer_sync_create(dev->renderer, 0, @@ -1365,7 +1367,7 @@ vn_create_sync_file(struct vn_device *dev, uint32_t ring_idx, int *out_fd) .syncs = &sync, .sync_values = &(const uint64_t){ 1 }, .sync_count = 1, - .ring_idx = ring_idx, + .ring_idx = payload->ring_idx, }, .batch_count = 1, }; @@ -1433,7 +1435,7 @@ vn_GetFenceFdKHR(VkDevice device, int fd = -1; if (payload->type == VN_SYNC_TYPE_DEVICE_ONLY) { - result = vn_create_sync_file(dev, fence->ring_idx, &fd); + result = vn_create_sync_file(dev, &fence->external, &fd); if (result != VK_SUCCESS) return vn_error(dev->instance, result); @@ -1888,7 +1890,7 @@ vn_GetSemaphoreFdKHR(VkDevice device, int fd = -1; if (payload->type == VN_SYNC_TYPE_DEVICE_ONLY) { - VkResult result = vn_create_sync_file(dev, sem->ring_idx, &fd); + VkResult result = vn_create_sync_file(dev, &sem->external, &fd); if (result != VK_SUCCESS) return vn_error(dev->instance, result); diff --git a/src/virtio/vulkan/vn_queue.h b/src/virtio/vulkan/vn_queue.h index cdfc46b..935ebe1 100644 --- a/src/virtio/vulkan/vn_queue.h +++ b/src/virtio/vulkan/vn_queue.h @@ -52,6 +52,22 @@ struct vn_sync_payload { int fd; }; +/* For external fences and external semaphores submitted to be signaled. The + * Vulkan spec guarantees those external syncs are on permanent payload. + */ +struct vn_sync_payload_external { + /* ring_idx of the last queue submission */ + uint32_t ring_idx; + /* ring_seqno_valid is false when: + * - feature asyncRoundtrip is not supported by the renderer + * - NO_ASYNC_QUEUE_SUBMIT perf option is used + * - external fence and external semaphore + */ + bool ring_seqno_valid; + /* ring seqno of the last queue submission */ + uint32_t ring_seqno; +}; + struct vn_fence { struct vn_object_base base; @@ -67,11 +83,7 @@ struct vn_fence { } feedback; bool is_external; - - /* ring_idx of the last queue submission (only used for permanent - * payload of external fences) - */ - uint32_t ring_idx; + struct vn_sync_payload_external external; }; VK_DEFINE_NONDISP_HANDLE_CASTS(vn_fence, base.base, @@ -121,11 +133,7 @@ struct vn_semaphore { } feedback; bool is_external; - - /* ring_idx of the last queue submission (only used for permanent - * payload of external semaphores) - */ - uint32_t ring_idx; + struct vn_sync_payload_external external; }; VK_DEFINE_NONDISP_HANDLE_CASTS(vn_semaphore, base.base,