From 1420d196f7a8b45769e4f0172bab37f01ec8fc9f Mon Sep 17 00:00:00 2001 From: Rajnesh Kanwal Date: Wed, 21 Sep 2022 16:45:13 +0100 Subject: [PATCH] pvr: Add support for PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED stream. This adds support for PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED type control stream. The main difference is that this is backed by host memory. This is mainly needed for secondary command buffers allocated with VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT. In this case we need to copy secondary command buffer's control stream over to primary stream in vkCmdExecuteCommands. Signed-off-by: Rajnesh Kanwal Reviewed-by: Karmjit Mahil Part-of: --- src/imagination/vulkan/pvr_csb.c | 33 ++++++++++++++++++++++++++------ src/imagination/vulkan/pvr_csb.h | 4 ++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/imagination/vulkan/pvr_csb.c b/src/imagination/vulkan/pvr_csb.c index 9c05f22f781..e6d09418033 100644 --- a/src/imagination/vulkan/pvr_csb.c +++ b/src/imagination/vulkan/pvr_csb.c @@ -82,7 +82,11 @@ void pvr_csb_init(struct pvr_device *device, csb->device = device; csb->stream_type = stream_type; csb->status = VK_SUCCESS; - list_inithead(&csb->pvr_bo_list); + + if (stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED) + util_dynarray_init(&csb->deferred_cs_mem, NULL); + else + list_inithead(&csb->pvr_bo_list); } /** @@ -94,9 +98,13 @@ void pvr_csb_init(struct pvr_device *device, */ void pvr_csb_finish(struct pvr_csb *csb) { - list_for_each_entry_safe (struct pvr_bo, pvr_bo, &csb->pvr_bo_list, link) { - list_del(&pvr_bo->link); - pvr_bo_free(csb->device, pvr_bo); + if (csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED) { + util_dynarray_fini(&csb->deferred_cs_mem); + } else { + list_for_each_entry_safe (struct pvr_bo, pvr_bo, &csb->pvr_bo_list, link) { + list_del(&pvr_bo->link); + pvr_bo_free(csb->device, pvr_bo); + } } /* Leave the csb in a reset state to catch use after destroy instances */ @@ -185,17 +193,26 @@ static bool pvr_csb_buffer_extend(struct pvr_csb *csb) void *pvr_csb_alloc_dwords(struct pvr_csb *csb, uint32_t num_dwords) { const uint32_t required_space = num_dwords * 4; + void *p; if (csb->status != VK_SUCCESS) return NULL; + if (csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED) { + p = util_dynarray_grow_bytes(&csb->deferred_cs_mem, 1, required_space); + if (!p) + csb->status = vk_error(csb->device, VK_ERROR_OUT_OF_HOST_MEMORY); + + return p; + } + if (csb->next + required_space > csb->end) { bool ret = pvr_csb_buffer_extend(csb); if (!ret) return NULL; } - void *p = csb->next; + p = csb->next; csb->next += required_space; assert(csb->next <= csb->end); @@ -214,6 +231,9 @@ void *pvr_csb_alloc_dwords(struct pvr_csb *csb, uint32_t num_dwords) */ void pvr_csb_emit_link(struct pvr_csb *csb, pvr_dev_addr_t addr, bool ret) { + /* Not supported for deferred control stream. */ + assert(csb->stream_type != PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED); + /* Stream return is only supported for graphics control stream. */ assert(!ret || csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS); @@ -258,7 +278,8 @@ void pvr_csb_emit_link(struct pvr_csb *csb, pvr_dev_addr_t addr, bool ret) VkResult pvr_csb_emit_return(struct pvr_csb *csb) { /* STREAM_RETURN is only supported by graphics control stream. */ - assert(csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS); + assert(csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS || + csb->stream_type == PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED); /* clang-format off */ pvr_csb_emit(csb, VDMCTRL_STREAM_RETURN, ret); diff --git a/src/imagination/vulkan/pvr_csb.h b/src/imagination/vulkan/pvr_csb.h index 3695f23306b..30c7ffa6889 100644 --- a/src/imagination/vulkan/pvr_csb.h +++ b/src/imagination/vulkan/pvr_csb.h @@ -40,6 +40,7 @@ #include "pvr_winsys.h" #include "util/list.h" #include "util/macros.h" +#include "util/u_dynarray.h" #define __pvr_address_type pvr_dev_addr_t #define __pvr_get_address(pvr_dev_addr) (pvr_dev_addr).addr @@ -54,6 +55,7 @@ struct pvr_device; enum pvr_cmd_stream_type { PVR_CMD_STREAM_TYPE_INVALID = 0, /* explicitly treat 0 as invalid */ PVR_CMD_STREAM_TYPE_GRAPHICS, + PVR_CMD_STREAM_TYPE_GRAPHICS_DEFERRED, PVR_CMD_STREAM_TYPE_COMPUTE, }; @@ -71,6 +73,8 @@ struct pvr_csb { /* List of csb buffer objects */ struct list_head pvr_bo_list; + struct util_dynarray deferred_cs_mem; + enum pvr_cmd_stream_type stream_type; /* Current error status of the command buffer. Used to track inconsistent