mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 15:48:36 +02:00
anv/trtt: don't wait/signal syncobjs using the CPU anymore
Pass them as part of the TR-TT batch. This is what a lot of the previous commits were building up to. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25512>
This commit is contained in:
parent
f2206a0eb1
commit
18bd00c024
3 changed files with 34 additions and 32 deletions
|
|
@ -581,35 +581,8 @@ anv_sparse_bind_trtt(struct anv_device *device,
|
||||||
sparse_submit->binds_len, trtt_submit.l3l2_binds_len,
|
sparse_submit->binds_len, trtt_submit.l3l2_binds_len,
|
||||||
trtt_submit.l1_binds_len);
|
trtt_submit.l1_binds_len);
|
||||||
|
|
||||||
/* TODO: make both the syncs and signals be passed as part of the vm_bind
|
if (trtt_submit.l3l2_binds_len || trtt_submit.l1_binds_len)
|
||||||
* ioctl so they can be waited asynchronously. For now this doesn't matter
|
|
||||||
* as we're doing synchronous vm_bind, but later when we make it async this
|
|
||||||
* will make a difference.
|
|
||||||
*/
|
|
||||||
result = vk_sync_wait_many(&device->vk, sparse_submit->wait_count,
|
|
||||||
sparse_submit->waits, VK_SYNC_WAIT_COMPLETE,
|
|
||||||
INT64_MAX);
|
|
||||||
if (result != VK_SUCCESS) {
|
|
||||||
result = vk_queue_set_lost(&sparse_submit->queue->vk,
|
|
||||||
"vk_sync_wait failed");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trtt_submit.l3l2_binds_len || trtt_submit.l1_binds_len) {
|
|
||||||
result = anv_genX(device->info, write_trtt_entries)(&trtt_submit);
|
result = anv_genX(device->info, write_trtt_entries)(&trtt_submit);
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < sparse_submit->signal_count; i++) {
|
|
||||||
struct vk_sync_signal *s = &sparse_submit->signals[i];
|
|
||||||
result = vk_sync_signal(&device->vk, s->sync, s->signal_value);
|
|
||||||
if (result != VK_SUCCESS) {
|
|
||||||
result = vk_queue_set_lost(&sparse_submit->queue->vk,
|
|
||||||
"vk_sync_signal failed");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
pthread_mutex_unlock(&trtt->mutex);
|
pthread_mutex_unlock(&trtt->mutex);
|
||||||
|
|
|
||||||
|
|
@ -992,6 +992,22 @@ i915_execute_trtt_batch(struct anv_sparse_submission *submit,
|
||||||
};
|
};
|
||||||
VkResult result;
|
VkResult result;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < submit->wait_count; i++) {
|
||||||
|
result = anv_execbuf_add_sync(device, &execbuf, submit->waits[i].sync,
|
||||||
|
false /* is_signal */,
|
||||||
|
submit->waits[i].wait_value);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < submit->signal_count; i++) {
|
||||||
|
result = anv_execbuf_add_sync(device, &execbuf, submit->signals[i].sync,
|
||||||
|
true /* is_signal */,
|
||||||
|
submit->signals[i].signal_value);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
result = anv_execbuf_add_bo(device, &execbuf, device->workaround_bo, NULL,
|
result = anv_execbuf_add_bo(device, &execbuf, device->workaround_bo, NULL,
|
||||||
0);
|
0);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
|
|
@ -1024,6 +1040,7 @@ i915_execute_trtt_batch(struct anv_sparse_submission *submit,
|
||||||
.rsvd1 = context_id,
|
.rsvd1 = context_id,
|
||||||
.rsvd2 = 0,
|
.rsvd2 = 0,
|
||||||
};
|
};
|
||||||
|
setup_execbuf_fence_params(&execbuf);
|
||||||
|
|
||||||
int ret = queue->device->info->no_hw ? 0 :
|
int ret = queue->device->info->no_hw ? 0 :
|
||||||
anv_gem_execbuffer(device, &execbuf.execbuf);
|
anv_gem_execbuffer(device, &execbuf.execbuf);
|
||||||
|
|
|
||||||
|
|
@ -195,16 +195,28 @@ xe_execute_trtt_batch(struct anv_sparse_submission *submit,
|
||||||
if (drmSyncobjCreate(device->fd, 0, &syncobj_handle))
|
if (drmSyncobjCreate(device->fd, 0, &syncobj_handle))
|
||||||
return vk_errorf(device, VK_ERROR_UNKNOWN, "Unable to create sync obj");
|
return vk_errorf(device, VK_ERROR_UNKNOWN, "Unable to create sync obj");
|
||||||
|
|
||||||
struct drm_xe_sync sync = {
|
struct drm_xe_sync extra_sync = {
|
||||||
.flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL,
|
.flags = DRM_XE_SYNC_SYNCOBJ | DRM_XE_SYNC_SIGNAL,
|
||||||
.handle = syncobj_handle,
|
.handle = syncobj_handle,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct drm_xe_sync *xe_syncs = NULL;
|
||||||
|
uint32_t xe_syncs_count = 0;
|
||||||
|
result = xe_exec_process_syncs(queue, submit->wait_count, submit->waits,
|
||||||
|
submit->signal_count, submit->signals,
|
||||||
|
1, &extra_sync,
|
||||||
|
NULL, /* utrace_submit */
|
||||||
|
false, /* is_companion_rcs_queue */
|
||||||
|
&xe_syncs, &xe_syncs_count);
|
||||||
|
if (result != VK_SUCCESS)
|
||||||
|
goto exec_error;
|
||||||
|
|
||||||
struct drm_xe_exec exec = {
|
struct drm_xe_exec exec = {
|
||||||
.exec_queue_id = queue->exec_queue_id,
|
.exec_queue_id = queue->exec_queue_id,
|
||||||
.num_batch_buffer = 1,
|
.num_syncs = xe_syncs_count,
|
||||||
|
.syncs = (uintptr_t)xe_syncs,
|
||||||
.address = batch_bo->offset,
|
.address = batch_bo->offset,
|
||||||
.num_syncs = 1,
|
.num_batch_buffer = 1,
|
||||||
.syncs = (uintptr_t)&sync,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!device->info->no_hw) {
|
if (!device->info->no_hw) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue