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

Eric Anholt eric at anholt.net
Mon Apr 7 09:24:34 PDT 2014


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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 818 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140407/778ad14d/attachment.sig>


More information about the mesa-dev mailing list