vulkan: Cache buffer_type

All buffers should have the same type.
This commit is contained in:
columbarius 2024-04-08 02:06:56 +02:00 committed by Wim Taymans
parent f935a191ad
commit 11ff1471e9
2 changed files with 18 additions and 11 deletions

View file

@ -39,7 +39,7 @@
static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *pass) { static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *pass) {
struct vulkan_stream *p = &s->streams[pass->in_stream_id]; struct vulkan_stream *p = &s->streams[pass->in_stream_id];
if (p->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_MemPtr) { if (p->buffer_type == SPA_DATA_MemPtr) {
struct spa_buffer *spa_buf = p->spa_buffers[pass->in_buffer_id]; struct spa_buffer *spa_buf = p->spa_buffers[pass->in_buffer_id];
struct vulkan_write_pixels_info writeInfo = { struct vulkan_write_pixels_info writeInfo = {
.data = spa_buf->datas[0].data, .data = spa_buf->datas[0].data,
@ -59,7 +59,7 @@ static int runImportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *
static int runExportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *pass) { static int runExportSHMBuffers(struct vulkan_blit_state *s, struct vulkan_pass *pass) {
struct vulkan_stream *p = &s->streams[pass->out_stream_id]; struct vulkan_stream *p = &s->streams[pass->out_stream_id];
if (p->spa_buffers[pass->out_buffer_id]->datas[0].type == SPA_DATA_MemPtr) { if (p->buffer_type == SPA_DATA_MemPtr) {
struct spa_buffer *spa_buf = p->spa_buffers[pass->out_buffer_id]; struct spa_buffer *spa_buf = p->spa_buffers[pass->out_buffer_id];
struct vulkan_read_pixels_info readInfo = { struct vulkan_read_pixels_info readInfo = {
.data = spa_buf->datas[0].data, .data = spa_buf->datas[0].data,
@ -82,9 +82,8 @@ static int runImportSync(struct vulkan_blit_state *s, struct vulkan_pass *pass)
struct vulkan_stream *p = &s->streams[i]; struct vulkan_stream *p = &s->streams[i];
uint32_t current_buffer_id = GET_BUFFER_ID_FROM_STREAM(p, pass); uint32_t current_buffer_id = GET_BUFFER_ID_FROM_STREAM(p, pass);
struct vulkan_buffer *current_buffer = &p->buffers[current_buffer_id]; struct vulkan_buffer *current_buffer = &p->buffers[current_buffer_id];
struct spa_buffer *current_spa_buffer = p->spa_buffers[current_buffer_id];
if (current_spa_buffer->datas[0].type != SPA_DATA_DmaBuf) if (p->buffer_type != SPA_DATA_DmaBuf)
continue; continue;
if (vulkan_buffer_import_implicit_syncfd(&s->base, current_buffer) >= 0) if (vulkan_buffer_import_implicit_syncfd(&s->base, current_buffer) >= 0)
@ -102,13 +101,11 @@ static int runExportSync(struct vulkan_blit_state *s, struct vulkan_pass *pass)
int ret = 0; int ret = 0;
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];
uint32_t current_buffer_id = GET_BUFFER_ID_FROM_STREAM(p, pass);
struct spa_buffer *current_spa_buffer = p->spa_buffers[current_buffer_id];
if (current_spa_buffer->datas[0].type != SPA_DATA_DmaBuf) if (p->buffer_type != SPA_DATA_DmaBuf)
continue; continue;
if (!vulkan_sync_export_dmabuf(&s->base, &p->buffers[current_buffer_id], pass->sync_fd)) { if (!vulkan_sync_export_dmabuf(&s->base, &p->buffers[GET_BUFFER_ID_FROM_STREAM(p, pass)], pass->sync_fd)) {
ret = -1; ret = -1;
} }
} }
@ -134,7 +131,7 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas
VkImage src_image = stream_input->buffers[pass->in_buffer_id].image; VkImage src_image = stream_input->buffers[pass->in_buffer_id].image;
VkImage dst_image = stream_output->buffers[pass->out_buffer_id].image; VkImage dst_image = stream_output->buffers[pass->out_buffer_id].image;
if (stream_input->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_MemPtr) { if (stream_input->buffer_type == SPA_DATA_MemPtr) {
vkCmdCopyBufferToImage(s->commandBuffer, s->staging_buffer.buffer, src_image, vkCmdCopyBufferToImage(s->commandBuffer, s->staging_buffer.buffer, src_image,
VK_IMAGE_LAYOUT_GENERAL, 1, &pass->in_copy); VK_IMAGE_LAYOUT_GENERAL, 1, &pass->in_copy);
@ -201,7 +198,7 @@ static int runCommandBuffer(struct vulkan_blit_state *s, struct vulkan_pass *pas
VkAccessFlags access_flags; VkAccessFlags access_flags;
VkAccessFlags release_flags; VkAccessFlags release_flags;
if (p->direction == SPA_DIRECTION_INPUT) { if (p->direction == SPA_DIRECTION_INPUT) {
access_flags = p->spa_buffers[pass->in_buffer_id]->datas[0].type == SPA_DATA_DmaBuf access_flags = p->buffer_type == SPA_DATA_DmaBuf
? VK_ACCESS_TRANSFER_READ_BIT ? VK_ACCESS_TRANSFER_READ_BIT
: VK_ACCESS_TRANSFER_WRITE_BIT; : VK_ACCESS_TRANSFER_WRITE_BIT;
release_flags = VK_ACCESS_TRANSFER_READ_BIT; release_flags = VK_ACCESS_TRANSFER_READ_BIT;
@ -316,6 +313,7 @@ static void clear_buffers(struct vulkan_blit_state *s, struct vulkan_stream *p)
p->spa_buffers[i] = NULL; p->spa_buffers[i] = NULL;
} }
p->n_buffers = 0; p->n_buffers = 0;
p->buffer_type = SPA_DATA_Invalid;
if (p->direction == SPA_DIRECTION_INPUT) { if (p->direction == SPA_DIRECTION_INPUT) {
vulkan_staging_buffer_destroy(&s->base, &s->staging_buffer); vulkan_staging_buffer_destroy(&s->base, &s->staging_buffer);
s->staging_buffer.buffer = VK_NULL_HANDLE; s->staging_buffer.buffer = VK_NULL_HANDLE;
@ -400,6 +398,14 @@ int spa_vulkan_blit_use_buffers(struct vulkan_blit_state *s, struct vulkan_strea
bool alloc = flags & SPA_NODE_BUFFERS_FLAG_ALLOC; bool alloc = flags & SPA_NODE_BUFFERS_FLAG_ALLOC;
int ret; int ret;
for (uint32_t i = 0; i < n_buffers; i++) { for (uint32_t i = 0; i < n_buffers; i++) {
if (p->buffer_type == SPA_DATA_Invalid) {
p->buffer_type = buffers[i]->datas->type;
} else {
if (p->buffer_type != buffers[i]->datas->type) {
spa_log_error(s->log, "Buffers are of different type %d:%d", p->buffer_type, buffers[i]->datas[0].type);
return -1;
}
}
externalBufferInfo.usage = p->direction == SPA_DIRECTION_OUTPUT externalBufferInfo.usage = p->direction == SPA_DIRECTION_OUTPUT
? VK_IMAGE_USAGE_TRANSFER_DST_BIT ? VK_IMAGE_USAGE_TRANSFER_DST_BIT
: VK_IMAGE_USAGE_TRANSFER_SRC_BIT; : VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
@ -436,7 +442,7 @@ int spa_vulkan_blit_use_buffers(struct vulkan_blit_state *s, struct vulkan_strea
p->spa_buffers[i] = buffers[i]; p->spa_buffers[i] = buffers[i];
p->n_buffers++; p->n_buffers++;
} }
if (p->direction == SPA_DIRECTION_INPUT && buffers[0]->datas[0].type == SPA_DATA_MemPtr) { if (p->direction == SPA_DIRECTION_INPUT && p->buffer_type == SPA_DATA_MemPtr) {
ret = vulkan_staging_buffer_create(&s->base, buffers[0]->datas[0].maxsize, &s->staging_buffer); ret = vulkan_staging_buffer_create(&s->base, buffers[0]->datas[0].maxsize, &s->staging_buffer);
if (ret < 0) { if (ret < 0) {
spa_log_error(s->log, "Failed to create staging buffer"); spa_log_error(s->log, "Failed to create staging buffer");

View file

@ -29,6 +29,7 @@ struct vulkan_pass {
struct vulkan_stream { struct vulkan_stream {
enum spa_direction direction; enum spa_direction direction;
enum spa_data_type buffer_type;
struct spa_rectangle dim; struct spa_rectangle dim;
uint32_t bpp; uint32_t bpp;