[Mesa-dev] [PATCH 01/30] i965: Mark depth surfaces as needing a HiZ resolve after blitting

Chad Versace chadversary at chromium.org
Fri Jun 2 20:01:54 UTC 2017


On Wed 31 May 2017, Pohjolainen, Topi wrote:
> On Wed, May 31, 2017 at 10:22:09AM -0700, Jason Ekstrand wrote:
> > On Tue, May 30, 2017 at 7:29 AM, Pohjolainen, Topi <
> > topi.pohjolainen at gmail.com> wrote:

> > > > On Fri, May 26, 2017 at 04:30:05PM -0700, Jason Ekstrand wrote:
> > > > > Cc: "17.0 17.1" <mesa-stable at lists.freedesktop.org>
> > > > > ---
> > > > >  src/mesa/drivers/dri/i965/intel_blit.c | 2 ++
> > > > >  1 file changed, 2 insertions(+)
> > > > >
> > > > > diff --git a/src/mesa/drivers/dri/i965/intel_blit.c
> > > b/src/mesa/drivers/dri/i965/intel_blit.c
> > > > > index 2925fc2..b1e1eaa 100644
> > > > > --- a/src/mesa/drivers/dri/i965/intel_blit.c
> > > > > +++ b/src/mesa/drivers/dri/i965/intel_blit.c
> > > > > @@ -329,6 +329,7 @@ intel_miptree_blit(struct brw_context *brw,
> > > > >     intel_miptree_slice_resolve_depth(brw, dst_mt, dst_level,
> > > dst_slice);
> > > > >     intel_miptree_resolve_color(brw, src_mt, src_level, src_slice, 1,
> > > 0);
> > > > >     intel_miptree_resolve_color(brw, dst_mt, dst_level, dst_slice, 1,
> > > 0);
> > > > > +   intel_miptree_slice_set_needs_hiz_resolve(dst_mt, dst_level,
> > > dst_slice);

Something feels wrong. Suppose that, before the blit, the HiZ buffer
contains significant data. Here, we schedule an op to invalidate the HiZ
data. Also, suppose the the below call to emit_miptree_blit() rejects
the blit (maybe because the pitch is too big) and returns false. The
failed blit will likely emit a GL error or, in some cases, i965 will
fallback to to doing the blit with the 3D engine. In either case, there
is a likely bug waiting because the HiZ buffer is scheduled to have its
HiZ data invalidated before its next use, but the HiZ data is still
significant.

The intel_miptree_slice_set_needs_hiz_resolve() needs to happen *after*
the successfull call to emit_miptree_blit().

> > > > >
> > > > >     if (src_flip)
> > > > >        src_y = minify(src_mt->physical_height0, src_level -
> > > src_mt->first_level) - src_y - height;
> > > > > @@ -387,6 +388,7 @@ intel_miptree_copy(struct brw_context *brw,
> > > > >     intel_miptree_slice_resolve_depth(brw, dst_mt, dst_level,
> > > dst_slice);
> > > > >     intel_miptree_resolve_color(brw, src_mt, src_level, src_slice, 1,
> > > 0);
> > > > >     intel_miptree_resolve_color(brw, dst_mt, dst_level, dst_slice, 1,
> > > 0);
> > > > > +   intel_miptree_slice_set_needs_hiz_resolve(dst_mt, dst_level,
> > > dst_slice);

Same problem again.


More information about the mesa-dev mailing list