diff options
Diffstat (limited to 'src/isl/isl.c')
-rw-r--r-- | src/isl/isl.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/isl/isl.c b/src/isl/isl.c index fe878f7fb9a..3823a720660 100644 --- a/src/isl/isl.c +++ b/src/isl/isl.c @@ -536,6 +536,25 @@ isl_calc_phys_slice0_extent_sa_gen4_2d( { assert(phys_level0_sa->depth == 1); + if (info->levels == 1) { + /* Do not align single-level surfaces to the image alignment. + * + * For tiled surfaces, skipping the alignment here avoids wasting CPU + * cycles on the below mipmap layout caluclations. Skipping 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 + * 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); + return; + } + uint32_t slice_top_w = 0; uint32_t slice_bottom_w = 0; uint32_t slice_left_h = 0; @@ -626,7 +645,8 @@ isl_calc_phys_slice0_extent_sa_gen4_3d( /** * Calculate the physical extent of the surface's first array slice, in units - * of surface samples. The result is aligned to \a image_align_sa. + * of surface samples. If the surface is multi-leveled, then the result will + * be aligned to \a image_align_sa. */ static void isl_calc_phys_slice0_extent_sa(const struct isl_device *dev, |