[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