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
* - 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 &&
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);
}
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
* 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 =
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;
}
}
}
}
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,
.syncs = &sync,
.sync_values = &(const uint64_t){ 1 },
.sync_count = 1,
- .ring_idx = ring_idx,
+ .ring_idx = payload->ring_idx,
},
.batch_count = 1,
};
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);
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);
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;
} 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,
} 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,