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