diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index f747648538b..4be3ae6f76b 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -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', diff --git a/src/panfrost/vulkan/panvk_cmd_meta.h b/src/panfrost/vulkan/panvk_cmd_meta.h new file mode 100644 index 00000000000..7594f47c1e1 --- /dev/null +++ b/src/panfrost/vulkan/panvk_cmd_meta.h @@ -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 diff --git a/src/panfrost/vulkan/panvk_vX_cmd_meta.c b/src/panfrost/vulkan/panvk_vX_cmd_meta.c new file mode 100644 index 00000000000..bdd35de0c4f --- /dev/null +++ b/src/panfrost/vulkan/panvk_vX_cmd_meta.c @@ -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); +}