panvk: Add helpers to save/restore the compute/graphics state for meta operations

Those helpers will be used to save/restore the command buffer
state when calling vk_meta helpers.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29451>
This commit is contained in:
Boris Brezillon
2024-04-29 10:01:26 +02:00
committed by Marge Bot
parent c912f80a08
commit f74dd596d5
3 changed files with 207 additions and 0 deletions
+1
View File
@@ -67,6 +67,7 @@ common_per_arch_files = [
panvk_entrypoints[0],
'panvk_vX_blend.c',
'panvk_vX_buffer_view.c',
'panvk_vX_cmd_meta.c',
'panvk_vX_descriptor_set.c',
'panvk_vX_descriptor_set_layout.c',
'panvk_vX_device.c',
+82
View File
@@ -0,0 +1,82 @@
/*
* Copyright © 2021 Collabora Ltd.
* SPDX-License-Identifier: MIT
*/
#ifndef PANVK_CMD_META_H
#define PANVK_CMD_META_H
#ifndef PAN_ARCH
#error "PAN_ARCH must be defined"
#endif
#include "panvk_cmd_buffer.h"
#include "panvk_cmd_desc_state.h"
#include "panvk_cmd_push_constant.h"
#include "panvk_descriptor_set.h"
struct panvk_shader;
struct panvk_cmd_meta_compute_save_ctx {
struct {
const struct panvk_shader *shader;
struct panvk_shader_desc_state desc;
} cs;
const struct panvk_descriptor_set *set0;
struct {
struct panvk_opaque_desc desc_storage[MAX_PUSH_DESCS];
mali_ptr descs_dev_addr;
uint32_t desc_count;
} push_set0;
struct panvk_push_constant_state push_constants;
};
void panvk_per_arch(cmd_meta_compute_start)(
struct panvk_cmd_buffer *cmdbuf,
struct panvk_cmd_meta_compute_save_ctx *save_ctx);
void panvk_per_arch(cmd_meta_compute_end)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_cmd_meta_compute_save_ctx *save_ctx);
struct panvk_cmd_meta_graphics_save_ctx {
const struct panvk_graphics_pipeline *pipeline;
const struct panvk_descriptor_set *set0;
struct {
struct panvk_opaque_desc desc_storage[MAX_PUSH_DESCS];
mali_ptr descs_dev_addr;
uint32_t desc_count;
} push_set0;
struct panvk_push_constant_state push_constants;
struct vk_vertex_input_state vi;
struct panvk_attrib_buf vb0;
struct {
struct vk_dynamic_graphics_state all;
struct vk_vertex_input_state vi;
struct vk_sample_locations_state sl;
} dyn_state;
struct {
const struct panvk_shader *shader;
struct panvk_shader_desc_state desc;
mali_ptr rsd;
} fs;
struct {
const struct panvk_shader *shader;
struct panvk_shader_desc_state desc;
mali_ptr attribs;
mali_ptr attrib_bufs;
} vs;
};
void panvk_per_arch(cmd_meta_gfx_start)(
struct panvk_cmd_buffer *cmdbuf,
struct panvk_cmd_meta_graphics_save_ctx *save_ctx);
void panvk_per_arch(cmd_meta_gfx_end)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_cmd_meta_graphics_save_ctx *save_ctx);
#endif
+124
View File
@@ -0,0 +1,124 @@
/*
* Copyright © 2021 Collabora Ltd.
* SPDX-License-Identifier: MIT
*/
#include "panvk_cmd_meta.h"
void
panvk_per_arch(cmd_meta_compute_start)(
struct panvk_cmd_buffer *cmdbuf,
struct panvk_cmd_meta_compute_save_ctx *save_ctx)
{
const struct panvk_descriptor_set *set0 =
cmdbuf->state.compute.desc_state.sets[0];
struct panvk_descriptor_set *push_set0 =
cmdbuf->state.compute.desc_state.push_sets[0];
save_ctx->set0 = set0;
if (push_set0 && push_set0 == set0) {
save_ctx->push_set0.desc_count = push_set0->desc_count;
save_ctx->push_set0.descs_dev_addr = push_set0->descs.dev;
memcpy(save_ctx->push_set0.desc_storage, push_set0->descs.host,
push_set0->desc_count * PANVK_DESCRIPTOR_SIZE);
}
save_ctx->push_constants = cmdbuf->state.push_constants;
save_ctx->cs.shader = cmdbuf->state.compute.shader;
save_ctx->cs.desc = cmdbuf->state.compute.cs.desc;
}
void
panvk_per_arch(cmd_meta_compute_end)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_cmd_meta_compute_save_ctx *save_ctx)
{
struct panvk_descriptor_set *push_set0 =
cmdbuf->state.compute.desc_state.push_sets[0];
cmdbuf->state.compute.desc_state.sets[0] = save_ctx->set0;
if (save_ctx->push_set0.desc_count) {
memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage,
save_ctx->push_set0.desc_count * PANVK_DESCRIPTOR_SIZE);
push_set0->descs.dev = save_ctx->push_set0.descs_dev_addr;
push_set0->desc_count = save_ctx->push_set0.desc_count;
}
if (memcmp(cmdbuf->state.push_constants.data, save_ctx->push_constants.data,
sizeof(cmdbuf->state.push_constants.data))) {
cmdbuf->state.push_constants = save_ctx->push_constants;
cmdbuf->state.compute.push_uniforms = 0;
cmdbuf->state.gfx.push_uniforms = 0;
}
cmdbuf->state.compute.shader = save_ctx->cs.shader;
cmdbuf->state.compute.cs.desc = save_ctx->cs.desc;
}
void
panvk_per_arch(cmd_meta_gfx_start)(
struct panvk_cmd_buffer *cmdbuf,
struct panvk_cmd_meta_graphics_save_ctx *save_ctx)
{
const struct panvk_descriptor_set *set0 =
cmdbuf->state.gfx.desc_state.sets[0];
struct panvk_descriptor_set *push_set0 =
cmdbuf->state.gfx.desc_state.push_sets[0];
save_ctx->set0 = set0;
if (push_set0 && push_set0 == set0) {
save_ctx->push_set0.desc_count = push_set0->desc_count;
save_ctx->push_set0.descs_dev_addr = push_set0->descs.dev;
memcpy(save_ctx->push_set0.desc_storage, push_set0->descs.host,
push_set0->desc_count * PANVK_DESCRIPTOR_SIZE);
}
save_ctx->push_constants = cmdbuf->state.push_constants;
save_ctx->fs.shader = cmdbuf->state.gfx.fs.shader;
save_ctx->fs.desc = cmdbuf->state.gfx.fs.desc;
save_ctx->fs.rsd = cmdbuf->state.gfx.fs.rsd;
save_ctx->vs.shader = cmdbuf->state.gfx.vs.shader;
save_ctx->vs.desc = cmdbuf->state.gfx.vs.desc;
save_ctx->vs.attribs = cmdbuf->state.gfx.vs.attribs;
save_ctx->vs.attrib_bufs = cmdbuf->state.gfx.vs.attrib_bufs;
save_ctx->dyn_state.all.vi = &save_ctx->dyn_state.vi;
save_ctx->dyn_state.all.ms.sample_locations = &save_ctx->dyn_state.sl;
vk_dynamic_graphics_state_copy(&save_ctx->dyn_state.all,
&cmdbuf->vk.dynamic_graphics_state);
}
void
panvk_per_arch(cmd_meta_gfx_end)(
struct panvk_cmd_buffer *cmdbuf,
const struct panvk_cmd_meta_graphics_save_ctx *save_ctx)
{
struct panvk_descriptor_set *push_set0 =
cmdbuf->state.gfx.desc_state.push_sets[0];
cmdbuf->state.gfx.desc_state.sets[0] = save_ctx->set0;
if (save_ctx->push_set0.desc_count) {
memcpy(push_set0->descs.host, save_ctx->push_set0.desc_storage,
save_ctx->push_set0.desc_count * PANVK_DESCRIPTOR_SIZE);
push_set0->descs.dev = save_ctx->push_set0.descs_dev_addr;
push_set0->desc_count = save_ctx->push_set0.desc_count;
}
if (memcmp(cmdbuf->state.push_constants.data, save_ctx->push_constants.data,
sizeof(cmdbuf->state.push_constants.data))) {
cmdbuf->state.push_constants = save_ctx->push_constants;
cmdbuf->state.compute.push_uniforms = 0;
cmdbuf->state.gfx.push_uniforms = 0;
}
cmdbuf->state.gfx.fs.shader = save_ctx->fs.shader;
cmdbuf->state.gfx.fs.desc = save_ctx->fs.desc;
cmdbuf->state.gfx.fs.rsd = save_ctx->fs.rsd;
cmdbuf->state.gfx.vs.shader = save_ctx->vs.shader;
cmdbuf->state.gfx.vs.desc = save_ctx->vs.desc;
cmdbuf->state.gfx.vs.attribs = save_ctx->vs.attribs;
cmdbuf->state.gfx.vs.attrib_bufs = save_ctx->vs.attrib_bufs;
vk_dynamic_graphics_state_copy(&cmdbuf->vk.dynamic_graphics_state,
&save_ctx->dyn_state.all);
}