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 <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
ed55ab17db
commit
aa78fe7683
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user