From aa78fe7683258133d5062fead4a815a4873b7ba6 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 6 Dec 2024 19:00:18 +0100 Subject: [PATCH] panvk: Pass a cmdbuf to blend_emit_descs() Now that panvk_cmd_buffer.h is accessible from src/panfrost/vulkan/panvk_vX_xxx.c files, there's no reason to pass a gazillon arguments to blend_emit_descs(). We can just pass a cmdbuf and let the helper extract the other parameters from there. It also allows for extra automation, like dirtying the push_uniform buffer when the new blend config reads the blend constant. Signed-off-by: Boris Brezillon Reviewed-by: Chia-I Wu Reviewed-by: Mary Guillemard Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 9 +------- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 12 ++++------- src/panfrost/vulkan/panvk_blend.h | 12 +++-------- src/panfrost/vulkan/panvk_vX_blend.c | 24 ++++++++++++++------- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 58279203d0c..db9be1104da 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -389,17 +389,12 @@ prepare_blend(struct panvk_cmd_buffer *cmdbuf) if (!dirty) return VK_SUCCESS; - struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); const struct vk_dynamic_graphics_state *dyns = &cmdbuf->vk.dynamic_graphics_state; const struct vk_color_blend_state *cb = &dyns->cb; unsigned bd_count = MAX2(cb->attachment_count, 1); struct cs_builder *b = panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER); - const struct panvk_shader *fs = cmdbuf->state.gfx.fs.shader; - const struct pan_shader_info *fs_info = fs ? &fs->info : NULL; - mali_ptr fs_code = panvk_shader_get_dev_addr(fs); - const struct panvk_rendering_state *render = &cmdbuf->state.gfx.render; struct panfrost_ptr ptr = panvk_cmd_alloc_desc_array(cmdbuf, bd_count, BLEND); struct mali_blend_packed *bds = ptr.cpu; @@ -407,9 +402,7 @@ prepare_blend(struct panvk_cmd_buffer *cmdbuf) if (bd_count && !ptr.gpu) return VK_ERROR_OUT_OF_DEVICE_MEMORY; - panvk_per_arch(blend_emit_descs)(dev, dyns, render->color_attachments.fmts, - render->color_attachments.samples, fs_info, - fs_code, bds, &cmdbuf->state.gfx.cb.info); + panvk_per_arch(blend_emit_descs)(cmdbuf, bds); cs_move64_to(b, cs_sr_reg64(b, 50), ptr.gpu | bd_count); return VK_SUCCESS; diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index c09bf6e274b..fbe76dfa649 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -215,7 +215,6 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, return VK_SUCCESS; } - struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); const struct vk_dynamic_graphics_state *dyns = &cmdbuf->vk.dynamic_graphics_state; const struct vk_rasterization_state *rs = &dyns->rs; @@ -236,15 +235,12 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, struct mali_renderer_state_packed *rsd = ptr.cpu; struct mali_blend_packed *bds = ptr.cpu + pan_size(RENDERER_STATE); - struct panvk_blend_info binfo = {0}; + struct panvk_blend_info *binfo = &cmdbuf->state.gfx.cb.info; mali_ptr fs_code = panvk_shader_get_dev_addr(fs); if (fs_info != NULL) { - panvk_per_arch(blend_emit_descs)( - dev, dyns, cmdbuf->state.gfx.render.color_attachments.fmts, - cmdbuf->state.gfx.render.color_attachments.samples, fs_info, fs_code, - bds, &binfo); + panvk_per_arch(blend_emit_descs)(cmdbuf, bds); } else { for (unsigned i = 0; i < bd_count; i++) { pan_pack(&bds[i], BLEND, cfg) { @@ -260,7 +256,7 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, if (fs) { pan_shader_prepare_rsd(fs_info, fs_code, &cfg); - if (binfo.shader_loads_blend_const) { + 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, @@ -274,7 +270,7 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, MESA_VK_RP_ATTACHMENT_ANY_COLOR_BITS; cfg.properties.allow_forward_pixel_to_kill = fs_info->fs.can_fpk && !(rt_mask & ~rt_written) && - !alpha_to_coverage && !binfo.any_dest_read; + !alpha_to_coverage && !binfo->any_dest_read; bool writes_zs = writes_z || writes_s; bool zs_always_passes = ds_test_always_passes(cmdbuf); diff --git a/src/panfrost/vulkan/panvk_blend.h b/src/panfrost/vulkan/panvk_blend.h index 6ecb2cd1f6a..245b4072f03 100644 --- a/src/panfrost/vulkan/panvk_blend.h +++ b/src/panfrost/vulkan/panvk_blend.h @@ -16,9 +16,7 @@ #include "panvk_macros.h" #include "panvk_mempool.h" -struct vk_color_blend_state; -struct vk_dynamic_graphics_state; -struct panvk_device; +struct panvk_cmd_buffer; #ifdef PAN_ARCH @@ -28,12 +26,8 @@ struct panvk_blend_info { bool shader_loads_blend_const; }; -VkResult panvk_per_arch(blend_emit_descs)( - struct panvk_device *dev, const struct vk_dynamic_graphics_state *dy, - const VkFormat *color_attachment_formats, - const uint8_t *color_attachment_samples, - const struct pan_shader_info *fs_info, mali_ptr fs_code, - struct mali_blend_packed *bds, struct panvk_blend_info *blend_info); +VkResult panvk_per_arch(blend_emit_descs)(struct panvk_cmd_buffer *cmdbuf, + struct mali_blend_packed *bds); #endif diff --git a/src/panfrost/vulkan/panvk_vX_blend.c b/src/panfrost/vulkan/panvk_vX_blend.c index 898da86cc38..8db95f9bc0c 100644 --- a/src/panfrost/vulkan/panvk_vX_blend.c +++ b/src/panfrost/vulkan/panvk_vX_blend.c @@ -15,6 +15,7 @@ #include "pan_shader.h" #include "panvk_blend.h" +#include "panvk_cmd_buffer.h" #include "panvk_device.h" #include "panvk_shader.h" @@ -297,16 +298,20 @@ blend_needs_shader(const struct pan_blend_state *state, unsigned rt_idx, } VkResult -panvk_per_arch(blend_emit_descs)(struct panvk_device *dev, - const struct vk_dynamic_graphics_state *dyns, - const VkFormat *color_attachment_formats, - const uint8_t *color_attachment_samples, - const struct pan_shader_info *fs_info, - mali_ptr fs_code, - struct mali_blend_packed *bds, - struct panvk_blend_info *blend_info) +panvk_per_arch(blend_emit_descs)(struct panvk_cmd_buffer *cmdbuf, + struct mali_blend_packed *bds) { + struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); + const struct vk_dynamic_graphics_state *dyns = + &cmdbuf->vk.dynamic_graphics_state; const struct vk_color_blend_state *cb = &dyns->cb; + const struct panvk_shader *fs = cmdbuf->state.gfx.fs.shader; + const struct pan_shader_info *fs_info = fs ? &fs->info : NULL; + mali_ptr fs_code = panvk_shader_get_dev_addr(fs); + const struct panvk_rendering_state *render = &cmdbuf->state.gfx.render; + const VkFormat *color_attachment_formats = render->color_attachments.fmts; + const uint8_t *color_attachment_samples = render->color_attachments.samples; + struct panvk_blend_info *blend_info = &cmdbuf->state.gfx.cb.info; struct pan_blend_state bs = { .alpha_to_one = dyns->ms.alpha_to_one_enable, .logicop_enable = cb->logic_op_enable, @@ -406,5 +411,8 @@ panvk_per_arch(blend_emit_descs)(struct panvk_device *dev, ff_blend_constant, &bds[i]); } + if (blend_info->shader_loads_blend_const) + gfx_state_set_dirty(cmdbuf, PUSH_UNIFORMS); + return VK_SUCCESS; }