From cb20cb7b2fcb00f4386912219e692d9443a0a44d Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Wed, 4 Dec 2024 13:28:24 +0100 Subject: [PATCH] panvk: Stop using magic values for the sysval push constant offset/range The sysval base comes from the amount of FAU words we reserve for user push constants, and the range is capped by the sysval struct size. Add macros to express that instead of using magics values. Signed-off-by: Boris Brezillon Reviewed-by: Chia-I Wu Reviewed-by: Mary Guillemard Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c | 14 +++++++------- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 15 +++++++++------ src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c | 3 +-- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 11 ++++++----- src/panfrost/vulkan/panvk_cmd_push_constant.h | 2 +- src/panfrost/vulkan/panvk_shader.h | 3 +++ src/panfrost/vulkan/panvk_vX_blend.c | 2 +- src/panfrost/vulkan/panvk_vX_cmd_push_constant.c | 15 +++++++++++---- .../vulkan/panvk_vX_nir_lower_descriptors.c | 9 ++++++--- src/panfrost/vulkan/panvk_vX_shader.c | 3 ++- 10 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c index a348895e71b..483ce6b33a9 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_dispatch.c @@ -68,8 +68,7 @@ static VkResult prepare_push_uniforms(struct panvk_cmd_buffer *cmdbuf) { cmdbuf->state.compute.push_uniforms = panvk_per_arch( - cmd_prepare_push_uniforms)(cmdbuf, &cmdbuf->state.compute.sysvals, - sizeof(cmdbuf->state.compute.sysvals)); + cmd_prepare_push_uniforms)(cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE); return cmdbuf->state.compute.push_uniforms ? VK_SUCCESS : VK_ERROR_OUT_OF_DEVICE_MEMORY; } @@ -296,7 +295,8 @@ cmd_dispatch(struct panvk_cmd_buffer *cmdbuf, struct panvk_dispatch_info *info) cs_move64_to(b, cs_sr_reg64(b, 0), cs_desc_state->res_table); if (compute_state_dirty(cmdbuf, PUSH_UNIFORMS)) { - uint32_t push_size = 256 + sizeof(struct panvk_compute_sysvals); + uint32_t push_size = + SYSVALS_PUSH_CONST_BASE + sizeof(struct panvk_compute_sysvals); uint64_t fau_count = DIV_ROUND_UP(push_size, 8); mali_ptr fau_ptr = cmdbuf->state.compute.push_uniforms | (fau_count << 56); @@ -336,10 +336,10 @@ cmd_dispatch(struct panvk_cmd_buffer *cmdbuf, struct panvk_dispatch_info *info) cs_move64_to(b, cs_scratch_reg64(b, 0), cmdbuf->state.compute.push_uniforms); cs_wait_slot(b, SB_ID(LS), false); - cs_store( - b, cs_sr_reg_tuple(b, 37, 3), cs_scratch_reg64(b, 0), - BITFIELD_MASK(3), - 256 + offsetof(struct panvk_compute_sysvals, num_work_groups)); + cs_store(b, cs_sr_reg_tuple(b, 37, 3), cs_scratch_reg64(b, 0), + BITFIELD_MASK(3), + SYSVALS_PUSH_CONST_BASE + + offsetof(struct panvk_compute_sysvals, num_work_groups)); cs_wait_slot(b, SB_ID(LS), false); } else { cs_move32_to(b, cs_sr_reg32(b, 37), info->direct.groupCountX); diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index cea1285ffc6..c1699958571 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1334,12 +1334,12 @@ prepare_push_uniforms(struct panvk_cmd_buffer *cmdbuf) if (gfx_state_dirty(cmdbuf, PUSH_UNIFORMS)) { cmdbuf->state.gfx.push_uniforms = panvk_per_arch( - cmd_prepare_push_uniforms)(cmdbuf, &cmdbuf->state.gfx.sysvals, - sizeof(cmdbuf->state.gfx.sysvals)); + cmd_prepare_push_uniforms)(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS); if (!cmdbuf->state.gfx.push_uniforms) return VK_ERROR_OUT_OF_DEVICE_MEMORY; - uint32_t push_size = 256 + sizeof(struct panvk_graphics_sysvals); + uint32_t push_size = + SYSVALS_PUSH_CONST_BASE + sizeof(struct panvk_graphics_sysvals); uint64_t fau_count = DIV_ROUND_UP(push_size, 8); mali_ptr fau_ptr = cmdbuf->state.gfx.push_uniforms | (fau_count << 56); @@ -1932,11 +1932,14 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf, struct cs_index fau_block_addr = cs_scratch_reg64(b, 2); cs_move64_to(b, fau_block_addr, cmdbuf->state.gfx.push_uniforms); cs_store32(b, cs_sr_reg32(b, 36), fau_block_addr, - 256 + offsetof(struct panvk_graphics_sysvals, vs.first_vertex)); + SYSVALS_PUSH_CONST_BASE + + offsetof(struct panvk_graphics_sysvals, vs.first_vertex)); cs_store32(b, cs_sr_reg32(b, 36), fau_block_addr, - 256 + offsetof(struct panvk_graphics_sysvals, vs.base_vertex)); + SYSVALS_PUSH_CONST_BASE + + offsetof(struct panvk_graphics_sysvals, vs.base_vertex)); cs_store32(b, cs_sr_reg32(b, 37), fau_block_addr, - 256 + offsetof(struct panvk_graphics_sysvals, vs.base_instance)); + SYSVALS_PUSH_CONST_BASE + + offsetof(struct panvk_graphics_sysvals, vs.base_instance)); /* Wait for the store using SR-37 as src to finish, so we can overwrite it. */ cs_wait_slot(b, SB_ID(LS), false); diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c index dbb41731bf1..31fac3c4c87 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_dispatch.c @@ -103,8 +103,7 @@ panvk_per_arch(CmdDispatchBase)(VkCommandBuffer commandBuffer, if (compute_state_dirty(cmdbuf, PUSH_UNIFORMS)) { cmdbuf->state.compute.push_uniforms = panvk_per_arch( - cmd_prepare_push_uniforms)(cmdbuf, &cmdbuf->state.compute.sysvals, - sizeof(cmdbuf->state.compute.sysvals)); + cmd_prepare_push_uniforms)(cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE); if (!cmdbuf->state.compute.push_uniforms) return; } diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index c2acfe189b1..76ae716c653 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -368,9 +368,11 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, if (binfo.shader_loads_blend_const) { /* Preload the blend constant if the blend shader depends on it. */ - cfg.preload.uniform_count = MAX2( - cfg.preload.uniform_count, - DIV_ROUND_UP(256 + sizeof(struct panvk_graphics_sysvals), 8)); + cfg.preload.uniform_count = + MAX2(cfg.preload.uniform_count, + DIV_ROUND_UP(SYSVALS_PUSH_CONST_BASE + + sizeof(struct panvk_graphics_sysvals), + 8)); } uint8_t rt_written = fs_info->outputs_written >> FRAG_RESULT_DATA0; @@ -1356,8 +1358,7 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) return; cmdbuf->state.gfx.push_uniforms = panvk_per_arch( - cmd_prepare_push_uniforms)(cmdbuf, &cmdbuf->state.gfx.sysvals, - sizeof(cmdbuf->state.gfx.sysvals)); + cmd_prepare_push_uniforms)(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS); if (!cmdbuf->state.gfx.push_uniforms) return; diff --git a/src/panfrost/vulkan/panvk_cmd_push_constant.h b/src/panfrost/vulkan/panvk_cmd_push_constant.h index d58446c139b..a48ca7cf12c 100644 --- a/src/panfrost/vulkan/panvk_cmd_push_constant.h +++ b/src/panfrost/vulkan/panvk_cmd_push_constant.h @@ -20,6 +20,6 @@ struct panvk_push_constant_state { mali_ptr panvk_per_arch(cmd_prepare_push_uniforms)(struct panvk_cmd_buffer *cmdbuf, - void *sysvals, unsigned sysvals_sz); + VkPipelineBindPoint ptype); #endif diff --git a/src/panfrost/vulkan/panvk_shader.h b/src/panfrost/vulkan/panvk_shader.h index 7ab9a4e9465..9d0689fd7a3 100644 --- a/src/panfrost/vulkan/panvk_shader.h +++ b/src/panfrost/vulkan/panvk_shader.h @@ -14,6 +14,7 @@ #include "pan_desc.h" +#include "panvk_cmd_push_constant.h" #include "panvk_descriptor_set.h" #include "panvk_macros.h" #include "panvk_mempool.h" @@ -90,6 +91,8 @@ struct panvk_compute_sysvals { #endif }; +#define SYSVALS_PUSH_CONST_BASE MAX_PUSH_CONSTANTS_SIZE + #if PAN_ARCH <= 7 enum panvk_bifrost_desc_table_type { PANVK_BIFROST_DESC_TABLE_INVALID = -1, diff --git a/src/panfrost/vulkan/panvk_vX_blend.c b/src/panfrost/vulkan/panvk_vX_blend.c index b0ff828be22..a77916f97c2 100644 --- a/src/panfrost/vulkan/panvk_vX_blend.c +++ b/src/panfrost/vulkan/panvk_vX_blend.c @@ -40,7 +40,7 @@ lower_load_blend_const(nir_builder *b, nir_instr *instr, UNUSED void *data) nir_def *blend_consts = nir_load_push_constant( b, intr->def.num_components, intr->def.bit_size, nir_imm_int(b, 0), /* Push constants are placed first, and then come the sysvals. */ - .base = offset + 256, + .base = offset + SYSVALS_PUSH_CONST_BASE, .range = intr->def.num_components * intr->def.bit_size / 8); nir_def_rewrite_uses(&intr->def, blend_consts); diff --git a/src/panfrost/vulkan/panvk_vX_cmd_push_constant.c b/src/panfrost/vulkan/panvk_vX_cmd_push_constant.c index 7f9e1334867..11bb73f7f26 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_push_constant.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_push_constant.c @@ -9,10 +9,16 @@ mali_ptr panvk_per_arch(cmd_prepare_push_uniforms)(struct panvk_cmd_buffer *cmdbuf, - void *sysvals, unsigned sysvals_sz) + VkPipelineBindPoint ptype) { - struct panfrost_ptr push_uniforms = - panvk_cmd_alloc_dev_mem(cmdbuf, desc, 512, 16); + uint32_t sysvals_sz = ptype == VK_PIPELINE_BIND_POINT_GRAPHICS + ? sizeof(struct panvk_graphics_sysvals) + : sizeof(struct panvk_compute_sysvals); + const void *sysvals = ptype == VK_PIPELINE_BIND_POINT_GRAPHICS + ? (void *)&cmdbuf->state.gfx.sysvals + : (void *)&cmdbuf->state.compute.sysvals; + struct panfrost_ptr push_uniforms = panvk_cmd_alloc_dev_mem( + cmdbuf, desc, SYSVALS_PUSH_CONST_BASE + sysvals_sz, 16); if (push_uniforms.gpu) { /* The first half is used for push constants. */ @@ -20,7 +26,8 @@ panvk_per_arch(cmd_prepare_push_uniforms)(struct panvk_cmd_buffer *cmdbuf, sizeof(cmdbuf->state.push_constants.data)); /* The second half is used for sysvals. */ - memcpy((uint8_t *)push_uniforms.cpu + 256, sysvals, sysvals_sz); + memcpy((uint8_t *)push_uniforms.cpu + SYSVALS_PUSH_CONST_BASE, sysvals, + sysvals_sz); } return push_uniforms.gpu; diff --git a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c index f21c430b13c..c9524bd472f 100644 --- a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c +++ b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c @@ -424,7 +424,10 @@ build_buffer_addr_for_res_index(nir_builder *b, nir_def *res_index, b, nir_iadd(b, array_index, first_desc_index), PANVK_DESCRIPTOR_SIZE); nir_def *base_addr = nir_load_push_constant( - b, 1, 64, base_addr_sysval_offset, .base = 256, .range = 256); + b, 1, 64, base_addr_sysval_offset, .base = SYSVALS_PUSH_CONST_BASE, + .range = b->shader->info.stage == MESA_SHADER_COMPUTE + ? sizeof(struct panvk_compute_sysvals) + : sizeof(struct panvk_graphics_sysvals)); nir_def *desc_addr = nir_iadd(b, base_addr, nir_u2u64(b, desc_offset)); nir_def *desc = nir_load_global(b, desc_addr, PANVK_DESCRIPTOR_SIZE, 4, 32); @@ -559,8 +562,8 @@ load_resource_deref_desc(nir_builder *b, nir_deref_instr *deref, ? offsetof(struct panvk_compute_sysvals, desc.sets[set]) : offsetof(struct panvk_graphics_sysvals, desc.sets[set]); nir_def *set_base_addr = nir_load_push_constant( - b, 1, 64, nir_imm_int(b, 0), .base = 256 + set_base_addr_sysval_offs, - .range = 8); + b, 1, 64, nir_imm_int(b, 0), + .base = SYSVALS_PUSH_CONST_BASE + set_base_addr_sysval_offs, .range = 8); unsigned desc_align = 1 << (ffs(PANVK_DESCRIPTOR_SIZE + desc_offset) - 1); diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index 3596f2c2785..15788b055fe 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -63,7 +63,8 @@ load_sysval_from_push_const(nir_builder *b, unsigned offset, unsigned bit_size, return nir_load_push_constant( b, num_comps, bit_size, nir_imm_int(b, 0), /* Push constants are placed first, and then come the sysvals. */ - .base = offset + 256, .range = num_comps * bit_size / 8); + .base = offset + SYSVALS_PUSH_CONST_BASE, + .range = num_comps * bit_size / 8); } static bool