blorp: Drop multisampled code in blorp_can_hiz_clear_depth
authorNanley Chery <nanley.g.chery@intel.com>
Mon, 6 Dec 2021 01:46:16 +0000 (20:46 -0500)
committerMarge Bot <emma+marge@anholt.net>
Tue, 11 Jan 2022 20:06:02 +0000 (20:06 +0000)
Anv allows non-8x4-aligned depth buffer clears, but it has multisampled
HiZ disabled for BDW. iris allows multisampled HiZ on BDW, but disallows
non-8x4-aligned depth buffer clears.

Drop the unused optimization for non-8x4-aligned clears of multisampled
surfaces on BDW and use this opportunity to use some PRM text in the
code comment.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Acked-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14091>

src/intel/blorp/blorp_clear.c

index d1d9214..8905903 100644 (file)
@@ -904,43 +904,20 @@ blorp_can_hiz_clear_depth(const struct intel_device_info *devinfo,
    assert(devinfo->ver >= 8);
 
    if (devinfo->ver == 8 && surf->format == ISL_FORMAT_R16_UNORM) {
-      /* Apply the D16 alignment restrictions. On BDW, HiZ has an 8x4 sample
-       * block with the following property: as the number of samples increases,
-       * the number of pixels representable by this block decreases by a factor
-       * of the sample dimensions. Sample dimensions scale following the MSAA
-       * interleaved pattern.
+      /* From the BDW PRM, Vol 7, "Depth Buffer Clear":
        *
-       * Sample|Sample|Pixel
-       * Count |Dim   |Dim
-       * ===================
-       *    1  | 1x1  | 8x4
-       *    2  | 2x1  | 4x4
-       *    4  | 2x2  | 4x2
-       *    8  | 4x2  | 2x2
-       *   16  | 4x4  | 2x1
+       *   The following restrictions apply only if the depth buffer surface
+       *   type is D16_UNORM and software does not use the “full surf clear”:
        *
-       * Table: Pixel Dimensions in a HiZ Sample Block Pre-SKL
-       */
-      const struct isl_extent2d sa_block_dim =
-         isl_get_interleaved_msaa_px_size_sa(surf->samples);
-      const uint8_t align_px_w = 8 / sa_block_dim.w;
-      const uint8_t align_px_h = 4 / sa_block_dim.h;
-
-      /* Fast depth clears clear an entire sample block at a time. As a result,
-       * the rectangle must be aligned to the dimensions of the encompassing
-       * pixel block for a successful operation.
+       *   If Number of Multisamples is NUMSAMPLES_1, the rectangle must be
+       *   aligned to an 8x4 pixel block relative to the upper left corner of
+       *   the depth buffer, and contain an integer number of these pixel
+       *   blocks, and all 8x4 pixels must be lit.
        *
-       * Fast clears can still work if the upper-left corner is aligned and the
-       * bottom-rigtht corner touches the edge of a depth buffer whose extent
-       * is unaligned. This is because each miplevel in the depth buffer is
-       * padded by the Pixel Dim (similar to a standard compressed texture).
-       * In this case, the clear rectangle could be padded by to match the full
-       * depth buffer extent but to support multiple clearing techniques, we
-       * chose to be unaware of the depth buffer's extent and thus don't handle
-       * this case.
+       * Alignment requirements for other sample counts are listed, but they
+       * can all be satisfied by the one mentioned above.
        */
-      if (x0 % align_px_w || y0 % align_px_h ||
-          x1 % align_px_w || y1 % align_px_h)
+      if (x0 % 8 || y0 % 4 || x1 % 8 || y1 % 4)
          return false;
    } else if (aux_usage == ISL_AUX_USAGE_HIZ_CCS_WT) {
       /* We have to set the WM_HZ_OP::FullSurfaceDepthandStencilClear bit