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 <boris.brezillon@collabora.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32415>
This commit is contained in:
Boris Brezillon
2024-12-04 13:28:24 +01:00
committed by Marge Bot
parent 258979d69c
commit cb20cb7b2f
10 changed files with 47 additions and 30 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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,

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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