From f935a191ad23de888a971bacb1fbfe005f37130a Mon Sep 17 00:00:00 2001 From: columbarius Date: Sun, 7 Apr 2024 21:49:25 +0200 Subject: [PATCH] vulkan: Move vulkan_pass handling to filter The current buffers are directly tracked by vulkan_pass. --- spa/plugins/vulkan/vulkan-blit-dsp-filter.c | 13 ++- spa/plugins/vulkan/vulkan-blit-filter.c | 12 +- spa/plugins/vulkan/vulkan-blit-utils.c | 118 ++++++-------------- spa/plugins/vulkan/vulkan-blit-utils.h | 10 +- 4 files changed, 57 insertions(+), 96 deletions(-) diff --git a/spa/plugins/vulkan/vulkan-blit-dsp-filter.c b/spa/plugins/vulkan/vulkan-blit-dsp-filter.c index afe073532..9341c8281 100644 --- a/spa/plugins/vulkan/vulkan-blit-dsp-filter.c +++ b/spa/plugins/vulkan/vulkan-blit-dsp-filter.c @@ -91,6 +91,7 @@ struct impl { pthread_rwlock_t renderlock; struct vulkan_blit_state state; + struct vulkan_pass pass; struct port port[2]; }; @@ -736,18 +737,24 @@ static int impl_node_process(void *object) return -EBUSY; } + spa_vulkan_blit_init_pass(&this->state, &this->pass); + b = &inport->buffers[inio->buffer_id]; - this->state.streams[inport->stream_id].pending_buffer_id = b->id; + this->pass.in_stream_id = SPA_DIRECTION_INPUT; + this->pass.in_buffer_id = b->id; inio->status = SPA_STATUS_NEED_DATA; b = spa_list_first(&outport->empty, struct buffer, link); spa_list_remove(&b->link); SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT); - this->state.streams[outport->stream_id].pending_buffer_id = b->id; + this->pass.out_stream_id = SPA_DIRECTION_OUTPUT; + this->pass.out_buffer_id = b->id; spa_log_debug(this->log, "filter into %d", b->id); - spa_vulkan_blit_process(&this->state); + spa_vulkan_blit_process(&this->state, &this->pass); + spa_vulkan_blit_clear_pass(&this->state, &this->pass); + b->outbuf->datas[0].chunk->offset = 0; b->outbuf->datas[0].chunk->size = b->outbuf->datas[0].maxsize; diff --git a/spa/plugins/vulkan/vulkan-blit-filter.c b/spa/plugins/vulkan/vulkan-blit-filter.c index 7b8bfa395..a7dd8f2b8 100644 --- a/spa/plugins/vulkan/vulkan-blit-filter.c +++ b/spa/plugins/vulkan/vulkan-blit-filter.c @@ -91,6 +91,7 @@ struct impl { pthread_rwlock_t renderlock; struct vulkan_blit_state state; + struct vulkan_pass pass; struct port port[2]; }; @@ -833,18 +834,23 @@ static int impl_node_process(void *object) return -EBUSY; } + spa_vulkan_blit_init_pass(&this->state, &this->pass); + b = &inport->buffers[inio->buffer_id]; - this->state.streams[inport->stream_id].pending_buffer_id = b->id; + this->pass.in_stream_id = SPA_DIRECTION_INPUT; + this->pass.in_buffer_id = b->id; inio->status = SPA_STATUS_NEED_DATA; b = spa_list_first(&outport->empty, struct buffer, link); spa_list_remove(&b->link); SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT); - this->state.streams[outport->stream_id].pending_buffer_id = b->id; + this->pass.out_stream_id = SPA_DIRECTION_OUTPUT; + this->pass.out_buffer_id = b->id; spa_log_debug(this->log, "filter into %d", b->id); - spa_vulkan_blit_process(&this->state); + spa_vulkan_blit_process(&this->state, &this->pass); + spa_vulkan_blit_clear_pass(&this->state, &this->pass); b->outbuf->datas[0].chunk->offset = 0; b->outbuf->datas[0].chunk->size = b->outbuf->datas[0].maxsize; diff --git a/spa/plugins/vulkan/vulkan-blit-utils.c b/spa/plugins/vulkan/vulkan-blit-utils.c index b6640e8dc..27e532753 100644 --- a/spa/plugins/vulkan/vulkan-blit-utils.c +++ b/spa/plugins/vulkan/vulkan-blit-utils.c @@ -36,45 +36,6 @@ #define GET_BUFFER_ID_FROM_STREAM(s, pass) \ (s->direction == SPA_DIRECTION_INPUT ? pass->in_buffer_id : pass->out_buffer_id) -static int updateBuffers(struct vulkan_blit_state *s) -{ - uint32_t i; - - for (i = 0; i < s->n_streams; i++) { - struct vulkan_stream *p = &s->streams[i]; - - if (p->current_buffer_id == p->pending_buffer_id || - p->pending_buffer_id == SPA_ID_INVALID) - continue; - - p->current_buffer_id = p->pending_buffer_id; - p->busy_buffer_id = p->current_buffer_id; - p->pending_buffer_id = SPA_ID_INVALID; - - } - - return 0; -} - -static int updatePass(struct vulkan_blit_state *s, struct vulkan_pass *pass) -{ - uint32_t i; - - for (i = 0; i < s->n_streams; i++) { - struct vulkan_stream *p = &s->streams[i]; - - if (p->direction == SPA_DIRECTION_INPUT) { - pass->in_stream_id = i; - pass->in_buffer_id = p->current_buffer_id; - } else { - pass->out_stream_id = i; - pass->out_buffer_id = p->current_buffer_id; - } - } - - return 0; -} - static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *pass) { struct vulkan_stream *p = &s->streams[pass->in_stream_id]; @@ -537,9 +498,33 @@ static int vulkan_stream_init(struct vulkan_stream *stream, enum spa_direction d { spa_zero(*stream); stream->direction = direction; - stream->current_buffer_id = SPA_ID_INVALID; - stream->busy_buffer_id = SPA_ID_INVALID; - stream->ready_buffer_id = SPA_ID_INVALID; + return 0; +} + +int spa_vulkan_blit_init_pass(struct vulkan_blit_state *s, struct vulkan_pass *pass) +{ + pass->in_buffer_id = SPA_ID_INVALID; + pass->in_stream_id = SPA_ID_INVALID; + pass->out_buffer_id = SPA_ID_INVALID; + pass->out_stream_id = SPA_ID_INVALID; + + pass->sync_fd = -1; + + return 0; +} + +int spa_vulkan_blit_clear_pass(struct vulkan_blit_state *s, struct vulkan_pass *pass) +{ + pass->in_buffer_id = SPA_ID_INVALID; + pass->in_stream_id = SPA_ID_INVALID; + pass->out_buffer_id = SPA_ID_INVALID; + pass->out_stream_id = SPA_ID_INVALID; + + if (pass->sync_fd != -1) { + close(pass->sync_fd); + pass->sync_fd = -1; + } + return 0; } @@ -572,14 +557,6 @@ int spa_vulkan_blit_unprepare(struct vulkan_blit_state *s) int spa_vulkan_blit_start(struct vulkan_blit_state *s) { - uint32_t i; - - for (i = 0; i < s->n_streams; i++) { - struct vulkan_stream *p = &s->streams[i]; - p->current_buffer_id = SPA_ID_INVALID; - p->busy_buffer_id = SPA_ID_INVALID; - p->ready_buffer_id = SPA_ID_INVALID; - } return 0; } @@ -591,32 +568,8 @@ int spa_vulkan_blit_stop(struct vulkan_blit_state *s) return 0; } -int spa_vulkan_blit_ready(struct vulkan_blit_state *s) +int spa_vulkan_blit_process(struct vulkan_blit_state *s, struct vulkan_pass *pass) { - uint32_t i; - VkResult result; - - if (!s->started) - return 0; - - result = vkGetFenceStatus(s->base.device, s->fence); - if (result == VK_NOT_READY) - return -EBUSY; - VK_CHECK_RESULT(result); - - s->started = false; - - for (i = 0; i < s->n_streams; i++) { - struct vulkan_stream *p = &s->streams[i]; - p->ready_buffer_id = p->busy_buffer_id; - p->busy_buffer_id = SPA_ID_INVALID; - } - return 0; -} - -int spa_vulkan_blit_process(struct vulkan_blit_state *s) -{ - struct vulkan_pass pass = {.sync_fd = -1}; if (!s->initialized) { spa_log_warn(s->log, "Renderer not initialized"); return -1; @@ -625,17 +578,14 @@ int spa_vulkan_blit_process(struct vulkan_blit_state *s) spa_log_warn(s->log, "Renderer not prepared"); return -1; } - CHECK(updateBuffers(s)); - CHECK(updatePass(s, &pass)); - CHECK(runImportSync(s, &pass)); - CHECK(runImportSHMBuffers(s, &pass)); - CHECK(runCommandBuffer(s, &pass)); - if (pass.sync_fd != -1) { - runExportSync(s, &pass); - close(pass.sync_fd); + CHECK(runImportSync(s, pass)); + CHECK(runImportSHMBuffers(s, pass)); + CHECK(runCommandBuffer(s, pass)); + if (pass->sync_fd != -1) { + runExportSync(s, pass); } CHECK(vulkan_wait_idle(&s->base)); - CHECK(runExportSHMBuffers(s, &pass)); + CHECK(runExportSHMBuffers(s, pass)); return 0; } diff --git a/spa/plugins/vulkan/vulkan-blit-utils.h b/spa/plugins/vulkan/vulkan-blit-utils.h index a60f7f1e6..90e99ba54 100644 --- a/spa/plugins/vulkan/vulkan-blit-utils.h +++ b/spa/plugins/vulkan/vulkan-blit-utils.h @@ -29,11 +29,6 @@ struct vulkan_pass { struct vulkan_stream { enum spa_direction direction; - uint32_t pending_buffer_id; - uint32_t current_buffer_id; - uint32_t busy_buffer_id; - uint32_t ready_buffer_id; - struct spa_rectangle dim; uint32_t bpp; @@ -64,6 +59,9 @@ struct vulkan_blit_state { struct vulkan_stream streams[MAX_STREAMS]; }; +int spa_vulkan_blit_init_pass(struct vulkan_blit_state *s, struct vulkan_pass *pass); +int spa_vulkan_blit_clear_pass(struct vulkan_blit_state *s, struct vulkan_pass *pass); + int spa_vulkan_blit_init_stream(struct vulkan_blit_state *s, struct vulkan_stream *stream, enum spa_direction, struct spa_dict *props); @@ -83,7 +81,7 @@ int spa_vulkan_blit_unprepare(struct vulkan_blit_state *s); int spa_vulkan_blit_start(struct vulkan_blit_state *s); int spa_vulkan_blit_stop(struct vulkan_blit_state *s); int spa_vulkan_blit_ready(struct vulkan_blit_state *s); -int spa_vulkan_blit_process(struct vulkan_blit_state *s); +int spa_vulkan_blit_process(struct vulkan_blit_state *s, struct vulkan_pass *pass); int spa_vulkan_blit_cleanup(struct vulkan_blit_state *s); int spa_vulkan_blit_get_buffer_caps(struct vulkan_blit_state *s, enum spa_direction direction);