From 42bd3b7907e1079001a1d40afec3ec78ed80e60c Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Mon, 21 Apr 2025 11:23:51 +0200 Subject: [PATCH] tu,freedreno: Don't fallback to LINEAR with DRM_FORMAT_MOD_QCOM_COMPRESSED DRM_FORMAT_MOD_QCOM_COMPRESSED forces the image to be UBWC regardless of what's better for perf, we should respect that. The regression is seen in GTK4 when it tries to create tiny swapchain images. Fixes: fc50fb35b0526a10da5e5fe72d4291c5175a9759 ("tu,freedreno: Enable linear mipmap tail for UBWC images") Signed-off-by: Danylo Piliaiev Part-of: (cherry picked from commit 36f22cc951c3249ebe36ab722739317d49e17f84) --- .pick_status.json | 2 +- src/freedreno/fdl/fd6_layout.c | 5 ++++- src/freedreno/fdl/fd_layout_test.c | 2 +- src/freedreno/fdl/freedreno_layout.h | 1 + src/freedreno/vulkan/tu_clear_blit.cc | 1 + src/freedreno/vulkan/tu_image.cc | 3 +++ src/gallium/drivers/freedreno/a6xx/fd6_resource.cc | 4 ++-- 7 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index a9b5893f9cb..1cfff910291 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -254,7 +254,7 @@ "description": "tu,freedreno: Don't fallback to LINEAR with DRM_FORMAT_MOD_QCOM_COMPRESSED", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "fc50fb35b0526a10da5e5fe72d4291c5175a9759", "notes": null diff --git a/src/freedreno/fdl/fd6_layout.c b/src/freedreno/fdl/fd6_layout.c index 5fa1067ff33..f4d6adfcb46 100644 --- a/src/freedreno/fdl/fd6_layout.c +++ b/src/freedreno/fdl/fd6_layout.c @@ -118,6 +118,7 @@ fdl6_layout(struct fdl_layout *layout, const struct fd_dev_info *info, enum pipe_format format, uint32_t nr_samples, uint32_t width0, uint32_t height0, uint32_t depth0, uint32_t mip_levels, uint32_t array_size, bool is_3d, bool is_mutable, + bool force_ubwc, struct fdl_explicit_layout *explicit_layout) { uint32_t offset = 0, heightalign; @@ -149,7 +150,9 @@ fdl6_layout(struct fdl_layout *layout, const struct fd_dev_info *info, if (ubwc_blockwidth == 0) layout->ubwc = false; - if (width0 < FDL_MIN_UBWC_WIDTH) { + assert(!force_ubwc || layout->ubwc); + + if (!force_ubwc && width0 < FDL_MIN_UBWC_WIDTH) { layout->ubwc = false; /* Linear D/S is not supported by HW. */ if (!util_format_is_depth_or_stencil(format)) diff --git a/src/freedreno/fdl/fd_layout_test.c b/src/freedreno/fdl/fd_layout_test.c index a48a81bd517..4f2dca061af 100644 --- a/src/freedreno/fdl/fd_layout_test.c +++ b/src/freedreno/fdl/fd_layout_test.c @@ -34,7 +34,7 @@ fdl_test_layout(const struct testcase *testcase, const struct fd_dev_id *dev_id) MAX2(testcase->layout.nr_samples, 1), testcase->layout.width0, MAX2(testcase->layout.height0, 1), MAX2(testcase->layout.depth0, 1), mip_levels, - MAX2(testcase->array_size, 1), testcase->is_3d, false, NULL); + MAX2(testcase->array_size, 1), testcase->is_3d, false, false, NULL); } else { assert(fd_dev_gen(dev_id) >= 5); fdl5_layout(&layout, testcase->format, diff --git a/src/freedreno/fdl/freedreno_layout.h b/src/freedreno/fdl/freedreno_layout.h index 44c17435216..edc9b05e814 100644 --- a/src/freedreno/fdl/freedreno_layout.h +++ b/src/freedreno/fdl/freedreno_layout.h @@ -241,6 +241,7 @@ bool fdl6_layout(struct fdl_layout *layout, const struct fd_dev_info *info, enum pipe_format format, uint32_t nr_samples, uint32_t width0, uint32_t height0, uint32_t depth0, uint32_t mip_levels, uint32_t array_size, bool is_3d, bool is_mutable, + bool force_ubwc, struct fdl_explicit_layout *plane_layout); static inline void diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 4cd7790fa1d..24de577b56c 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -2933,6 +2933,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, layer_count, extent.depth > 1, false, + false, NULL); struct tu_bo *staging_bo; diff --git a/src/freedreno/vulkan/tu_image.cc b/src/freedreno/vulkan/tu_image.cc index da5e1e520a4..ab66f18fd63 100644 --- a/src/freedreno/vulkan/tu_image.cc +++ b/src/freedreno/vulkan/tu_image.cc @@ -500,9 +500,11 @@ tu_image_update_layout(struct tu_device *device, struct tu_image *image, * but gralloc doesn't know this. So if we are explicitly told that it is * UBWC, then override how the image was created. */ + bool force_ubwc = false; if (modifier == DRM_FORMAT_MOD_QCOM_COMPRESSED) { assert(!image->force_linear_tile); image->ubwc_enabled = true; + force_ubwc = true; } /* R8G8 images have a special tiled layout which we don't implement yet in @@ -548,6 +550,7 @@ tu_image_update_layout(struct tu_device *device, struct tu_image *image, image->vk.array_layers, image->vk.image_type == VK_IMAGE_TYPE_3D, image->is_mutable, + force_ubwc, plane_layouts ? &plane_layout : NULL)) { assert(plane_layouts); /* can only fail with explicit layout */ return vk_error(device, VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc index 39d5332f2af..ce735a974b5 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc @@ -256,7 +256,7 @@ fd6_setup_slices(struct fd_resource *rsc) fdl6_layout(&rsc->layout, screen->info, prsc->format, fd_resource_nr_samples(prsc), prsc->width0, prsc->height0, prsc->depth0, prsc->last_level + 1, - prsc->array_size, prsc->target == PIPE_TEXTURE_3D, false, NULL); + prsc->array_size, prsc->target == PIPE_TEXTURE_3D, false, false, NULL); if (!FD_DBG(NOLRZ) && has_depth(prsc->format) && !is_z32(prsc->format)) setup_lrz(rsc); @@ -282,7 +282,7 @@ fill_ubwc_buffer_sizes(struct fd_resource *rsc) if (!fdl6_layout(&rsc->layout, screen->info, prsc->format, fd_resource_nr_samples(prsc), prsc->width0, prsc->height0, prsc->depth0, - prsc->last_level + 1, prsc->array_size, false, false, &l)) + prsc->last_level + 1, prsc->array_size, false, false, true, &l)) return -1; if (rsc->layout.size > fd_bo_size(rsc->bo))