vulkan: Track spa_buffers for stream

This commit is contained in:
columbarius 2023-08-10 02:20:30 +02:00 committed by Wim Taymans
parent 2456d58397
commit eea8096b12
2 changed files with 11 additions and 0 deletions

View file

@ -286,6 +286,7 @@ static int runCommandBuffer(struct vulkan_compute_state *s)
for (i = 0; i < s->n_streams; i++) { for (i = 0; i < s->n_streams; i++) {
struct vulkan_stream *p = &s->streams[i]; struct vulkan_stream *p = &s->streams[i];
struct vulkan_buffer *current_buffer = &p->buffers[p->current_buffer_id]; 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; VkAccessFlags access_flags;
if (p->direction == SPA_DIRECTION_INPUT) { if (p->direction == SPA_DIRECTION_INPUT) {
@ -322,6 +323,9 @@ static int runCommandBuffer(struct vulkan_compute_state *s)
.subresourceRange.layerCount = 1, .subresourceRange.layerCount = 1,
}; };
if (current_spa_buffer->datas[0].type != SPA_DATA_DmaBuf)
continue;
if (vulkan_sync_foreign_dmabuf(&s->base, current_buffer) < 0) { if (vulkan_sync_foreign_dmabuf(&s->base, current_buffer) < 0) {
spa_log_warn(s->log, "Failed to wait for foreign buffer DMA-BUF fence"); spa_log_warn(s->log, "Failed to wait for foreign buffer DMA-BUF fence");
} else { } else {
@ -396,6 +400,10 @@ static int runCommandBuffer(struct vulkan_compute_state *s)
int ret = 1; int ret = 1;
for (uint32_t i = 0; i < s->n_streams; i++) { for (uint32_t i = 0; i < s->n_streams; i++) {
struct vulkan_stream *p = &s->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)) { if (!vulkan_sync_export_dmabuf(&s->base, &p->buffers[p->current_buffer_id], sync_file_fd)) {
ret = 0; 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++) { for (i = 0; i < p->n_buffers; i++) {
vulkan_buffer_clear(&s->base, &p->buffers[i]); vulkan_buffer_clear(&s->base, &p->buffers[i]);
p->spa_buffers[i] = NULL;
} }
p->n_buffers = 0; 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); spa_log_error(s->log, "Failed to use buffer %d", i);
return ret; return ret;
} }
p->spa_buffers[i] = buffers[i];
p->n_buffers++; p->n_buffers++;
} }

View file

@ -42,6 +42,7 @@ struct vulkan_stream {
uint32_t ready_buffer_id; uint32_t ready_buffer_id;
struct vulkan_buffer buffers[MAX_BUFFERS]; struct vulkan_buffer buffers[MAX_BUFFERS];
struct spa_buffer *spa_buffers[MAX_BUFFERS];
uint32_t n_buffers; uint32_t n_buffers;
}; };