[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60528] trunk/blender/intern/ghost/intern/ GHOST_WindowX11.cpp: Fix crash starting game engine on linux
Alex Fraser
alex at phatcore.com
Sat Oct 5 05:31:59 CEST 2013
Hi Sergey,
We were talking about this in #blendercoders the other day, so I just
wanted to confirm: this fixes the issue for my game on my friends'
computers (one nVidia/nouveau, one Intel), and seems to make it run
faster on mine (ATI/fglrx). I'm not sure if that means that vsync is
now disabled on my computer even though my card supports it, but I'm
happy. Thanks very much!
Alex
On 3 October 2013 23:15, Sergey Sharybin <sergey.vfx at gmail.com> wrote:
> Revision: 60528
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60528
> Author: nazgul
> Date: 2013-10-03 13:15:53 +0000 (Thu, 03 Oct 2013)
> Log Message:
> -----------
> Fix crash starting game engine on linux
>
> Issue was caused by bug in mesa #54080 which makes
> glXQueryDrawable fail with GLXBadDrawable for any
> request with direct context.
>
> Worked around by temporary overriding X error handling
> when getting old interval value and disablingintervals
> extension if this query fails.
>
> Also added check for glXSwapIntervalEXT which is
> apparently NULL here with GLX_EXT_swap_control=1.
>
> Modified Paths:
> --------------
> trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
>
> Modified: trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp
> ===================================================================
> --- trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp 2013-10-03 12:22:44 UTC (rev 60527)
> +++ trunk/blender/intern/ghost/intern/GHOST_WindowX11.cpp 2013-10-03 13:15:53 UTC (rev 60528)
> @@ -65,6 +65,14 @@
> long input_mode;
> } MotifWmHints;
>
> +// Workaround for MESA bug #54080
> +// https://bugs.freedesktop.org/show_bug.cgi?id=54080()
> +#define SWAP_INTERVALS_WORKAROUND
> +
> +#ifdef SWAP_INTERVALS_WORKAROUND
> +static bool g_swap_interwal_disabled = false;
> +#endif // SWAP_INTERVALS_WORKAROUND
> +
> #define MWM_HINTS_DECORATIONS (1L << 1)
>
>
> @@ -1519,18 +1527,67 @@
> GHOST_TSuccess
> GHOST_WindowX11::
> setSwapInterval(int interval) {
> - if (!GLX_EXT_swap_control)
> + if (!GLX_EXT_swap_control || !glXSwapIntervalEXT
> +#ifdef SWAP_INTERVALS_WORKAROUND
> + || g_swap_interwal_disabled
> +#endif // SWAP_INTERVALS_WORKAROUND
> + )
> + {
> return GHOST_kFailure;
> + }
> glXSwapIntervalEXT(m_display, m_window, interval);
> return GHOST_kSuccess;
> }
>
> +#ifdef SWAP_INTERVALS_WORKAROUND
> +static int QueryDrawable_ApplicationErrorHandler(Display *display, XErrorEvent *theEvent)
> +{
> + fprintf(stderr, "Ignoring Xlib error: error code %d request code %d\n",
> + theEvent->error_code, theEvent->request_code);
> + if (!g_swap_interwal_disabled) {
> + fprintf(stderr, "Disabling SWAP INTERVALS extension\n");
> + g_swap_interwal_disabled = true;
> + }
> + return 0;
> +}
> +
> +static int QueryDrawable_ApplicationIOErrorHandler(Display *display)
> +{
> + fprintf(stderr, "Ignoring Xlib error: error IO\n");
> + if (!g_swap_interwal_disabled) {
> + fprintf(stderr, "Disabling SWAP INTERVALS extension\n");
> + g_swap_interwal_disabled = true;
> + }
> + return 0;
> +}
> +#endif // SWAP_INTERVALS_WORKAROUND
> +
> int
> GHOST_WindowX11::
> getSwapInterval() {
> if (GLX_EXT_swap_control) {
> - unsigned int value;
> +#ifdef SWAP_INTERVALS_WORKAROUND
> + /* XXX: Current MESA driver will give GLXBadDrawable for all
> + * the glXQueryDrawable requests with direct contexts.
> + *
> + * To prevent crashes and unexpected behaviors, we will
> + * disable swap interwals extension if query fails here.
> + * (because if we will override interval without having
> + * old value we couldn't restore it properly).
> + */
> + XErrorHandler old_handler = XSetErrorHandler(QueryDrawable_ApplicationErrorHandler);
> + XIOErrorHandler old_handler_io = XSetIOErrorHandler(QueryDrawable_ApplicationIOErrorHandler);
> +#endif // SWAP_INTERVALS_WORKAROUND
> +
> + unsigned int value = 0;
> glXQueryDrawable(m_display, m_window, GLX_SWAP_INTERVAL_EXT, &value);
> +
> +#ifdef SWAP_INTERVALS_WORKAROUND
> + /* Restore handler */
> + (void) XSetErrorHandler(old_handler);
> + (void) XSetIOErrorHandler(old_handler_io);
> +#endif // SWAP_INTERVALS_WORKAROUND
> +
> return (int)value;
> }
> return 0;
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
More information about the Bf-committers
mailing list