[Mesa-dev] [PATCH 6/6] intel/isl: Add a detailed comment about multisampling with HiZ
Jason Ekstrand
jason at jlekstrand.net
Wed Sep 7 20:12:47 UTC 2016
On Sep 7, 2016 12:23 PM, "Chad Versace" <chadversary at chromium.org> wrote:
>
> On Fri 02 Sep 2016, Jason Ekstrand wrote:
> > ---
> > src/intel/isl/isl.c | 60
+++++++++++++++++++++++++++++++++++++++++++++++++++--
> > 1 file changed, 58 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
> > index 33e83b1..cb9eb23 100644
> > --- a/src/intel/isl/isl.c
> > +++ b/src/intel/isl/isl.c
> > @@ -1284,6 +1284,63 @@ isl_surf_get_hiz_surf(const struct isl_device
*dev,
> > assert(surf->msaa_layout == ISL_MSAA_LAYOUT_NONE ||
> > surf->msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED);
> >
> > + /* From the Broadwell PRM Vol. 7, "Hierarchical Depth Buffer":
> > + *
> > + * "The Surface Type, Height, Width, Depth, Minimum Array
Element, Render
> > + * Target View Extent, and Depth Coordinate Offset X/Y of the
> > + * hierarchical depth buffer are inherited from the depth
buffer. The
> > + * height and width of the hierarchical depth buffer that must be
> > + * allocated are computed by the following formulas, where HZ is
the
> > + * hierarchical depth buffer and Z is the depth buffer. The
Z_Height,
> > + * Z_Width, and Z_Depth values given in these formulas are those
present
> > + * in 3DSTATE_DEPTH_BUFFER incremented by one.
> > + *
> > + * "The value of Z_Height and Z_Width must each be multiplied by
2 before
> > + * being applied to the table below if Number of Multisamples is
set to
> > + * NUMSAMPLES_4. The value of Z_Height must be multiplied by 2
and
> > + * Z_Width must be multiplied by 4 before being applied to the
table
> > + * below if Number of Multisamples is set to NUMSAMPLES_8."
> > + *
> > + * In the Sky Lake PRM, the second paragraph is replaced with this:
> > + *
> > + * "The Z_Height and Z_Width values must equal those present in
> > + * 3DSTATE_DEPTH_BUFFER incremented by one."
> > + *
> > + * In other words, on Sandy Bridge through Broadwell, each 128-bit
HiX
>
> Typo s/HiX/HiZ/
>
> > + * block corresponds to a region of 8x4 samples in the primary depth
> > + * surface. On Sky Lake, on the other hand, each HiZ block
corresponds to
> > + * a region of 8x4 pixels in the primary depth surface regarldess
of the
>
> Typo ^^^^^^^^^^
>
> > + * number of samples. The dimensions of a HiZ block in both pixes
and
>
> Typo ^^^^^
>
> > + * samples are given in the table below:
> > + *
> > + * | SNB - BDW | SKL+
> > + * ------------------+-------------
> > + * 1x | 8 x 4 sa | 8 x 4 sa
> > + * MSAA | 8 x 4 px | 8 x 4 px
> > + * ------------------+-------------
> > + * 2x | 8 x 4 sa | 16 x 4 sa
> > + * MSAA | 4 x 4 px | 8 x 4 px
> > + * ------------------+-------------
> > + * 4x | 8 x 4 sa | 16 x 8 sa
> > + * MSAA | 4 x 2 px | 8 x 4 px
> > + * ------------------+-------------
> > + * 8x | 8 x 4 sa | 32 x 8 sa
> > + * MSAA | 2 x 2 px | 8 x 4 px
> > + * ------------------+-------------
> > + * 16x | N/A | 32 x 16 sa
> > + * MSAA | N/A | 8 x 4 px
> > + * ------------------+-------------
>
> THANK YOU THANK YOU THANK YOU.
> You win all the cat gifs [
https://s-media-cache-ak0.pinimg.com/originals/34/71/dc/3471dc5d6443b2af5476ad3dbbca9d7c.jpg
]
Yeah... This stuff has proven surprisingly difficult to reason about. The
table gives us a central spot to write down "the facts" so that future
generations of ISL hackers understand what's going on.
> > + *
> > + * There are a number of different ways that this discrepency could
be
> > + * handled. The way we have chosen is to simply make MSAA HiZ have
the
> > + * same number of samples as the parent surface pre-Sky Lake and
always be
> > + * single-sampled on Sky Lake and above. Since the block sizes of
> > + * compressed formats are given in samples, this neatly handles
everything
> > + * without the need for additional HiZ formats with different block
sizes
> > + * on SKL+.
> > + */
>
> This makes perfect sense.
>
> > + const unsigned samples = ISL_DEV_GEN(dev) >= 9 ? 1 : surf->samples;
> > +
> > isl_surf_init(dev, hiz_surf,
> > .dim = ISL_SURF_DIM_2D,
> > .format = ISL_FORMAT_HIZ,
> > @@ -1292,8 +1349,7 @@ isl_surf_get_hiz_surf(const struct isl_device
*dev,
> > .depth = 1,
> > .levels = surf->levels,
> > .array_len = surf->logical_level0_px.array_len,
> > - /* On SKL+, HiZ is always single-sampled */
> > - .samples = ISL_DEV_GEN(dev) >= 9 ? 1 : surf->samples,
> > + .samples = samples,
> > .usage = ISL_SURF_USAGE_HIZ_BIT,
> > .tiling_flags = ISL_TILING_HIZ_BIT);
> > }
> > --
>
> Reviewed-by: Chad Versace <chadversary at chromium.org>
Thanks. I'll get the convent typos fixed when I get back to my computer.
--Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160907/5a8fb552/attachment.html>
More information about the mesa-dev
mailing list