[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