vulkan: Move vulkan_pass handling to filter

The current buffers are directly tracked by vulkan_pass.
This commit is contained in:
columbarius 2024-04-07 21:49:25 +02:00 committed by Wim Taymans
parent 75daa140f3
commit f935a191ad
4 changed files with 57 additions and 96 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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);