summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/common/ac_surface.c3
-rw-r--r--src/amd/common/ac_surface.h3
-rw-r--r--src/amd/vulkan/radv_image.c25
4 files changed, 14 insertions, 19 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 8f328791965..67d7c21919c 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -5629,7 +5629,7 @@
"description": "radv: Fix mipmap extent adjustment on GFX9+.",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": null
},
diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index a2e2ad8a5eb..23cf761a1f8 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -1477,6 +1477,9 @@ static int gfx9_compute_miptree(struct ac_addrlib *addrlib,
}
}
+ surf->u.gfx9.base_mip_width = mip_info[0].pitch;
+ surf->u.gfx9.base_mip_height = mip_info[0].height;
+
if (in->flags.depth) {
assert(in->swizzleMode != ADDR_SW_LINEAR);
diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h
index e11e5a744de..d7476159f70 100644
--- a/src/amd/common/ac_surface.h
+++ b/src/amd/common/ac_surface.h
@@ -165,6 +165,9 @@ struct gfx9_surf_layout {
/* Mipmap level pitch in elements. Only valid for LINEAR. */
uint16_t pitch[RADEON_SURF_MAX_LEVELS];
+ uint16_t base_mip_width;
+ uint16_t base_mip_height;
+
uint64_t stencil_offset; /* separate stencil */
/* Displayable DCC. This is always rb_aligned=0 and pipe_aligned=0.
diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 440fe4939a8..2a1ba933e42 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -1735,26 +1735,15 @@ radv_image_view_init(struct radv_image_view *iview,
*
* This means that mip2 will be missing texels.
*
- * Fix this by calculating the base mip's width and height, then convert that, and round it
- * back up to get the level 0 size.
- * Clamp the converted size between the original values, and next power of two, which
- * means we don't oversize the image.
+ * Fix it by taking the actual extent addrlib assigned to the base mip level.
*/
- if (device->physical_device->rad_info.chip_class >= GFX9 &&
+ if (device->physical_device->rad_info.chip_class >= GFX9 &&
vk_format_is_compressed(image->vk_format) &&
- !vk_format_is_compressed(iview->vk_format)) {
- unsigned lvl_width = radv_minify(image->info.width , range->baseMipLevel);
- unsigned lvl_height = radv_minify(image->info.height, range->baseMipLevel);
-
- lvl_width = round_up_u32(lvl_width * view_bw, img_bw);
- lvl_height = round_up_u32(lvl_height * view_bh, img_bh);
-
- lvl_width <<= range->baseMipLevel;
- lvl_height <<= range->baseMipLevel;
-
- iview->extent.width = CLAMP(lvl_width, iview->extent.width, iview->image->planes[0].surface.u.gfx9.surf_pitch);
- iview->extent.height = CLAMP(lvl_height, iview->extent.height, iview->image->planes[0].surface.u.gfx9.surf_height);
- }
+ !vk_format_is_compressed(iview->vk_format) &&
+ iview->image->info.levels > 1) {
+ iview->extent.width = iview->image->planes[0].surface.u.gfx9.base_mip_width;
+ iview->extent.height = iview->image->planes[0].surface.u.gfx9.base_mip_height;
+ }
}
iview->base_layer = range->baseArrayLayer;