Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QOpenGLContext::makeCurrent, UD2 crash when resizing window on macOS 10.15
QtWS25 Last Chance

QOpenGLContext::makeCurrent, UD2 crash when resizing window on macOS 10.15

Scheduled Pinned Locked Moved Unsolved General and Desktop
4 Posts 2 Posters 985 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • MakitsuneM Offline
    MakitsuneM Offline
    Makitsune
    wrote on last edited by Makitsune
    #1

    I'm working on a very complex program that uses OpenGL. I'm fairly new to macOS development and mainly work on Linux. There's a lot in common with the two but I'm experiencing strange issues on Mac that I don't get on Windows or Linux.

    Using a custom build of 5.14.1, in our main render loop when resizing the application window, it immediately crashes.
    This function fails:

    // _qglContext is a QOpenGLContext*
    bool result = _qglContext->makeCurrent(_window);
    

    This is where it stops in assembly:

        0x7fff300a0c31 <+513>: leaq   0x7eff99(%rip), %rdi      ; "-[NSOpenGLContext update] must be called from the main thread if the context has a view."
        0x7fff300a0c38 <+520>: callq  0x7fff308197ca            ; symbol stub for: _os_crash
    ->  0x7fff300a0c3d <+525>: ud2
    

    And here is the call stack:

       AppKit!-[NSOpenGLContext update] (Unknown Source:0)
       libqcocoa.dylib!___lldb_unnamed_symbol1148$$libqcocoa.dylib (Unknown Source:0)
       libqcocoa.dylib!___lldb_unnamed_symbol1146$$libqcocoa.dylib (Unknown Source:0)
       QtGui!QOpenGLContext::makeCurrent(QSurface*) (Unknown Source:0)
    -> libgl.dylib!gl::Context::makeCurrent() (/Users/maki/git/interface/libraries/gl/src/gl/ContextQt.cpp:89)
       libdisplay-plugins.dylib!PresentThread::run() (/Users/maki/git/interface/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp:231)
       QtCore!___lldb_unnamed_symbol236$$QtCore (Unknown Source:0)
       libsystem_pthread.dylib!_pthread_start (Unknown Source:0)
       libsystem_pthread.dylib!thread_start (Unknown Source:0)
    

    As far as I can tell, this is not Qt's problem but macOS's OpenGL library?

    I'm looking everywhere through out our code base and I just can't find what's going on. The assembly comments tells it must be called from the main thread which I think it is. There's no mutex locks or moving threads that immediately happen when resizing. I've commented out every bit of code that handles window resizing and it still persists.

    It's been 2 whole days of debugging and I'm not sure what to do anymore. I've looked around online and found:
    https://forum.qt.io/topic/107879/qt3d-examples-crashing-on-mac-os-catalina
    https://bugreports.qt.io/browse/QTBUG-79315

    The bug report says it's fixed in 5.14 which I'm using. It might not be the same problem however because there it happens in NSOpenGLContext setView where as for me it's in NSOpenGLContext update

    I'm tackling a huge code base and I may be missing something but I thought I would ask here for opinions.
    Thank you, Maki

    1 Reply Last reply
    1
    • MakitsuneM Offline
      MakitsuneM Offline
      Makitsune
      wrote on last edited by
      #2

      Inside of qopenglcontext.cpp there is:

      bool QOpenGLContext::makeCurrent(QSurface *surface)
      {
          Q_D(QOpenGLContext);
          if (!isValid())
              return false;
      
          if (Q_UNLIKELY(!qApp->testAttribute(Qt::AA_DontCheckOpenGLContextThreadAffinity)
                         && thread() != QThread::currentThread())) {
              qFatal("Cannot make QOpenGLContext current in a different thread");
          }
      
          if (!surface) {
              doneCurrent();
              return true;
          }
      
          if (!surface->surfaceHandle())
              return false;
          if (!surface->supportsOpenGL()) {
              qWarning() << "QOpenGLContext::makeCurrent() called with non-opengl surface" << surface;
              return false;
          }
      
          if (!d->platformGLContext->makeCurrent(surface->surfaceHandle()))
              return false;
      
          QOpenGLContextPrivate::setCurrentContext(this);
      #ifndef QT_NO_DEBUG
          QOpenGLContextPrivate::toggleMakeCurrentTracker(this, true);
      #endif
      

      At the start, it compares thread() to QThread::currentThread() which isn't failing in my program.


      -[NSOpenGLContext update] must be called from the main thread if the context has a view.

      If the context has a view. surfaceHandle?

      I'll try to figure out which line is causing the crash to narrow it down.

      1 Reply Last reply
      0
      • MakitsuneM Offline
        MakitsuneM Offline
        Makitsune
        wrote on last edited by
        #3

        I was able to fix it by using using Xcode SDK version 10.13 from here:
        https://github.com/phracker/MacOSX-SDKs

        This still doesn't solve the problem but maybe the next macOS will fix it. In the past, my program used to crash on Catalina but suddenly started working again. I heard OpenGL may be deprecated now which is terrible...

        T 1 Reply Last reply
        0
        • MakitsuneM Makitsune

          I was able to fix it by using using Xcode SDK version 10.13 from here:
          https://github.com/phracker/MacOSX-SDKs

          This still doesn't solve the problem but maybe the next macOS will fix it. In the past, my program used to crash on Catalina but suddenly started working again. I heard OpenGL may be deprecated now which is terrible...

          T Offline
          T Offline
          th.thielemann
          wrote on last edited by
          #4

          @Makitsune My app crashes with the same error after linking a ggc static lib to a llvm project. And even I modified my cmake-based project in QtCreator the wrong setting was still used. I deleted the kit and set it up again to fix the error.

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved