diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 38251c74225..24765f4706f 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -2143,6 +2143,15 @@ anv_queue_exec_locked(struct anv_queue *queue, goto error; } + if (queue->sync) { + result = anv_execbuf_add_sync(device, &execbuf, + queue->sync, + true /* is_signal */, + 0 /* signal_value */); + if (result != VK_SUCCESS) + goto error; + } + if (cmd_buffer_count) { result = setup_execbuf_for_cmd_buffers(&execbuf, queue, cmd_buffers, @@ -2258,6 +2267,15 @@ anv_queue_exec_locked(struct anv_queue *queue, if (ret) result = vk_queue_set_lost(&queue->vk, "execbuf2 failed: %m"); + if (queue->sync) { + VkResult result = vk_sync_wait(&device->vk, + queue->sync, 0, + VK_SYNC_WAIT_COMPLETE, + UINT64_MAX); + if (result != VK_SUCCESS) + result = vk_queue_set_lost(&queue->vk, "sync wait failed"); + } + struct drm_i915_gem_exec_object2 *objects = execbuf.objects; for (uint32_t k = 0; k < execbuf.bo_count; k++) { if (anv_bo_is_pinned(execbuf.bos[k])) diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index caa463f6958..f2044208de9 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1098,6 +1098,9 @@ struct anv_queue { uint32_t exec_flags; + /** Synchronization object for debug purposes (DEBUG_SYNC) */ + struct vk_sync *sync; + struct intel_ds_queue * ds; }; diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c index 93d835c68cb..ffdd111686d 100644 --- a/src/intel/vulkan/anv_queue.c +++ b/src/intel/vulkan/anv_queue.c @@ -41,6 +41,14 @@ anv_queue_init(struct anv_device *device, struct anv_queue *queue, if (result != VK_SUCCESS) return result; + if (INTEL_DEBUG(DEBUG_SYNC)) { + result = vk_sync_create(&device->vk, + &device->physical->sync_syncobj_type, + 0, 0, &queue->sync); + vk_queue_finish(&queue->vk); + return result; + } + queue->vk.driver_submit = anv_queue_submit; queue->device = device; @@ -58,5 +66,8 @@ anv_queue_init(struct anv_device *device, struct anv_queue *queue, void anv_queue_finish(struct anv_queue *queue) { + if (queue->sync) + vk_sync_destroy(&queue->device->vk, queue->sync); + vk_queue_finish(&queue->vk); }