diff --git a/spa/plugins/vulkan/vulkan-compute-utils.c b/spa/plugins/vulkan/vulkan-compute-utils.c index ef5f17cf4..54c7d867a 100644 --- a/spa/plugins/vulkan/vulkan-compute-utils.c +++ b/spa/plugins/vulkan/vulkan-compute-utils.c @@ -286,6 +286,7 @@ static int runCommandBuffer(struct vulkan_compute_state *s) for (i = 0; i < s->n_streams; i++) { struct vulkan_stream *p = &s->streams[i]; struct vulkan_buffer *current_buffer = &p->buffers[p->current_buffer_id]; + struct spa_buffer *current_spa_buffer = p->spa_buffers[p->current_buffer_id]; VkAccessFlags access_flags; if (p->direction == SPA_DIRECTION_INPUT) { @@ -322,6 +323,9 @@ static int runCommandBuffer(struct vulkan_compute_state *s) .subresourceRange.layerCount = 1, }; + if (current_spa_buffer->datas[0].type != SPA_DATA_DmaBuf) + continue; + if (vulkan_sync_foreign_dmabuf(&s->base, current_buffer) < 0) { spa_log_warn(s->log, "Failed to wait for foreign buffer DMA-BUF fence"); } else { @@ -396,6 +400,10 @@ static int runCommandBuffer(struct vulkan_compute_state *s) int ret = 1; for (uint32_t i = 0; i < s->n_streams; i++) { struct vulkan_stream *p = &s->streams[i]; + struct spa_buffer *current_spa_buffer = p->spa_buffers[p->current_buffer_id]; + + if (current_spa_buffer->datas[0].type != SPA_DATA_DmaBuf) + continue; if (!vulkan_sync_export_dmabuf(&s->base, &p->buffers[p->current_buffer_id], sync_file_fd)) { ret = 0; @@ -412,6 +420,7 @@ static void clear_buffers(struct vulkan_compute_state *s, struct vulkan_stream * for (i = 0; i < p->n_buffers; i++) { vulkan_buffer_clear(&s->base, &p->buffers[i]); + p->spa_buffers[i] = NULL; } p->n_buffers = 0; } @@ -499,6 +508,7 @@ int spa_vulkan_use_buffers(struct vulkan_compute_state *s, struct vulkan_stream spa_log_error(s->log, "Failed to use buffer %d", i); return ret; } + p->spa_buffers[i] = buffers[i]; p->n_buffers++; } diff --git a/spa/plugins/vulkan/vulkan-types.h b/spa/plugins/vulkan/vulkan-types.h index bcc8adaed..8fd4be363 100644 --- a/spa/plugins/vulkan/vulkan-types.h +++ b/spa/plugins/vulkan/vulkan-types.h @@ -42,6 +42,7 @@ struct vulkan_stream { uint32_t ready_buffer_id; struct vulkan_buffer buffers[MAX_BUFFERS]; + struct spa_buffer *spa_buffers[MAX_BUFFERS]; uint32_t n_buffers; };