[Mesa-dev] [PATCH 4/4] i965: Don't disable aux buffers for non-overlapping miplevels.

Jason Ekstrand jason at jlekstrand.net
Thu Oct 19 14:00:46 UTC 2017


Series rb


On October 18, 2017 10:43:10 PM Kenneth Graunke <kenneth at whitecape.org> wrote:

> Meta's GenerateMipmap implementation binds the same image for both
> sampling and rendering - but it samples from one miplevel while
> rendering the next.  This is a false self-dependency, and there's
> no need to disable auxiliary buffers in this case.  In fact, we really
> want to leave it enabled so the new miplevels gain color compression.
>
> Thankfully, the texture object's _MaxLevel is always one shy of the
> miplevel being rendered.  So we can simply check if irb->mt_level is
> overlaps with the texture's defined levels.  If not, there's no self-
> dependency and we can leave the auxiliary buffers enabled.
>
> Fixes a performance regression in GFXBench4 Car Chase, which apparently
> calls glGenerateMipmap() on every frame.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103247
> ---
>  src/mesa/drivers/dri/i965/brw_draw.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_draw.c 
> b/src/mesa/drivers/dri/i965/brw_draw.c
> index 51e2a26ca2f..a4c042f3f4f 100644
> --- a/src/mesa/drivers/dri/i965/brw_draw.c
> +++ b/src/mesa/drivers/dri/i965/brw_draw.c
> @@ -344,6 +344,7 @@ brw_merge_inputs(struct brw_context *brw,
>  static bool
>  intel_disable_rb_aux_buffer(struct brw_context *brw,
>                              struct intel_mipmap_tree *tex_mt,
> +                            unsigned min_level, unsigned num_levels,
>                              const char *usage)
>  {
>     const struct gl_framebuffer *fb = brw->ctx.DrawBuffer;
> @@ -358,7 +359,9 @@ intel_disable_rb_aux_buffer(struct brw_context *brw,
>        const struct intel_renderbuffer *irb =
>           intel_renderbuffer(fb->_ColorDrawBuffers[i]);
>
> -      if (irb && irb->mt->bo == tex_mt->bo) {
> +      if (irb && irb->mt->bo == tex_mt->bo &&
> +          irb->mt_level >= min_level &&
> +          irb->mt_level < min_level + num_levels) {
>           found = brw->draw_aux_buffer_disabled[i] = true;
>        }
>     }
> @@ -414,7 +417,8 @@ brw_predraw_resolve_inputs(struct brw_context *brw)
>        }
>
>        const bool disable_aux =
> -         intel_disable_rb_aux_buffer(brw, tex_obj->mt, "for sampling");
> +         intel_disable_rb_aux_buffer(brw, tex_obj->mt, min_level, num_levels,
> +                                     "for sampling");
>
>        intel_miptree_prepare_texture(brw, tex_obj->mt, view_format,
>                                      min_level, num_levels,
> @@ -440,7 +444,7 @@ brw_predraw_resolve_inputs(struct brw_context *brw)
>              tex_obj = intel_texture_object(u->TexObj);
>
>              if (tex_obj && tex_obj->mt) {
> -               intel_disable_rb_aux_buffer(brw, tex_obj->mt,
> +               intel_disable_rb_aux_buffer(brw, tex_obj->mt, 0, ~0,
>                                             "as a shader image");
>
>                 intel_miptree_prepare_image(brw, tex_obj->mt);
> --
> 2.14.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev




More information about the mesa-dev mailing list