From dbf730b14df912e0c4987de8ee274529b1fe8288 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 20 Nov 2023 17:09:05 +0100 Subject: [PATCH] radv: add a workaround for mipmaps and minLOD on GFX6-8 This is spurious and it looks like we should be able to uses non-zero base level everytime on GFX6-8 but it doesn't always work. This fixes the remaining CTS failures on GFX6-8. Cc: mesa-stable Signed-off-by: Samuel Pitoiset Part-of: (cherry picked from commit 9698d5f0fda7b64e69f589402f2bd1e92133efc0) --- .pick_status.json | 2 +- .../ci/external/radv-bonaire-aco-fails.txt | 19 ---------------- src/amd/ci/external/radv-kabini-aco-fails.txt | 19 ---------------- .../ci/external/radv-pitcairn-aco-fails.txt | 19 ---------------- src/amd/ci/radv-polaris10-aco-fails.txt | 20 ----------------- src/amd/ci/radv-polaris10-vkd3d.txt | 6 ----- src/amd/vulkan/radv_image_view.c | 22 +++++++++++++------ 7 files changed, 16 insertions(+), 91 deletions(-) delete mode 100644 src/amd/ci/radv-polaris10-vkd3d.txt diff --git a/.pick_status.json b/.pick_status.json index 1c5bbc29eef..0b9bac7e14d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1124,7 +1124,7 @@ "description": "radv: add a workaround for mipmaps and minLOD on GFX6-8", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/ci/external/radv-bonaire-aco-fails.txt b/src/amd/ci/external/radv-bonaire-aco-fails.txt index 7864a790e80..e69de29bb2d 100644 --- a/src/amd/ci/external/radv-bonaire-aco-fails.txt +++ b/src/amd/ci/external/radv-bonaire-aco-fails.txt @@ -1,19 +0,0 @@ -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_nearest,Fail diff --git a/src/amd/ci/external/radv-kabini-aco-fails.txt b/src/amd/ci/external/radv-kabini-aco-fails.txt index e535cb8c795..9470b9065dc 100644 --- a/src/amd/ci/external/radv-kabini-aco-fails.txt +++ b/src/amd/ci/external/radv-kabini-aco-fails.txt @@ -8,25 +8,6 @@ dEQP-VK.api.copy_and_blit.dedicated_allocation.resolve_image.layer_copy_before_r dEQP-VK.api.copy_and_blit.dedicated_allocation.resolve_image.layer_copy_before_resolving.4_bit,Fail dEQP-VK.api.copy_and_blit.dedicated_allocation.resolve_image.layer_copy_before_resolving.8_bit,Fail dEQP-VK.pipeline.monolithic.timestamp.calibrated.calibration_test,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_nearest,Fail dEQP-VK.image.sample_texture.128_bit_compressed_format_two_samplers,Fail dEQP-VK.image.sample_texture.128_bit_compressed_format_two_samplers_cubemap,Fail dEQP-VK.image.sample_texture.64_bit_compressed_format_two_samplers,Fail diff --git a/src/amd/ci/external/radv-pitcairn-aco-fails.txt b/src/amd/ci/external/radv-pitcairn-aco-fails.txt index 7864a790e80..e69de29bb2d 100644 --- a/src/amd/ci/external/radv-pitcairn-aco-fails.txt +++ b/src/amd/ci/external/radv-pitcairn-aco-fails.txt @@ -1,19 +0,0 @@ -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_nearest,Fail diff --git a/src/amd/ci/radv-polaris10-aco-fails.txt b/src/amd/ci/radv-polaris10-aco-fails.txt index c07d22fe8fc..a91278246ec 100644 --- a/src/amd/ci/radv-polaris10-aco-fails.txt +++ b/src/amd/ci/radv-polaris10-aco-fails.txt @@ -1,22 +1,2 @@ -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.2d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.linear_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_linear_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest,Fail -dEQP-VK.texture.mipmap.3d.image_view_min_lod.base_level.nearest_nearest_integer_texel_coord,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.linear_nearest,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_linear,Fail -dEQP-VK.texture.mipmap.cubemap.image_view_min_lod.base_level.nearest_nearest,Fail - # New CTS failures in 1.3.7.0. dEQP-VK.api.version_check.unavailable_entry_points,Fail diff --git a/src/amd/ci/radv-polaris10-vkd3d.txt b/src/amd/ci/radv-polaris10-vkd3d.txt deleted file mode 100644 index 4ac10ef20b0..00000000000 --- a/src/amd/ci/radv-polaris10-vkd3d.txt +++ /dev/null @@ -1,6 +0,0 @@ -test_view_min_lod:4551:Test 20: Test failed: Got 0x00000000, expected 0xffffffff at (0, 0, 0). -test_view_min_lod:4551:Test 22: Test failed: Got 0x00000000, expected 0x0f0f0f0f at (0, 0, 0). -test_view_min_lod:4551:Test 46: Test failed: Got 0x0f0f0f0f, expected 0xffffffff at (0, 0, 0). -test_view_min_lod:4551:Test 47: Test failed: Got 0xffffffff, expected 0x0f0f0f0f at (0, 0, 0). -test_view_min_lod:4551:Test 49: Test failed: Got 0x0f0f0f0f, expected 0xffffffff at (0, 0, 0). -test_view_min_lod:4551:Test 50: Test failed: Got 0xffffffff, expected 0x0f0f0f0f at (0, 0, 0). diff --git a/src/amd/vulkan/radv_image_view.c b/src/amd/vulkan/radv_image_view.c index 16049eb2243..a8e67016ec8 100644 --- a/src/amd/vulkan/radv_image_view.c +++ b/src/amd/vulkan/radv_image_view.c @@ -644,7 +644,7 @@ radv_image_view_make_descriptor(struct radv_image_view *iview, struct radv_devic bool disable_compression, bool enable_compression, unsigned plane_id, unsigned descriptor_plane_id, VkImageCreateFlags img_create_flags, const struct ac_surf_nbc_view *nbc_view, - const VkImageViewSlicedCreateInfoEXT *sliced_3d) + const VkImageViewSlicedCreateInfoEXT *sliced_3d, bool force_zero_base_mip) { struct radv_image *image = iview->image; struct radv_image_plane *plane = &image->planes[plane_id]; @@ -652,7 +652,7 @@ radv_image_view_make_descriptor(struct radv_image_view *iview, struct radv_devic unsigned first_layer = iview->vk.base_array_layer; uint32_t blk_w; union radv_descriptor *descriptor; - uint32_t hw_level = 0; + uint32_t hw_level = iview->vk.base_mip_level; if (is_storage_image) { descriptor = &iview->storage_descriptor; @@ -665,7 +665,6 @@ radv_image_view_make_descriptor(struct radv_image_view *iview, struct radv_devic blk_w = plane->surface.blk_w / vk_format_get_blockwidth(plane->format) * vk_format_get_blockwidth(vk_format); if (device->physical_device->rad_info.gfx_level >= GFX9) { - hw_level = iview->vk.base_mip_level; if (nbc_view->valid) { hw_level = nbc_view->level; iview->extent.width = nbc_view->width; @@ -674,6 +673,9 @@ radv_image_view_make_descriptor(struct radv_image_view *iview, struct radv_devic /* Clear the base array layer because addrlib adds it as part of the base addr offset. */ first_layer = 0; } + } else { + if (force_zero_base_mip) + hw_level = 0; } radv_make_texture_descriptor(device, image, is_storage_image, iview->vk.view_type, vk_format, components, hw_level, @@ -690,7 +692,7 @@ radv_image_view_make_descriptor(struct radv_image_view *iview, struct radv_devic if (is_stencil) base_level_info = &plane->surface.u.legacy.zs.stencil_level[iview->vk.base_mip_level]; else - base_level_info = &plane->surface.u.legacy.level[iview->vk.base_mip_level]; + base_level_info = &plane->surface.u.legacy.level[force_zero_base_mip ? iview->vk.base_mip_level : 0]; } bool enable_write_compression = radv_image_use_dcc_image_stores(device, image); @@ -751,6 +753,12 @@ radv_image_view_init(struct radv_image_view *iview, struct radv_device *device, bool from_client = extra_create_info && extra_create_info->from_client; vk_image_view_init(&device->vk, &iview->vk, !from_client, pCreateInfo); + bool force_zero_base_mip = true; + if (device->physical_device->rad_info.gfx_level <= GFX8 && min_lod) { + /* Do not force the base level to zero to workaround a spurious bug with mipmaps and min LOD. */ + force_zero_base_mip = false; + } + switch (image->vk.image_type) { case VK_IMAGE_TYPE_1D: case VK_IMAGE_TYPE_2D: @@ -799,7 +807,7 @@ radv_image_view_init(struct radv_image_view *iview, struct radv_device *device, plane_count = 1; } - if (device->physical_device->rad_info.gfx_level >= GFX9) { + if (!force_zero_base_mip || device->physical_device->rad_info.gfx_level >= GFX9) { iview->extent = (VkExtent3D){ .width = image->vk.extent.width, .height = image->vk.extent.height, @@ -889,10 +897,10 @@ radv_image_view_init(struct radv_image_view *iview, struct radv_device *device, VkFormat format = vk_format_get_plane_format(iview->vk.view_format, i); radv_image_view_make_descriptor(iview, device, format, &pCreateInfo->components, min_lod, false, disable_compression, enable_compression, iview->plane_id + i, i, img_create_flags, - &iview->nbc_view, NULL); + &iview->nbc_view, NULL, force_zero_base_mip); radv_image_view_make_descriptor(iview, device, format, &pCreateInfo->components, min_lod, true, disable_compression, enable_compression, iview->plane_id + i, i, img_create_flags, - &iview->nbc_view, sliced_3d); + &iview->nbc_view, sliced_3d, force_zero_base_mip); } }