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:

committed by
Marge Bot

parent
258979d69c
commit
cb20cb7b2f
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user