[Mesa-dev] [PATCH 1/4] i965/miptree: Loosen the format check in miptree_match_image
Jason Ekstrand
jason at jlekstrand.net
Tue Nov 21 20:01:28 UTC 2017
On Tue, Nov 21, 2017 at 10:56 AM, Chad Versace <chadversary at chromium.org>
wrote:
> On Wed 08 Nov 2017, Jason Ekstrand wrote:
> > This function is used to determine when we need to re-allocate a
> > miptree. Since we do nothing different in miptree allocation for
> > sRGB vs. linear, loosening this should be safe and may lead to less
> > copying and reallocating in some odd cases.
> >
> > Cc: "17.3" <mesa-stable at lists.freedesktop.org>
> > Cc: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> > src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 6 ++++--
> > src/mesa/drivers/dri/i965/intel_tex.c | 2 +-
> > src/mesa/drivers/dri/i965/intel_tex_obj.h | 4 ++--
> > src/mesa/drivers/dri/i965/intel_tex_validate.c | 2 +-
> > 4 files changed, 8 insertions(+), 6 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > index 82f5a81..47cfccc 100644
> > --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c
> > @@ -1298,7 +1298,8 @@ intel_miptree_match_image(struct
> intel_mipmap_tree *mt,
> > if (mt->etc_format != MESA_FORMAT_NONE)
> > mt_format = mt->etc_format;
> >
> > - if (image->TexFormat != mt_format)
> > + if (_mesa_get_srgb_format_linear(image->TexFormat) !=
> > + _mesa_get_srgb_format_linear(mt_format))
> > return false;
> >
> > intel_get_image_dims(image, &width, &height, &depth);
> > @@ -1537,7 +1538,8 @@ intel_miptree_copy_slice(struct brw_context *brw,
> > assert(src_layer < get_num_phys_layers(&src_mt->surf,
> > src_level -
> src_mt->first_level));
> >
> > - assert(src_mt->format == dst_mt->format);
> > + assert(_mesa_get_srgb_format_linear(src_mt->format) ==
> > + _mesa_get_srgb_format_linear(dst_mt->format));
> >
> > if (dst_mt->compressed) {
> > unsigned int i, j;
> > diff --git a/src/mesa/drivers/dri/i965/intel_tex.c
> b/src/mesa/drivers/dri/i965/intel_tex.c
> > index 65a1cb3..0650b6e 100644
> > --- a/src/mesa/drivers/dri/i965/intel_tex.c
> > +++ b/src/mesa/drivers/dri/i965/intel_tex.c
> > @@ -176,7 +176,7 @@ intel_alloc_texture_storage(struct gl_context *ctx,
> > intel_texobj->needs_validate = false;
> > intel_texobj->validated_first_level = 0;
> > intel_texobj->validated_last_level = levels - 1;
> > - intel_texobj->_Format = intel_texobj->mt->format;
> > + intel_texobj->_Format = first_image->TexFormat;
>
> Why this line? Since all format comparisons, where appropriate, convert
> sRGB to linear pre-comparison, does it make any real difference whether
> intel_texobj->_Format is mt->format or first_image->TexFormat?
>
> It *feels* cleaner to use the incoming TexFormat here rather than
> mt->format. But I want to know if if this line was required to fix
> anything.
>
Looking at the code again, I think it is. The way this block of code works
is that the miptree gets its format from first_image and the texobj gets
its format from the miptree. Previously, if the format changed between
UNORM and sRGB, we would create a new miptree with the new format and the
texobj would get the new format. With this change, we no longer create a
new miptree but we still can't let the texture object and image formats get
out of sync.
> Due to interaction with below hunk from blorp, are we now disabling fast
> clears
> in more cases than previously?
>
> # brw_blorp.c:set_write_disables()
> /* We store clear colors as floats or uints as needed. If there
> are
> * texture views in play, the formats will not properly be
> respected
> * during resolves because the resolve operations only know about
> the
> * miptree and not the renderbuffer.
> */
> if (irb->Base.Base.Format != irb->mt->format)
> can_fast_clear = false;
>
Ugh... Fortunately, I think that only happens in some rather obscure
render-to-texture cases.
> > return true;
> > }
> > diff --git a/src/mesa/drivers/dri/i965/intel_tex_obj.h
> b/src/mesa/drivers/dri/i965/intel_tex_obj.h
> > index 27c18b7..526f5ce 100644
> > --- a/src/mesa/drivers/dri/i965/intel_tex_obj.h
> > +++ b/src/mesa/drivers/dri/i965/intel_tex_obj.h
> > @@ -57,8 +57,8 @@ struct intel_texture_object
> > bool needs_validate;
> >
> > /* Mesa format for the validated texture object. For non-views this
> > - * will always be the same as mt->format. For views, it may differ
> > - * since the mt is shared across views with differing formats.
> > + * will always be the same as texObj->Image[0][0].TexFormat. For
> views, it
> > + * may differ since the mt is shared across views with differing
> formats.
> > */
> > mesa_format _Format;
>
> Same question as above. Again, I feel like this is the right thing to
> do.
>
I think it's the same answer.
> > diff --git a/src/mesa/drivers/dri/i965/intel_tex_validate.c
> b/src/mesa/drivers/dri/i965/intel_tex_validate.c
> > index 2b7798c..ef7f907 100644
> > --- a/src/mesa/drivers/dri/i965/intel_tex_validate.c
> > +++ b/src/mesa/drivers/dri/i965/intel_tex_validate.c
> > @@ -174,7 +174,7 @@ intel_finalize_mipmap_tree(struct brw_context *brw,
> GLuint unit)
> >
> > intelObj->validated_first_level = validate_first_level;
> > intelObj->validated_last_level = validate_last_level;
> > - intelObj->_Format = intelObj->mt->format;
> > + intelObj->_Format = firstImage->base.Base.TexFormat,
> > intelObj->needs_validate = false;
> > }
> >
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20171121/13b98602/attachment-0001.html>
More information about the mesa-dev
mailing list