From 8cc21d3aeaf14e16f2431ff3bdd5fa7c2e780b77 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Mon, 4 Jan 2016 16:31:10 -0800 Subject: isl: Align single-level 2D surfaces to compression block This fixes an assertion failure at isl.c:1003. Reported-by: Nanley Chery --- src/isl/isl.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/isl/isl.c') diff --git a/src/isl/isl.c b/src/isl/isl.c index 00eb249b23f..eee612826ce 100644 --- a/src/isl/isl.c +++ b/src/isl/isl.c @@ -519,24 +519,30 @@ isl_calc_phys_slice0_extent_sa_gen4_2d( const struct isl_extent4d *phys_level0_sa, struct isl_extent2d *phys_slice0_sa) { + const struct isl_format_layout *fmtl = isl_format_get_layout(info->format); + assert(phys_level0_sa->depth == 1); - if (info->levels == 1) { - /* Do not align single-level surfaces to the image alignment. + if (info->levels == 1 && msaa_layout != ISL_MSAA_LAYOUT_INTERLEAVED) { + /* Do not pad the surface to the image alignment. Instead, pad it only + * to the pixel format's block alignment. * - * For tiled surfaces, skipping the alignment here avoids wasting CPU - * cycles on the below mipmap layout caluclations. Skipping the + * For tiled surfaces, using a reduced alignment here avoids wasting CPU + * cycles on the below mipmap layout caluclations. Reducing the * alignment here is safe because we later align the row pitch and array * pitch to the tile boundary. It is safe even for * ISL_MSAA_LAYOUT_INTERLEAVED, because phys_level0_sa is already scaled * to accomodate the interleaved samples. * - * For linear surfaces, skipping the alignment here permits us to later + * For linear surfaces, reducing the alignment here permits us to later * choose an arbitrary, non-aligned row pitch. If the surface backs * a VkBuffer, then an arbitrary pitch may be needed to accomodate * VkBufferImageCopy::bufferRowLength. */ - *phys_slice0_sa = isl_extent2d(phys_level0_sa->w, phys_level0_sa->h); + *phys_slice0_sa = (struct isl_extent2d) { + .w = isl_align_npot(phys_level0_sa->w, fmtl->bw), + .h = isl_align_npot(phys_level0_sa->h, fmtl->bh), + }; return; } -- cgit v1.2.3