panvk: Cache the fs_required() result

get_fs() (and thus fs_required()) is called enough times during a draw
that it makes sense to cache the value in the graphics state instead of
calling fs_required() repeatedly.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31911>
This commit is contained in:
Boris Brezillon 2024-11-08 18:00:27 +01:00 committed by Marge Bot
parent fd497b2278
commit b9eed7a0d4
3 changed files with 31 additions and 3 deletions

View file

@ -1386,6 +1386,11 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
if (!panvk_priv_mem_dev_addr(vs->spds.pos_points))
return;
/* Needs to be done before get_fs() is called because it depends on
* fs.required being initialized. */
cmdbuf->state.gfx.fs.required =
fs_required(&cmdbuf->state.gfx, &cmdbuf->vk.dynamic_graphics_state);
result = prepare_draw(cmdbuf, draw);
if (result != VK_SUCCESS)
return;
@ -1510,6 +1515,11 @@ panvk_cmd_draw_indirect(struct panvk_cmd_buffer *cmdbuf,
if (!panvk_priv_mem_dev_addr(vs->spds.pos_points))
return;
/* Needs to be done before get_fs() is called because it depends on
* fs.required being initialized. */
cmdbuf->state.gfx.fs.required =
fs_required(&cmdbuf->state.gfx, &cmdbuf->vk.dynamic_graphics_state);
/* Layered indirect draw (VK_EXT_shader_viewport_index_layer) needs
* additional changes. We allow layer_count == 0 because that happens
* when mixing dynamic rendering and secondary command buffers. Once

View file

@ -1187,7 +1187,6 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
{
struct panvk_batch *batch = cmdbuf->cur_batch;
const struct panvk_shader *vs = cmdbuf->state.gfx.vs.shader;
const struct panvk_shader *fs = get_fs(cmdbuf);
struct panvk_shader_desc_state *vs_desc_state = &cmdbuf->state.gfx.vs.desc;
struct panvk_shader_desc_state *fs_desc_state = &cmdbuf->state.gfx.fs.desc;
struct panvk_descriptor_state *desc_state = &cmdbuf->state.gfx.desc_state;
@ -1201,6 +1200,13 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
if (!panvk_priv_mem_dev_addr(vs->rsd))
return;
/* Needs to be done before get_fs() is called because it depends on
* fs.required being initialized. */
cmdbuf->state.gfx.fs.required =
fs_required(&cmdbuf->state.gfx, &cmdbuf->vk.dynamic_graphics_state);
const struct panvk_shader *fs = get_fs(cmdbuf);
/* There are only 16 bits in the descriptor for the job ID. Each job has a
* pilot shader dealing with descriptor copies, and we need one
* <vertex,tiler> pair per draw.

View file

@ -100,6 +100,7 @@ struct panvk_cmd_graphics_state {
struct {
const struct panvk_shader *shader;
struct panvk_shader_desc_state desc;
bool required;
#if PAN_ARCH <= 7
mali_ptr rsd;
#endif
@ -219,9 +220,20 @@ fs_required(const struct panvk_cmd_graphics_state *state,
return (fs_info->fs.writes_depth || fs_info->fs.writes_stencil);
}
static inline bool
cached_fs_required(ASSERTED const struct panvk_cmd_graphics_state *state,
ASSERTED const struct vk_dynamic_graphics_state *dyn_state,
bool cached_value)
{
/* Make sure the cached value was properly initialized. */
assert(fs_required(state, dyn_state) == cached_value);
return cached_value;
}
#define get_fs(__cmdbuf) \
(fs_required(&(__cmdbuf)->state.gfx, \
&(__cmdbuf)->vk.dynamic_graphics_state) \
(cached_fs_required(&(__cmdbuf)->state.gfx, \
&(__cmdbuf)->vk.dynamic_graphics_state, \
(__cmdbuf)->state.gfx.fs.required) \
? (__cmdbuf)->state.gfx.fs.shader \
: NULL)