diff --git a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h index 1219041323..a43702fdd6 100644 --- a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h +++ b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h @@ -57,7 +57,7 @@ public: NativeContext (Component& comp, const OpenGLPixelFormat& cPixelFormat, void* shareContext, - bool /*useMultisampling*/, + bool useMultisamplingIn, OpenGLVersion) : component (comp), contextToShareWith (shareContext), dummy (*this) { @@ -67,25 +67,13 @@ public: X11Symbols::getInstance()->xSync (display, False); - GLint attribs[] = + const std::vector optionalAttribs { - GLX_RGBA, - GLX_DOUBLEBUFFER, - GLX_RED_SIZE, cPixelFormat.redBits, - GLX_GREEN_SIZE, cPixelFormat.greenBits, - GLX_BLUE_SIZE, cPixelFormat.blueBits, - GLX_ALPHA_SIZE, cPixelFormat.alphaBits, - GLX_DEPTH_SIZE, cPixelFormat.depthBufferBits, - GLX_STENCIL_SIZE, cPixelFormat.stencilBufferBits, - GLX_ACCUM_RED_SIZE, cPixelFormat.accumulationBufferRedBits, - GLX_ACCUM_GREEN_SIZE, cPixelFormat.accumulationBufferGreenBits, - GLX_ACCUM_BLUE_SIZE, cPixelFormat.accumulationBufferBlueBits, - GLX_ACCUM_ALPHA_SIZE, cPixelFormat.accumulationBufferAlphaBits, - None + GLX_SAMPLE_BUFFERS, useMultisamplingIn ? 1 : 0, + GLX_SAMPLES, cPixelFormat.multisamplingLevel }; - bestVisual = glXChooseVisual (display, X11Symbols::getInstance()->xDefaultScreen (display), attribs); - if (bestVisual == nullptr) + if (! tryChooseVisual (cPixelFormat, optionalAttribs) && ! tryChooseVisual (cPixelFormat, {})) return; auto* peer = component.getPeer(); @@ -242,6 +230,33 @@ public: struct Locker { Locker (NativeContext&) {} }; private: + bool tryChooseVisual (const OpenGLPixelFormat& format, const std::vector& optionalAttribs) + { + std::vector allAttribs + { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, format.redBits, + GLX_GREEN_SIZE, format.greenBits, + GLX_BLUE_SIZE, format.blueBits, + GLX_ALPHA_SIZE, format.alphaBits, + GLX_DEPTH_SIZE, format.depthBufferBits, + GLX_STENCIL_SIZE, format.stencilBufferBits, + GLX_ACCUM_RED_SIZE, format.accumulationBufferRedBits, + GLX_ACCUM_GREEN_SIZE, format.accumulationBufferGreenBits, + GLX_ACCUM_BLUE_SIZE, format.accumulationBufferBlueBits, + GLX_ACCUM_ALPHA_SIZE, format.accumulationBufferAlphaBits + }; + + allAttribs.insert (allAttribs.end(), optionalAttribs.begin(), optionalAttribs.end()); + + allAttribs.push_back (None); + + bestVisual = glXChooseVisual (display, X11Symbols::getInstance()->xDefaultScreen (display), allAttribs.data()); + + return bestVisual != nullptr; + } + static constexpr int embeddedWindowEventMask = ExposureMask | StructureNotifyMask; Component& component;