From 092d78ebf4a8b28a73edc4e389c4e4c9097fa418 Mon Sep 17 00:00:00 2001 From: Christoph Pillmayer Date: Fri, 5 Dec 2025 09:23:31 +0000 Subject: [PATCH] pan/preload: Prepare for reading from single sampled view Reviewed-by: Lars-Ivar Hesselberg Simonsen Part-of: --- src/panfrost/vulkan/panvk_cmd_draw.h | 4 + src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c | 90 +++++++++++++------ 2 files changed, 69 insertions(+), 25 deletions(-) diff --git a/src/panfrost/vulkan/panvk_cmd_draw.h b/src/panfrost/vulkan/panvk_cmd_draw.h index cd6f71d271c..83d7f8b92a1 100644 --- a/src/panfrost/vulkan/panvk_cmd_draw.h +++ b/src/panfrost/vulkan/panvk_cmd_draw.h @@ -49,6 +49,8 @@ struct panvk_rendering_state { enum vk_rp_attachment_flags bound_attachments; struct { struct panvk_image_view *iviews[MAX_RTS]; + /* If non-null, preload_iviews[i] overrides iviews[i] for preloads. */ + struct panvk_image_view *preload_iviews[MAX_RTS]; VkFormat fmts[MAX_RTS]; uint8_t samples[MAX_RTS]; struct panvk_resolve_attachment resolve[MAX_RTS]; @@ -59,6 +61,8 @@ struct panvk_rendering_state { struct { struct panvk_image_view *iview; + /* If non-null, preload_iview overrides iview for preloads. */ + struct panvk_image_view *preload_iview; VkFormat fmt; struct panvk_resolve_attachment resolve; } z_attachment, s_attachment; diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index 6a2ffac4526..3b42101f08d 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -23,6 +23,10 @@ struct panvk_fb_preload_shader_key { struct { nir_alu_type type; } color[8]; + struct { + bool color[8]; + bool z, s; + } read_sample_0; }; static nir_def * @@ -93,8 +97,9 @@ get_preload_nir_shader(const struct panvk_fb_preload_shader_key *key) if (key->color[i].type == nir_type_invalid) continue; - nir_def *texel = texel_fetch(b, key->view_type, key->color[i].type, i, - sample_id, coords); + nir_def *texel = + texel_fetch(b, key->view_type, key->color[i].type, i, + key->read_sample_0.color[i] ? NULL : sample_id, coords); nir_store_output( b, texel, nir_imm_int(b, 0), .base = i, @@ -106,8 +111,9 @@ get_preload_nir_shader(const struct panvk_fb_preload_shader_key *key) } if (key->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { - nir_def *texel = texel_fetch(b, key->view_type, nir_type_float32, 0, - sample_id, coords); + nir_def *texel = + texel_fetch(b, key->view_type, nir_type_float32, 0, + key->read_sample_0.z ? NULL : sample_id, coords); nir_store_output(b, nir_channel(b, texel, 0), nir_imm_int(b, 0), .base = 0, .src_type = nir_type_float32, @@ -117,9 +123,10 @@ get_preload_nir_shader(const struct panvk_fb_preload_shader_key *key) } if (key->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { - nir_def *texel = texel_fetch( - b, key->view_type, nir_type_uint32, - key->aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? 1 : 0, sample_id, coords); + nir_def *texel = + texel_fetch(b, key->view_type, nir_type_uint32, + key->aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? 1 : 0, + key->read_sample_0.s ? NULL : sample_id, coords); nir_store_output(b, nir_channel(b, texel, 0), nir_imm_int(b, 0), .base = 0, .src_type = nir_type_uint32, @@ -224,6 +231,30 @@ get_reg_fmt(nir_alu_type type) } } +static struct panvk_image_view * +get_color_attachment_view(struct panvk_cmd_buffer *cmdbuf, uint32_t i) +{ + return cmdbuf->state.gfx.render.color_attachments.preload_iviews[i] != NULL + ? cmdbuf->state.gfx.render.color_attachments.preload_iviews[i] + : cmdbuf->state.gfx.render.color_attachments.iviews[i]; +} + +static struct panvk_image_view * +get_z_attachment_view(struct panvk_cmd_buffer *cmdbuf) +{ + return cmdbuf->state.gfx.render.z_attachment.preload_iview + ? cmdbuf->state.gfx.render.z_attachment.preload_iview + : cmdbuf->state.gfx.render.z_attachment.iview; +} + +static struct panvk_image_view * +get_s_attachment_view(struct panvk_cmd_buffer *cmdbuf) +{ + return cmdbuf->state.gfx.render.s_attachment.preload_iview + ? cmdbuf->state.gfx.render.s_attachment.preload_iview + : cmdbuf->state.gfx.render.s_attachment.iview; +} + static void fill_textures(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, const struct panvk_fb_preload_shader_key *key, @@ -231,8 +262,7 @@ fill_textures(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, { if (key->aspects == VK_IMAGE_ASPECT_COLOR_BIT) { for (unsigned i = 0; i < fbinfo->rt_count; i++) { - struct panvk_image_view *iview = - cmdbuf->state.gfx.render.color_attachments.iviews[i]; + struct panvk_image_view *iview = get_color_attachment_view(cmdbuf, i); if (iview) textures[i] = iview->descs.tex[0]; @@ -244,9 +274,11 @@ fill_textures(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, uint32_t idx = 0; if (key->aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { - struct panvk_image_view *iview = - cmdbuf->state.gfx.render.z_attachment.iview - ?: cmdbuf->state.gfx.render.s_attachment.iview; + struct panvk_image_view *iview = NULL; + if (cmdbuf->state.gfx.render.z_attachment.iview) + iview = get_z_attachment_view(cmdbuf); + else + iview = get_s_attachment_view(cmdbuf); textures[idx++] = vk_format_has_depth(iview->vk.view_format) ? iview->descs.zs.tex @@ -254,9 +286,11 @@ fill_textures(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo, } if (key->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { - struct panvk_image_view *iview = - cmdbuf->state.gfx.render.s_attachment.iview - ?: cmdbuf->state.gfx.render.z_attachment.iview; + struct panvk_image_view *iview = NULL; + if (cmdbuf->state.gfx.render.s_attachment.iview) + iview = get_s_attachment_view(cmdbuf); + else + iview = get_z_attachment_view(cmdbuf); textures[idx++] = vk_format_has_depth(iview->vk.view_format) ? iview->descs.zs.other_aspect_tex @@ -717,18 +751,23 @@ cmd_preload_zs_attachments(struct panvk_cmd_buffer *cmdbuf, }; if (fbinfo->zs.preload.z) { + struct panvk_image_view *iview = get_z_attachment_view(cmdbuf) + ? get_z_attachment_view(cmdbuf) + : get_s_attachment_view(cmdbuf); + key.aspects = VK_IMAGE_ASPECT_DEPTH_BIT; - key.view_type = - cmdbuf->state.gfx.render.z_attachment.iview - ? cmdbuf->state.gfx.render.z_attachment.iview->vk.view_type - : cmdbuf->state.gfx.render.s_attachment.iview->vk.view_type; + key.view_type = iview->vk.view_type; + key.read_sample_0.z = iview->pview.nr_samples == 1 && key.samples > 1; } if (fbinfo->zs.preload.s) { - VkImageViewType view_type = - cmdbuf->state.gfx.render.s_attachment.iview - ? cmdbuf->state.gfx.render.s_attachment.iview->vk.view_type - : cmdbuf->state.gfx.render.z_attachment.iview->vk.view_type; + struct panvk_image_view *iview = get_s_attachment_view(cmdbuf) + ? get_s_attachment_view(cmdbuf) + : get_z_attachment_view(cmdbuf); + + key.read_sample_0.s = iview->pview.nr_samples == 1 && key.samples > 1; + + VkImageViewType view_type = iview->vk.view_type; key.aspects |= VK_IMAGE_ASPECT_STENCIL_BIT; if (!fbinfo->zs.preload.z) @@ -757,9 +796,10 @@ cmd_preload_color_attachments(struct panvk_cmd_buffer *cmdbuf, continue; enum pipe_format pfmt = fbinfo->rts[i].view->format; - struct panvk_image_view *iview = - cmdbuf->state.gfx.render.color_attachments.iviews[i]; + struct panvk_image_view *iview = get_color_attachment_view(cmdbuf, i); + key.read_sample_0.color[i] = + iview->pview.nr_samples == 1 && key.samples > 1; key.color[i].type = util_format_is_pure_uint(pfmt) ? nir_type_uint32 : util_format_is_pure_sint(pfmt) ? nir_type_int32 : nir_type_float32;