Hi there !
(Sorry in advance for the loooong post)
We’re starting to have some customers complaining that our plugins (using JUCE) display only a black and empty UI on their setups.
We’ve had a hard time trying to reproduce the bug, but it seemed to happen mostly with customers using Display Link USB hubs.
We finally got one and were able to reproduce with a 2019 Intel macBook Pro with an ADM graphic card, and this hub.
Of course the bug doesn’t happen on this computer unless the hub is connected… I don’t know what those hubs are doing, but they surely mess something up. Though, all the other apps are working fine and only our plugins are displaying black-empty windows. Still, I was able to reproduce the bug with plugins from other brands using JUCE (like Vital), and even with the OpenGL app template from the Projucer. So I’m pretty confident there’s something in JUCE colliding with whatever the hub is doing.
From what I was able to dig, this empty-UI issue only happens when using the OpenGL renderer (the native ones are ok, but we use OpenGL for our plugins).
The issue seems to come from bufferSwapper.swap() (in OpenGLContext::CachedImage::renderFrame()), which somehow fails to flush.
I’ve checked for OpenGL errors before and after the swap, but nothing showed up. I’ve also checked with a glReadPixel the content of the main framebuffer before the swap, and the UI was all drawn in it, so the swap really seems to fail. I guess the reason of this failure is elsewhere, maybe in the way JUCE setups the context, but I couldn’t find any obvious leads.
So I’ve setup a small project that uses the Projucer’s OpenGL app template to illustrate the bug. The app simply displays a red triangle over a grey background The project can either use JUCE’s standard OpenGL renderer, or a custom quick’n’dirty OpenGL renderer. Here are the results :
With JUCE’s OpenGL rendering
With custom OpenGL rendering
So I definitely think there’s one little detail somewhere in the way JUCE setups the OpenGL context that causes this bug, and we would appreciate some help from the JUCE’s team on this one ![]()
I agree this might seem as a corner case, but since we have more and more users reporting it, it felt important to share it with you.
The demo project can be found here if needed (it’s a macOS only project): GitHub - Lyoks38/TestOpenGLApp: A basic JUCE OpenGL that can either use the standard OpenGL renderer of JUCE or a light-weight custom one
Thanks !


