Hey! Thanks for the tests.
However, i'm not sure why it would run faster -- wouldn't expect functional changes to blender if there was no crash. Someone to double-check whether vsync works the same as it used to before my change? On Sat, Oct 5, 2013 at 9:31 AM, Alex Fraser <[email protected]> wrote: > 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 <[email protected]> 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 > > [email protected] > > http://lists.blender.org/mailman/listinfo/bf-blender-cvs > _______________________________________________ > Bf-committers mailing list > [email protected] > http://lists.blender.org/mailman/listinfo/bf-committers > -- With best regards, Sergey Sharybin _______________________________________________ Bf-committers mailing list [email protected] http://lists.blender.org/mailman/listinfo/bf-committers
