mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	vulkan: Move vulkan_pass handling to filter
The current buffers are directly tracked by vulkan_pass.
This commit is contained in:
		
							parent
							
								
									75daa140f3
								
							
						
					
					
						commit
						f935a191ad
					
				
					 4 changed files with 57 additions and 96 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue