<p dir="ltr"></p>
<p dir="ltr">On Sep 8, 2016 10:47 PM, "Pohjolainen, Topi" <<a href="mailto:topi.pohjolainen@gmail.com">topi.pohjolainen@gmail.com</a>> wrote:<br>
><br>
> On Thu, Sep 08, 2016 at 10:58:09AM -0700, Jason Ekstrand wrote:<br>
> >    On Wed, Sep 7, 2016 at 1:16 PM, Jason Ekstrand<br>
> >    <[1]<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> ><br>
> >    On Sep 7, 2016 10:45 AM, "Nanley Chery" <[2]<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a>><br>
> >    wrote:<br>
> >    ><br>
> >    > On Wed, Sep 07, 2016 at 10:26:25AM -0700, Jason Ekstrand wrote:<br>
> >    > > On Wed, Sep 7, 2016 at 9:50 AM, Jason Ekstrand<br>
> >    <[3]<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> >    > ><br>
> >    > > > On Wed, Sep 7, 2016 at 9:36 AM, Nanley Chery<br>
> >    <[4]<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a>><br>
> >    > > > wrote:<br>
> >    > > ><br>
> >    > > >> On Tue, Sep 06, 2016 at 05:02:55PM -0700, Jason Ekstrand wrote:<br>
> >    > > >> > On Tue, Sep 6, 2016 at 4:12 PM, Nanley Chery<br>
> >    <[5]<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a>><br>
> >    > > >> wrote:<br>
> >    > > >> ><br>
> >    > > >> > > On Wed, Aug 31, 2016 at 02:22:33PM -0700, Jason Ekstrand<br>
> >    wrote:<br>
> >    > > >> > > > ---<br>
> >    > > >> > > >  src/intel/blorp/blorp.h      |  10 ++++<br>
> >    > > >> > > >  src/intel/blorp/blorp_blit.c | 133<br>
> >    ++++++++++++++++++++++++++++++<br>
> >    > > >> > > +++++++++++++<br>
> >    > > >> > > >  2 files changed, 143 insertions(+)<br>
> >    > > >> > > ><br>
> >    > > >> > > > diff --git a/src/intel/blorp/blorp.h<br>
> >    b/src/intel/blorp/blorp.h<br>
> >    > > >> > > > index c1e93fd..6574124 100644<br>
> >    > > >> > > > --- a/src/intel/blorp/blorp.h<br>
> >    > > >> > > > +++ b/src/intel/blorp/blorp.h<br>
> >    > > >> > > > @@ -109,6 +109,16 @@ blorp_blit(struct blorp_batch *batch,<br>
> >    > > >> > > >             uint32_t filter, bool mirror_x, bool<br>
> >    mirror_y);<br>
> >    > > >> > > ><br>
> >    > > >> > > >  void<br>
> >    > > >> > > > +blorp_copy(struct blorp_batch *batch,<br>
> >    > > >> > > > +           const struct blorp_surf *src_surf,<br>
> >    > > >> > > > +           unsigned src_level, unsigned src_layer,<br>
> >    > > >> > > > +           const struct blorp_surf *dst_surf,<br>
> >    > > >> > > > +           unsigned dst_level, unsigned dst_layer,<br>
> >    > > >> > > > +           uint32_t src_x, uint32_t src_y,<br>
> >    > > >> > > > +           uint32_t dst_x, uint32_t dst_y,<br>
> >    > > >> > > > +           uint32_t src_width, uint32_t src_height);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +void<br>
> >    > > >> > > >  blorp_fast_clear(struct blorp_batch *batch,<br>
> >    > > >> > > >                   const struct blorp_surf *surf,<br>
> >    > > >> > > >                   uint32_t level, uint32_t layer, enum<br>
> >    isl_format<br>
> >    > > >> format,<br>
> >    > > >> > > > diff --git a/src/intel/blorp/blorp_blit.c<br>
> >    > > >> b/src/intel/blorp/blorp_blit.c<br>
> >    > > >> > > > index 3ab39a3..42a502c 100644<br>
> >    > > >> > > > --- a/src/intel/blorp/blorp_blit.c<br>
> >    > > >> > > > +++ b/src/intel/blorp/blorp_blit.c<br>
> >    > > >> > > > @@ -1685,3 +1685,136 @@ blorp_blit(struct blorp_batch<br>
> >    *batch,<br>
> >    > > >> > > >                   dst_x0, dst_y0, dst_x1, dst_y1,<br>
> >    > > >> > > >                   mirror_x, mirror_y);<br>
> >    > > >> > > >  }<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +static enum isl_format<br>
> >    > > >> > > > +get_copy_format_for_bpb(unsigned bpb)<br>
> >    > > >> > > > +{<br>
> >    > > >> > > > +   /* The choice of UNORM and UINT formats is very<br>
> >    intentional<br>
> >    > > >> here.<br>
> >    > > >> > > Most of<br>
> >    > > >> > > > +    * the time, we want to use a UINT format to avoid any<br>
> >    rounding<br>
> >    > > >> > > error in<br>
> >    > > >> > > > +    * the blit.  For stencil blits, R8_UINT is required<br>
> >    by the<br>
> >    > > >> hardware.<br>
> >    > > >> > > > +    * (It's the only format allowed in conjunction with<br>
> >    W-tiling.)<br>
> >    > > >> > > Also we<br>
> >    > > >> > > > +    * intentionally use the 4-channel formats whenever we<br>
> >    can.<br>
> >    > > >> This is<br>
> >    > > >> > > so<br>
> >    > > >> > > > +    * that, when we do a RGB <-> RGBX copy, the two<br>
> >    formats will<br>
> >    > > >> line<br>
> >    > > >> > > up even<br>
> >    > > >> > > > +    * though one of them is 3/4 the size of the other.<br>
> >    The choice<br>
> >    > > >> of<br>
> >    > > >> > > UNORM<br>
> >    > > >> > > > +    * vs. UINT is also very intentional because Haswell<br>
> >    doesn't<br>
> >    > > >> handle<br>
> >    > > >> > > 8 or<br>
> >    > > >> > > > +    * 16-bit RGB UINT formats at all so we have to use<br>
> >    UNORM there.<br>
> >    > > >> > > > +    * Fortunately, the only time we should ever use two<br>
> >    different<br>
> >    > > >> > > formats in<br>
> >    > > >> > > > +    * the table below is for RGB -> RGBA blits and so we<br>
> >    will never<br>
> >    > > >> > > have any<br>
> >    > > >> > > > +    * UNORM/UINT mismatch.<br>
> >    > > >> > > > +    */<br>
> >    > > >> > > > +   switch (bpb) {<br>
> >    > > >> > > > +   case 8:  return ISL_FORMAT_R8_UINT;<br>
> >    > > >> > > > +   case 16: return ISL_FORMAT_R8G8_UINT;<br>
> >    > > >> > > > +   case 24: return ISL_FORMAT_R8G8B8_UNORM;<br>
> >    > > >> > > > +   case 32: return ISL_FORMAT_R8G8B8A8_UNORM;<br>
> >    > > >> > > > +   case 48: return ISL_FORMAT_R16G16B16_UNORM;<br>
> >    > > >> > > > +   case 64: return ISL_FORMAT_R16G16B16A16_UNORM;<br>
> >    > > >> > > > +   case 96: return ISL_FORMAT_R32G32B32_UINT;<br>
> >    > > >> > > > +   case 128:return ISL_FORMAT_R32G32B32A32_UINT;<br>
> >    > > >> > > > +   default:<br>
> >    > > >> > > > +      unreachable("Unknown format bpb");<br>
> >    > > >> > > > +   }<br>
> >    > > >> > > > +}<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +static void<br>
> >    > > >> > > > +surf_convert_to_uncompressed(const struct isl_device<br>
> >    *isl_dev,<br>
> >    > > >> > > > +                             struct<br>
> >    brw_blorp_surface_info *info,<br>
> >    > > >> > > > +                             uint32_t *x, uint32_t *y,<br>
> >    > > >> > > > +                             uint32_t *width, uint32_t<br>
> >    *height)<br>
> >    > > >> > > > +{<br>
> >    > > >> > > > +   const struct isl_format_layout *fmtl =<br>
> >    > > >> > > > +      isl_format_get_layout(info->surf.format);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   assert(fmtl->bw > 1 || fmtl->bh > 1);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   /* This is a compressed surface.  We need to convert<br>
> >    it to a<br>
> >    > > >> single<br>
> >    > > >> > > > +    * slice (becase compressed layouts don't perfectly<br>
> >    match<br>
> >    > > >> > > uncompressed<br>
> >    > > >> > > > +    * ones with the same bpb) and divide x, y, width, and<br>
> >    height<br>
> >    > > >> by the<br>
> >    > > >> > > > +    * block size.<br>
> >    > > >> > > > +    */<br>
> >    > > >> > > > +   surf_convert_to_single_slice(isl_dev, info);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   if (width || height) {<br>
> >    > > >> > > > +      assert(*width % fmtl->bw == 0 ||<br>
> >    > > >> > > > +             *x + *width == info->surf.logical_level0_px.<br>
> >    width);<br>
> >    > > >> > > > +      assert(*height % fmtl->bh == 0 ||<br>
> >    > > >> > > > +             *y + *height ==<br>
> >    info->surf.logical_level0_px.height);<br>
> >    > > >> > > > +      *width = DIV_ROUND_UP(*width, fmtl->bw);<br>
> >    > > >> > > > +      *height = DIV_ROUND_UP(*height, fmtl->bh);<br>
> >    > > >> > > > +   }<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   assert(*x % fmtl->bw == 0);<br>
> >    > > >> > > > +   assert(*y % fmtl->bh == 0);<br>
> >    > > >> > > > +   *x /= fmtl->bw;<br>
> >    > > >> > > > +   *y /= fmtl->bh;<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   info->surf.logical_level0_px.width =<br>
> >    > > >> > > > +      DIV_ROUND_UP(info->surf.logical_level0_px.width,<br>
> >    fmtl->bw);<br>
> >    > > >> > > > +   info->surf.logical_level0_px.height =<br>
> >    > > >> > > > +      DIV_ROUND_UP(info->surf.logical_level0_px.height,<br>
> >    fmtl->bh);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   assert(info->surf.phys_level0_sa.width % fmtl->bw ==<br>
> >    0);<br>
> >    > > >> > > > +   assert(info->surf.phys_level0_sa.height % fmtl->bh ==<br>
> >    0);<br>
> >    > > >> > > > +   info->surf.phys_level0_sa.width /= fmtl->bw;<br>
> >    > > >> > > > +   info->surf.phys_level0_sa.height /= fmtl->bh;<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   assert(info->tile_x_sa % fmtl->bw == 0);<br>
> >    > > >> > > > +   assert(info->tile_y_sa % fmtl->bh == 0);<br>
> >    > > >> > > > +   info->tile_x_sa /= fmtl->bw;<br>
> >    > > >> > > > +   info->tile_y_sa /= fmtl->bh;<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   /* It's now an uncompressed surface so we need an<br>
> >    uncompressed<br>
> >    > > >> > > format */<br>
> >    > > >> > > > +   info->surf.format = get_copy_format_for_bpb(fmtl-><br>
> >    bpb);<br>
> >    > > >> > > > +}<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +void<br>
> >    > > >> > > > +blorp_copy(struct blorp_batch *batch,<br>
> >    > > >> > > > +           const struct blorp_surf *src_surf,<br>
> >    > > >> > > > +           unsigned src_level, unsigned src_layer,<br>
> >    > > >> > > > +           const struct blorp_surf *dst_surf,<br>
> >    > > >> > > > +           unsigned dst_level, unsigned dst_layer,<br>
> >    > > >> > > > +           uint32_t src_x, uint32_t src_y,<br>
> >    > > >> > > > +           uint32_t dst_x, uint32_t dst_y,<br>
> >    > > >> > > > +           uint32_t src_width, uint32_t src_height)<br>
> >    > > >> > > > +{<br>
> >    > > >> > > > +   struct blorp_params params;<br>
> >    > > >> > > > +   blorp_params_init(&params);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   brw_blorp_surface_info_init(batch->blorp, &params.src,<br>
> >    > > >> src_surf,<br>
> >    > > >> > > src_level,<br>
> >    > > >> > > > +                               src_layer,<br>
> >    ISL_FORMAT_UNSUPPORTED,<br>
> >    > > >> > > false);<br>
> >    > > >> > > > +   brw_blorp_surface_info_init(batch->blorp, &params.dst,<br>
> >    > > >> dst_surf,<br>
> >    > > >> > > dst_level,<br>
> >    > > >> > > > +                               dst_layer,<br>
> >    ISL_FORMAT_UNSUPPORTED,<br>
> >    > > >> true);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   struct brw_blorp_blit_prog_key wm_prog_key;<br>
> >    > > >> > > > +   memset(&wm_prog_key, 0, sizeof(wm_prog_key));<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   const struct isl_format_layout *src_fmtl =<br>
> >    > > >> > > > +      isl_format_get_layout(params.src.surf.format);<br>
> >    > > >> > > > +   const struct isl_format_layout *dst_fmtl =<br>
> >    > > >> > > > +      isl_format_get_layout(params.dst.surf.format);<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   params.src.view.format =<br>
> >    get_copy_format_for_bpb(src_fm<br>
> >    > > >> tl->bpb);<br>
> >    > > >> > > > +   if (src_fmtl->bw > 1 || src_fmtl->bh > 1) {<br>
> >    > > >> > > > +      surf_convert_to_uncompressed(batch->blorp->isl_dev,<br>
> >    > > >> &params.src,<br>
> >    > > >> > > > +                                   &src_x, &src_y,<br>
> >    &src_width,<br>
> >    > > >> > > &src_height);<br>
> >    > > >> > > > +      wm_prog_key.need_dst_offset = true;<br>
> >    > > >> > > > +   }<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   params.dst.view.format =<br>
> >    get_copy_format_for_bpb(dst_fm<br>
> >    > > >> tl->bpb);<br>
> >    > > >> > > > +   if (dst_fmtl->bw > 1 || dst_fmtl->bh > 1) {<br>
> >    > > >> > > > +      surf_convert_to_uncompressed(batch->blorp->isl_dev,<br>
> >    > > >> &params.dst,<br>
> >    > > >> > > > +                                   &dst_x, &dst_y, NULL,<br>
> >    NULL);<br>
> >    > > >> > > > +      wm_prog_key.need_dst_offset = true;<br>
> >    > > >> > > > +   }<br>
> >    > > >> > ><br>
> >    > > >> > > When this function is later used to replace meta in<br>
> >    vkCopyImage and<br>
> >    > > >> the<br>
> >    > > >> > > like,<br>
> >    > > >> > > I suspect that copying non-zero mip levels on D16 and S8<br>
> >    textures can<br>
> >    > > >> fail.<br>
> >    > > >> > > These textures have a non-4x4 alignment on SKL and, like<br>
> >    compressed<br>
> >    > > >> > > textures,<br>
> >    > > >> > > need surf_convert_to_single_slice().<br>
> >    > > >> > ><br>
> >    > > >> ><br>
> >    > > >> > I don't think that's an issue.  Depth and stencil are still<br>
> >    valid<br>
> >    > > >> multi-LOD<br>
> >    > > >> > textures.  You don't need 4x4, you just need an alignment that<br>
> >    we can<br>
> >    > > >> > validly express so 4x8 (stencil), for instance, is fine.  The<br>
> >    problem<br>
> >    > > >> with<br>
> >    > > >> > compressed is that, when you fake it as R32U32G32A32_UINT, you<br>
> >    can end<br>
> >    > > >> up<br>
> >    > > >> > with halign/valign that can't actually be expressed.  On SKL,<br>
> >    I think we<br>
> >    > > >> > can actually express them all so we may not need the stomp at<br>
> >    all.<br>
> >    > > >> ><br>
> >    > > >> ><br>
> >    > > >><br>
> >    > > >> My suspicion was wrong. I was under the assumption that blorp<br>
> >    behaved like<br>
> >    > > >> meta in that it always created an image from the tile nearest to<br>
> >    the copy<br>
> >    > > >> region<br>
> >    > > >> of the src/dst image - that is not the case. Sorry for not<br>
> >    simply asking.<br>
> >    > > >> This<br>
> >    > > >> seems like a much better way to copy images.<br>
> >    > > >><br>
> >    > > >> This series currently causes 6 crucbile tests to fail in<br>
> >    > > >> func.miptree.r8g8b8a8-unorm.aspect-color.view-3d. Does your<br>
> >    local copy<br>
> >    > > >> fix<br>
> >    > > >> these? If so, could you send it out?<br>
> >    > > >><br>
> >    > > ><br>
> >    > > > Drp... I didn't run crucible.  No CTS failures but I'm seeing the<br>
> >    same 6<br>
> >    > > > crucible fails that you are.  I'll look into them.<br>
> >    > > ><br>
> >    > ><br>
> >    > > Looking at the crucible fail a bit.  The R8G8B8A8 failures were do<br>
> >    to<br>
> >    > > sanitizing coordinates with the type from the wrong image.  I also<br>
> >    found a<br>
> >    > > couple of other bugs.<br>
> >    > ><br>
> >    ><br>
> >    > Okay. I'll resume review after you've fixed the issues.<br>
> >    ><br>
> >    > > There are still failures on 3-D stencil in those tests.  I'll look<br>
> >    into<br>
> >    > > them.<br>
> >    > ><br>
> >    ><br>
> >    > In order to get 3D stencil tests running, are you using this patch?<br>
> >    > [6]<a href="https://patchwork.freedesktop.org/patch/109266/">https://patchwork.freedesktop.org/patch/109266/</a><br>
> >    > No stencil tests run for me otherwise.<br>
> >    ><br>
> >    > > The latest can always be found here:<br>
> >    > ><br>
> >    > > [7]<a href="https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-">https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-</a><br>
> >    blorp<br>
> >    > ><br>
> >    ><br>
> >    > I checked this branch before asking for the newest revision, but it<br>
> >    was out of<br>
> >    > date. I see that it has now been updated however.<br>
> ><br>
> >      It was up-to-date until I fixed some of those crucible tests.  I'll<br>
> >      continue cracking away at the 3D stencil failures when I get back to<br>
> >      my computer.  Hopefully it won't take long.<br>
> ><br>
> >    Ok, it's passing crucible now.  There were two bugs.  One was a bug in<br>
> >    patch 8 where we weren't properly handling the z_offset field of<br>
> >    blorp_surface_info.  A new version can be found here:<br>
> >    [8]<a href="https://cgit.freedesktop.org/~jekstrand/mesa/commit/?h=wip/anv-blorp">https://cgit.freedesktop.org/~jekstrand/mesa/commit/?h=wip/anv-blorp</a><br>
> >    &id=86ada5b877046b222cfc1a1e7c87e0f7c9ee60f0<br>
><br>
> Taking info->z_offset into account in surf_convert_to_single_slice() and<br>
> grounding it to zero looks right. Moving the assignment:<br>
><br>
><br>
> -   /* For some texture types, we need to pass the layer through the sampler. */<br>
> -   params.wm_inputs.src_z = params.src.z_offset;<br>
> -<br>
>     if (devinfo->gen > 6 &&<br>
>         params.dst.surf.msaa_layout == ISL_MSAA_LAYOUT_INTERLEAVED) {<br>
>        assert(params.dst.surf.samples > 1);<br>
> @@ -1620,6 +1623,9 @@ blorp_blit(struct blorp_batch *batch,<br>
>        wm_prog_key.persample_msaa_dispatch = true;<br>
>     }<br>
><br>
> +   /* For some texture types, we need to pass the layer through the sampler. */<br>
> +   params.wm_inputs.src_z = params.src.z_offset;<br>
> +<br>
>     brw_blorp_get_blit_kernel(batch->blorp, &params, &wm_prog_key);<br>
><br>
>     params.src.view.swizzle = src_swizzle;<br>
><br>
><br>
> looks unnecessary though. Is it intentional?</p>
<p dir="ltr">It is.  Now that we are modifying z_offset in the surface munging functions, we need to copy it into wm_inputs after all the munging is done.  Does that make sense?</p>
<p dir="ltr">--Jason</p>
<p dir="ltr">> >    The second was a SKL-only bug in our handling of 3D stencil textures<br>
> >    that we've had since forever.  It only now showed up because this is<br>
> >    the firs time we've ever actually tested sampling from a 3D stencil<br>
> >    texture.  Hooray for test coverage, right?  That bug is fixed by the<br>
> >    second of the little two-patch series I just sent out.<br>
> >    I'm running a full CTS run on Haswell now to see if blorp breaks<br>
> >    anything there.  It did at one point, but I think that may be fixed<br>
> >    now.  It should now be good-to-go on BDW+<br>
> >    --Jason<br>
> ><br>
> >      --Jason<br>
> ><br>
> >    > - Nanley<br>
> >    ><br>
> >    > ><br>
> >    > > > --Jason<br>
> >    > > ><br>
> >    > > ><br>
> >    > > >> > > One idea is to call surf_convert_to_single_slice() when ever<br>
> >    a copy<br>
> >    > > >> occurs<br>
> >    > > >> > > with an image's subresource that isn't the 1st mip level on<br>
> >    the 1st<br>
> >    > > >> array<br>
> >    > > >> > > layer<br>
> >    > > >> > > /depth slice and the alignment differs from what would be<br>
> >    used the<br>
> >    > > >> copy<br>
> >    > > >> > > format.<br>
> >    > > >> > > Thoughts?<br>
> >    > > >> > ><br>
> >    > > >> ><br>
> >    > > >> > That seems a bit harsh.<br>
> >    > > >> ><br>
> >    > > >> ><br>
> >    > > >><br>
> >    > > >> I agree.<br>
> >    > > >><br>
> >    > > >> - Nanley<br>
> >    > > >><br>
> >    > > >> > > - Nanley<br>
> >    > > >> > ><br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   /* Once both surfaces are stompped to uncompressed as<br>
> >    needed,<br>
> >    > > >> the<br>
> >    > > >> > > > +    * destination size is the same as the source size.<br>
> >    > > >> > > > +    */<br>
> >    > > >> > > > +   uint32_t dst_width = src_width;<br>
> >    > > >> > > > +   uint32_t dst_height = src_height;<br>
> >    > > >> > > > +<br>
> >    > > >> > > > +   do_blorp_blit(batch, &params, &wm_prog_key,<br>
> >    > > >> > > > +                 src_x, src_y, src_x + src_width, src_y +<br>
> >    > > >> src_height,<br>
> >    > > >> > > > +                 dst_x, dst_y, dst_x + dst_width, dst_y +<br>
> >    > > >> dst_height,<br>
> >    > > >> > > > +                 false, false);<br>
> >    > > >> > > > +}<br>
> >    > > >> > > > --<br>
> >    > > >> > > > 2.5.0.400.gff86faf<br>
> >    > > >> > > ><br>
> >    > > >> > > > _______________________________________________<br>
> >    > > >> > > > mesa-dev mailing list<br>
> >    > > >> > > > [9]<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> >    > > >> > > > [10]<a href="https://lists.freedesktop.org/">https://lists.freedesktop.org/</a><br>
> >    mailman/listinfo/mesa-dev<br>
> >    > > >> > ><br>
> >    > > >><br>
> >    > > ><br>
> >    > > ><br>
> ><br>
> > References<br>
> ><br>
> >    1. mailto:<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a><br>
> >    2. mailto:<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a><br>
> >    3. mailto:<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a><br>
> >    4. mailto:<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a><br>
> >    5. mailto:<a href="mailto:nanleychery@gmail.com">nanleychery@gmail.com</a><br>
> >    6. <a href="https://patchwork.freedesktop.org/patch/109266/">https://patchwork.freedesktop.org/patch/109266/</a><br>
> >    7. <a href="https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-blorp">https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-blorp</a><br>
> >    8. <a href="https://cgit.freedesktop.org/~jekstrand/mesa/commit/?h=wip/anv-blorp&id=86ada5b877046b222cfc1a1e7c87e0f7c9ee60f0">https://cgit.freedesktop.org/~jekstrand/mesa/commit/?h=wip/anv-blorp&id=86ada5b877046b222cfc1a1e7c87e0f7c9ee60f0</a><br>
> >    9. mailto:<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> >   10. <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
></p>