[Mesa-dev] [PATCH] i965: fix MakeCurrent when switching a context between multiple drawables.

Iago Toral itoral at igalia.com
Thu Apr 10 01:31:40 PDT 2014


Hi Kristian,

On Tue, 2014-04-08 at 10:14 -0700, Kristian Høgsberg wrote:
> On Mon, Apr 7, 2014 at 9:24 AM, Eric Anholt <eric at anholt.net> wrote:
> > Iago Toral Quiroga <itoral at igalia.com> writes:
> >
> >> Commit 11baad35088dfd4bdabc1710df650dbfb413e7a3 produces a regression when
> >> switching a single context between multiple drawables.
> >>
> >> The problem is that we check whether we have a viewport set to decide if we
> >> need to generate buffers for the drawble, but the viewport is initialized
> >> with the first call to MakeCurrent for that context, so calling MakeCurrent on
> >> the same context with a different drawable will have the viewport already
> >> initialized and will not generate buffers for the new drawable.
> >>
> >> This patch fixes the problem by reverting to the previous solution implemented
> >> in commit 05da4a7a5e7d5bd988cb31f94ed8e1f053d9ee39 with a small fix to suppport
> >> single buffer drawables too. This solution checks if we have a renderbuffer for
> >> the drawable to decide if we need to generate a buffer or not. The original
> >> implementation, however, did this by checking the BACK_LEFT buffer, which is
> >> not a valid solution for single buffer drawables. This patch modifies this
> >> to check the FRONT_LEFT buffer instead, which should work in both scenarios.
> >>
> >> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74005
> >> ---
> >>  src/mesa/drivers/dri/i965/brw_context.c | 9 +++++----
> >>  1 file changed, 5 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> >> index c9719f5..c593286 100644
> >> --- a/src/mesa/drivers/dri/i965/brw_context.c
> >> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> >> @@ -926,6 +926,7 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
> >>  {
> >>     struct brw_context *brw;
> >>     GET_CURRENT_CONTEXT(curCtx);
> >> +   struct intel_renderbuffer *rb = NULL;
> >>
> >>     if (driContextPriv)
> >>        brw = (struct brw_context *) driContextPriv->driverPrivate;
> >> @@ -950,6 +951,7 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
> >>        } else {
> >>           fb = driDrawPriv->driverPrivate;
> >>           readFb = driReadPriv->driverPrivate;
> >> +         rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
> >>           driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1;
> >>           driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1;
> >>        }
> >> @@ -961,10 +963,9 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
> >>        intel_gles3_srgb_workaround(brw, fb);
> >>        intel_gles3_srgb_workaround(brw, readFb);
> >>
> >> -      /* If the context viewport hasn't been initialized, force a call out to
> >> -       * the loader to get buffers so we have a drawable size for the initial
> >> -       * viewport. */
> >> -      if (!brw->ctx.ViewportInitialized)
> >> +      /* If we don't have buffers for the drawable yet, force a call to
> >> +       * getbuffers here so we can have a default drawable size. */
> >> +      if (rb && !rb->mt)
> >>           intel_prepare_render(brw);
> >
> > We won't have an rb->mt for the front unless you're doing front buffer
> > rendering, so I think you're basically just backing out krh's change.
> > Which I think is good -- it looks like he was papering over a bug
> > elsewhere, and I think we *should* just prepare_render in makecurrent.
> > But if we're going to revert, let's just actually revert.
> 
> Here's what I wrote in https://bugs.freedesktop.org/show_bug.cgi?id=74005:
> We don't want to revert the behaviour.  The initial patch removed a
> call to intel_prepare_render() in intelMakeCurrent().  We're supposed
> to call intel_prepare_render() any time we're about to touch the
> buffers, but the up-front call to intel_prepare_render() in
> intelMakeCurrent covered up a few places where we forgot.  The fix now
> isn't to put back the up-front intel_prepare_render() call but to add
> it in the rendering paths that are missing it.

Thanks for explaining. I will try to find the place where we are missing
the intel_prepare_render() call in this particular bug.

I have a question though: Reading your initial commit I understand this
is not  because of performance reasons but mostly because always calling
intel_prepare_render() in MakeCurrent was was creating a problem in
other places... but should that happen? I guess what I mean to ask is if
calling intel_prepare_render() in MaKeCurrent is simply unnecessary or
an actual mistake that will create problems in some scenarios.

> Also, for reference, we need the buffer size for the initial value of
> the context viewport.  So the first time a context is made current, we
> call intel_prepare_render() to get the buffers so we can see what size
> they are.  When the same context is later made current with a
> different drawable, we have a value for the viewport and we're not
> supposed to change it, so there's no point in getting buffers.
> 
> Kristian
> 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> >
> 




More information about the mesa-dev mailing list