From: Samuel Pitoiset Date: Thu, 22 Jun 2023 07:20:39 +0000 (+0200) Subject: radv/amdgpu: add more small helpers for managing CS X-Git-Tag: upstream/23.3.3~6402 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=82c60b41e92e79a2a878a791c5fa7686b8fb6c47;p=platform%2Fupstream%2Fmesa.git radv/amdgpu: add more small helpers for managing CS Signed-off-by: Samuel Pitoiset Part-of: --- diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index fd4f545..b657c32 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -278,12 +278,20 @@ radv_amdgpu_cs_get_new_ib(struct radeon_cmdbuf *_cs, uint32_t ib_size) return VK_SUCCESS; } +static unsigned +radv_amdgpu_cs_get_initial_size(struct radv_amdgpu_winsys *ws, enum amd_ip_type ip_type) +{ + uint32_t ib_pad_dw_mask = MAX2(3, ws->info.ib_pad_dw_mask[ip_type]); + assert(util_is_power_of_two_nonzero(ib_pad_dw_mask + 1)); + return align(20 * 1024 * 4, ib_pad_dw_mask + 1); +} + static struct radeon_cmdbuf * radv_amdgpu_cs_create(struct radeon_winsys *ws, enum amd_ip_type ip_type, bool is_secondary) { struct radv_amdgpu_cs *cs; - uint32_t ib_pad_dw_mask = MAX2(3, radv_amdgpu_winsys(ws)->info.ib_pad_dw_mask[ip_type]); - uint32_t ib_size = align(20 * 1024 * 4, ib_pad_dw_mask + 1); + uint32_t ib_size = radv_amdgpu_cs_get_initial_size(radv_amdgpu_winsys(ws), ip_type); + cs = calloc(1, sizeof(struct radv_amdgpu_cs)); if (!cs) return NULL; @@ -351,6 +359,13 @@ radv_amdgpu_cs_add_ib_buffer(struct radv_amdgpu_cs *cs) } static void +radv_amdgpu_restore_last_ib(struct radv_amdgpu_cs *cs) +{ + struct radv_amdgpu_ib *ib = &cs->ib_buffers[--cs->num_ib_buffers]; + cs->ib_buffer = ib->bo; +} + +static void radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size) { struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs); @@ -375,7 +390,7 @@ radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size) if (result != VK_SUCCESS) { cs->base.cdw = 0; cs->status = VK_ERROR_OUT_OF_DEVICE_MEMORY; - cs->ib_buffer = cs->ib_buffers[--cs->num_ib_buffers].bo; + radv_amdgpu_restore_last_ib(cs); } cs->ib_mapped = cs->ws->base.buffer_map(cs->ib_buffer); @@ -385,7 +400,7 @@ radv_amdgpu_cs_grow(struct radeon_cmdbuf *_cs, size_t min_size) /* VK_ERROR_MEMORY_MAP_FAILED is not valid for vkEndCommandBuffer. */ cs->status = VK_ERROR_OUT_OF_DEVICE_MEMORY; - cs->ib_buffer = cs->ib_buffers[--cs->num_ib_buffers].bo; + radv_amdgpu_restore_last_ib(cs); } cs->ws->base.cs_add_buffer(&cs->base, cs->ib_buffer); @@ -474,7 +489,7 @@ radv_amdgpu_cs_reset(struct radeon_cmdbuf *_cs) /* When the CS is finalized and IBs are not allowed, use last IB. */ assert(cs->ib_buffer || cs->num_ib_buffers); if (!cs->ib_buffer) - cs->ib_buffer = cs->ib_buffers[--cs->num_ib_buffers].bo; + radv_amdgpu_restore_last_ib(cs); cs->ws->base.cs_add_buffer(&cs->base, cs->ib_buffer);