From ca91844fc74e8a8293612162c0ab2f5ba05dd86f Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Wed, 11 Dec 2024 10:47:39 -0500 Subject: [PATCH] freedreno/fdl, tu: Make mutable part of the image layout Right now the image layout depends on the format for the R8G8 special case, but this is clearly wrong if we set the mutable bit because it could be reinterpreted. Refactor how it's set to make it part of the layout struct, rather than specified in the view. Part-of: --- src/freedreno/fdl/fd6_layout.c | 3 ++- src/freedreno/fdl/fd6_view.c | 12 +++++++----- src/freedreno/fdl/fd_layout_test.c | 2 +- src/freedreno/fdl/freedreno_layout.h | 4 ++-- src/freedreno/vulkan/tu_clear_blit.cc | 4 +--- src/freedreno/vulkan/tu_image.cc | 4 ++-- src/freedreno/vulkan/tu_image.h | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_image.cc | 1 - src/gallium/drivers/freedreno/a6xx/fd6_resource.cc | 4 ++-- src/gallium/drivers/freedreno/a6xx/fd6_texture.cc | 1 - 10 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/freedreno/fdl/fd6_layout.c b/src/freedreno/fdl/fd6_layout.c index 906b6c970b5..ab923920daa 100644 --- a/src/freedreno/fdl/fd6_layout.c +++ b/src/freedreno/fdl/fd6_layout.c @@ -116,7 +116,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, + uint32_t array_size, bool is_3d, bool is_mutable, struct fdl_explicit_layout *explicit_layout) { uint32_t offset = 0, heightalign; @@ -135,6 +135,7 @@ fdl6_layout(struct fdl_layout *layout, const struct fd_dev_info *info, layout->format = format; layout->nr_samples = nr_samples; layout->layer_first = !is_3d; + layout->is_mutable = is_mutable; fdl6_get_ubwc_blockwidth(layout, &ubwc_blockwidth, &ubwc_blockheight); diff --git a/src/freedreno/fdl/fd6_view.c b/src/freedreno/fdl/fd6_view.c index 536d9e7f6ef..aeec23745e5 100644 --- a/src/freedreno/fdl/fd6_view.c +++ b/src/freedreno/fdl/fd6_view.c @@ -226,6 +226,8 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, view->format = args->format; memset(view->descriptor, 0, sizeof(view->descriptor)); + + bool is_mutable = layout->is_mutable && tile_mode == TILE6_3; view->descriptor[0] = A6XX_TEX_CONST_0_TILE_MODE(tile_mode) | @@ -237,7 +239,7 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_TEX_CONST_0_MIPLVLS(args->level_count - 1); view->descriptor[1] = A6XX_TEX_CONST_1_WIDTH(width) | A6XX_TEX_CONST_1_HEIGHT(height) | - COND(args->ubwc_fc_mutable, A6XX_TEX_CONST_1_MUTABLEEN); + COND(is_mutable, A6XX_TEX_CONST_1_MUTABLEEN); view->descriptor[2] = A6XX_TEX_CONST_2_PITCHALIGN(layout->pitchalign - 6) | A6XX_TEX_CONST_2_PITCH(pitch) | @@ -325,7 +327,7 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, COND(samples_average, A6XX_SP_PS_2D_SRC_INFO_SAMPLES_AVERAGE) | A6XX_SP_PS_2D_SRC_INFO_UNK20 | A6XX_SP_PS_2D_SRC_INFO_UNK22 | - COND(args->ubwc_fc_mutable, A6XX_SP_PS_2D_SRC_INFO_MUTABLEEN); + COND(is_mutable, A6XX_SP_PS_2D_SRC_INFO_MUTABLEEN); view->SP_PS_2D_SRC_SIZE = A6XX_SP_PS_2D_SRC_SIZE_WIDTH(width) | @@ -406,7 +408,7 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_RB_MRT_BUF_INFO_COLOR_FORMAT(color_format) | COND(args->chip >= A7XX && ubwc_enabled, A7XX_RB_MRT_BUF_INFO_LOSSLESSCOMPEN) | A6XX_RB_MRT_BUF_INFO_COLOR_SWAP(color_swap) | - COND(args->ubwc_fc_mutable, A7XX_RB_MRT_BUF_INFO_MUTABLEEN); + COND(is_mutable, A7XX_RB_MRT_BUF_INFO_MUTABLEEN); view->SP_FS_MRT_REG = A6XX_SP_FS_MRT_REG_COLOR_FORMAT(color_format) | @@ -419,7 +421,7 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_RB_2D_DST_INFO_COLOR_SWAP(color_swap) | COND(ubwc_enabled, A6XX_RB_2D_DST_INFO_FLAGS) | COND(util_format_is_srgb(args->format), A6XX_RB_2D_DST_INFO_SRGB) | - COND(args->ubwc_fc_mutable, A6XX_RB_2D_DST_INFO_MUTABLEEN);; + COND(is_mutable, A6XX_RB_2D_DST_INFO_MUTABLEEN);; view->RB_BLIT_DST_INFO = A6XX_RB_BLIT_DST_INFO_TILE_MODE(tile_mode) | @@ -427,7 +429,7 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_RB_BLIT_DST_INFO_COLOR_FORMAT(blit_format) | A6XX_RB_BLIT_DST_INFO_COLOR_SWAP(color_swap) | COND(ubwc_enabled, A6XX_RB_BLIT_DST_INFO_FLAGS) | - COND(args->ubwc_fc_mutable, A6XX_RB_BLIT_DST_INFO_MUTABLEEN); + COND(is_mutable, A6XX_RB_BLIT_DST_INFO_MUTABLEEN); } void diff --git a/src/freedreno/fdl/fd_layout_test.c b/src/freedreno/fdl/fd_layout_test.c index 33a1ded7046..a48a81bd517 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, NULL); + MAX2(testcase->array_size, 1), testcase->is_3d, 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 d9fe919aa5e..c745ffa0180 100644 --- a/src/freedreno/fdl/freedreno_layout.h +++ b/src/freedreno/fdl/freedreno_layout.h @@ -101,6 +101,7 @@ struct fdl_layout { bool ubwc : 1; bool layer_first : 1; /* see above description */ bool tile_all : 1; + bool is_mutable : 1; /* Note that for tiled textures, beyond a certain mipmap level (ie. * when width is less than block size) things switch to linear. In @@ -239,7 +240,7 @@ void fdl5_layout(struct fdl_layout *layout, enum pipe_format format, 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, + uint32_t array_size, bool is_3d, bool is_mutable, struct fdl_explicit_layout *plane_layout); static inline void @@ -280,7 +281,6 @@ struct fdl_view_args { enum pipe_format format; enum fdl_view_type type; enum fdl_chroma_location chroma_offsets[2]; - bool ubwc_fc_mutable; }; #define FDL6_TEX_CONST_DWORDS 16 diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 890d1e09fec..eb26dc4132d 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -2176,7 +2176,6 @@ tu_image_view_copy_blit(struct fdl6_view *iview, }, .format = tu_format_for_aspect(format, aspect_mask), .type = z_scale ? FDL_VIEW_TYPE_3D : FDL_VIEW_TYPE_2D, - .ubwc_fc_mutable = image->ubwc_fc_mutable, }; fdl6_view_init(iview, &layout, &args, false); } @@ -2912,6 +2911,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, 1, layer_count, extent.depth > 1, + false, NULL); struct tu_bo *staging_bo; @@ -2935,7 +2935,6 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, .swiz = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W }, .format = tu_format_for_aspect(src_format, VK_IMAGE_ASPECT_COLOR_BIT), .type = FDL_VIEW_TYPE_2D, - .ubwc_fc_mutable = false, }; fdl6_view_init(&staging, &staging_layout_ptr, ©_to_args, false); @@ -2966,7 +2965,6 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, .swiz = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W }, .format = tu_format_for_aspect(dst_format, VK_IMAGE_ASPECT_COLOR_BIT), .type = FDL_VIEW_TYPE_2D, - .ubwc_fc_mutable = false, }; fdl6_view_init(&staging, &staging_layout_ptr, ©_from_args, false); diff --git a/src/freedreno/vulkan/tu_image.cc b/src/freedreno/vulkan/tu_image.cc index 8e831914ea6..1f5c0a4f804 100644 --- a/src/freedreno/vulkan/tu_image.cc +++ b/src/freedreno/vulkan/tu_image.cc @@ -255,7 +255,6 @@ tu_image_view_init(struct tu_device *device, args.level_count = vk_image_subresource_level_count(&image->vk, range); args.min_lod_clamp = iview->vk.min_lod; args.format = tu_format_for_aspect(format, aspect_mask); - args.ubwc_fc_mutable = image->ubwc_fc_mutable; vk_component_mapping_to_pipe_swizzle(pCreateInfo->components, args.swiz); if (conversion) { unsigned char conversion_swiz[4], create_swiz[4]; @@ -548,6 +547,7 @@ tu_image_update_layout(struct tu_device *device, struct tu_image *image, image->vk.mip_levels, image->vk.array_layers, image->vk.image_type == VK_IMAGE_TYPE_3D, + image->is_mutable, 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); @@ -730,7 +730,7 @@ tu_image_init(struct tu_device *device, struct tu_image *image, image->force_linear_tile = true; } - image->ubwc_fc_mutable = image->ubwc_enabled && mutable_ubwc_fc; + image->is_mutable = image->ubwc_enabled && mutable_ubwc_fc; } } diff --git a/src/freedreno/vulkan/tu_image.h b/src/freedreno/vulkan/tu_image.h index bb26b77cd6c..78fb8481206 100644 --- a/src/freedreno/vulkan/tu_image.h +++ b/src/freedreno/vulkan/tu_image.h @@ -49,7 +49,7 @@ struct tu_image bool ubwc_enabled; bool force_linear_tile; - bool ubwc_fc_mutable; + bool is_mutable; }; VK_DEFINE_NONDISP_HANDLE_CASTS(tu_image, vk.base, VkImage, VK_OBJECT_TYPE_IMAGE) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_image.cc b/src/gallium/drivers/freedreno/a6xx/fd6_image.cc index 617fcbf4bc1..eab2a60d3e1 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_image.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_image.cc @@ -72,7 +72,6 @@ fd6_image_descriptor(struct fd_context *ctx, const struct pipe_image_view *buf, .type = fdl_type_from_pipe_target(buf->resource->target), .chroma_offsets = {FDL_CHROMA_LOCATION_COSITED_EVEN, FDL_CHROMA_LOCATION_COSITED_EVEN}, - .ubwc_fc_mutable = false, }; /* fdl6_view makes the storage descriptor treat cubes like a 2D array (so diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc index ad686ab04b4..73caf17ff13 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.cc @@ -295,7 +295,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, NULL); + prsc->array_size, prsc->target == PIPE_TEXTURE_3D, false, NULL); return rsc->layout.size; } @@ -318,7 +318,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, &l)) + prsc->last_level + 1, prsc->array_size, false, false, &l)) return -1; if (rsc->layout.size > fd_bo_size(rsc->bo)) diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc b/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc index 80e47fcf54e..e14f1016e94 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_texture.cc @@ -437,7 +437,6 @@ fd6_sampler_view_update(struct fd_context *ctx, .type = fdl_type_from_pipe_target(cso->target), .chroma_offsets = {FDL_CHROMA_LOCATION_COSITED_EVEN, FDL_CHROMA_LOCATION_COSITED_EVEN}, - .ubwc_fc_mutable = false, }; if (rsc->b.b.format == PIPE_FORMAT_R8_G8B8_420_UNORM) {