[Mesa-dev] [PATCH v3 2/5] i965: Faking the ETC2 compression on Gen < 8 GPUs using two miptrees.

Nanley Chery nanleychery at gmail.com
Fri Feb 8 19:53:05 UTC 2019


On Fri, Feb 08, 2019 at 12:55:20PM +0200, Eleni Maria Stea wrote:
> Hi Nanley,
> 
> On Thu, 7 Feb 2019 15:46:29 -0800
> Nanley Chery <nanleychery at gmail.com> wrote:
>  >  
> > > @@ -3825,10 +3849,20 @@ intel_miptree_unmap(struct brw_context *brw,
> > >     DBG("%s: mt %p (%s) level %d slice %d\n", __func__,
> > >         mt, _mesa_get_format_name(mt->format), level, slice);
> > >  
> > > +   level_w = minify(mt->surf.phys_level0_sa.width,
> > > +                    level - mt->first_level);
> > > +   level_h = minify(mt->surf.phys_level0_sa.height,
> > > +                    level - mt->first_level);
> > > +
> > >     if (map->unmap)
> > >  	   map->unmap(brw, mt, map, level, slice);
> > >  
> > >     intel_miptree_release_map(mt, level, slice);
> > > +
> > > +   if (intel_miptree_has_etc_shadow(brw, mt) &&
> > > mt->shadow_needs_update) {
> > > +      intel_miptree_update_etc_shadow(brw, mt, level, slice,
> > > level_w,
> > > +                                      level_h);
> > > +   }  
> > 
> > With the next patch applied, the change in this function becomes
> > unnecessary. Is there any reason you're leaving it around?
> 
> After a second thought, I believe that this change wasn't unnecessary.
> There is a problem if we remove it:
> 
> When we generate mipmaps we need to update the shadow for each level.
> As the update is done per level during unmap, if we remove the call we
> end-up with the first level correctly updated but all the others empty.
> 
> An example:
> git clone https://github.com/hikiko/test-compression.git
> make
> ./test compressed/full.tex
> 

That's a nice test :)

> This test loads dumped compressed mipmap levels from the full.tex and
> displays them, if you run it with the per level update inside the unmap
> you will see all the mipmap levels. Without, you will see only the
> first, like here: https://imgur.com/a/VvS0CYC
> 
> Do you have any suggestion on how I could bypass this problem?
> 

Yes. The cause of this problem is that after
intel_miptree_update_etc_shadow_levels() calls
intel_miptree_update_etc_shadow() on the first level, the miptree is
marked as not needing an update. Therefore subsequent calls to
intel_miptree_update_etc_shadow() return early without updating other
levels. One way to fix this is to move the responsibility of marking the
miptree as updated from intel_miptree_update_etc_shadow() to it's
callers.

I also found another bug. I'll add a comment on the problematic patch.

> Thanks again,
> Eleni
> 
> 
> 
> 


More information about the mesa-dev mailing list