Hi,
I am working on a (java) software running on macOS for which I want to use MESA3D software rendering instead of MacOS provided native GL. Despite explicitely loading MESA libGL.dylib before anything else, I got the Apple Metal renderer used (and the macOS libGL loaded as well).
To force the use of MESA3D, I start my program with the following environment variable wich is supposed to ensure that Mesa’s libGL will be loaded instead of macOS libGL.
DYLD_INSERT_LIBRARIES=/opt/homebrew/Cellar/mesa/21.3.7/lib/libGL.dylib
My software then queries the OpenGL renderer to verify if I load Mesa’s GL or Apple GL.
gl.glGetString(GL.GL_RENDERER)
= Apple M1
instead of the expected
gl.glGetString(GL.GL_RENDERER)
= llvmpipe (...)
which is what I got on Ubuntu and Windows when MESA3D is properly enabled for software rendering.
To check which library is loaded first I enable
DYLD_PRINT_LIBRARIES=YES
DYLD_PRINT_BINDINGS=YES
I then can read logs in console
dyld: loaded: <3C537115-FC06-3645-A5B9-7300A12C63C3> /Library/Java/JavaVirtualMachines/zulu17.30.15-ca-jdk17.0.1-macosx_aarch64/zulu-17.jdk/Contents/Home/bin/java
dyld: loaded: <3E35E317-C590-329B-80B6-EF196B72D3B4> /opt/homebrew/Cellar/mesa/21.3.7/lib/libGL.dylib
dyld: loaded: <B0979A3D-EEF8-32FE-AF37-643FA12FEFA1> /usr/lib/libz.1.dylib
dyld: loaded: <A543B77E-5CD0-3214-A571-85774207BF2C> /Library/Java/JavaVirtualMachines/zulu17.30.15-ca-jdk17.0.1-macosx_aarch64/zulu-17.jdk/Contents/Home/bin/../lib/libjli.dylib
dyld: loaded: <72158147-592E-31AB-A1D5-800AC618735D> /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa
...
dyld: loaded: <A216E56E-4166-3753-9DDA-285369A91C16> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib
dyld: loaded: <5DC8E881-0092-37CE-945E-43392DC84245> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib
dyld: loaded: <320BE048-A77E-3495-B42D-5E5B1ED6C035> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib
dyld: loaded: <46B15C22-B004-3BE3-BE18-B070FBDCF2CF> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib
...
dyld: bind: libGL.dylib:0x10489C720 = libglapi.0.dylib:__glapi_tls_Dispatch, *0x10489C720 = 0x104928108
dyld: bind: libGL.dylib:0x104894018 = libsystem_pthread.dylib:___chkstk_darwin, *0x104894018 = 0x1994FA5E4
dyld: bind: libGL.dylib:0x104894020 = libsystem_c.dylib:___stack_chk_guard, *0x104894020 = 0x20482C320
dyld: bind: libGL.dylib:0x104894028 = libsystem_c.dylib:___stderrp, *0x104894028 = 0x1F841BFA0
dyld: bind: libGL.dylib:0x10489C708 = libdyld.dylib:__tlv_bootstrap, *0x10489C708 = 0x19952169C
dyld: bind: libGL.dylib:0x104894030 = libdyld.dylib:dyld_stub_binder, *0x104894030 = 0x19951BBF8
dyld: bind: libGL.dylib:0x104894000 = libX11.6.dylib:__XLockMutex_fn, *0x104894000 = 0x104A21EC8
dyld: bind: libGL.dylib:0x104894008 = libX11.6.dylib:__XUnlockMutex_fn, *0x104894008 = 0x104A21ED0
dyld: bind: libGL.dylib:0x104894010 = libX11.6.dylib:__Xglobal_lock, *0x104894010 = 0x104A21EB0
...
dyld: loaded: <FEE476A4-722C-32E9-8AEF-E9F475BDD03A> /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLEngine.bundle/GLEngine
dyld: loaded: <9202ACAB-D360-3F63-90C1-3CAB807A279D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLProgrammability.dylib
dyld: loaded: <A66467D5-806E-33EC-98A5-CF2E04E978E5> /System/Library/Extensions/AppleMetalOpenGLRenderer.bundle/Contents/MacOS/AppleMetalOpenGLRenderer
dyld: fixup: AppleMetalOpenGLRenderer:0x2a1aa8000 = 0x19959700c
dyld: fixup: AppleMetalOpenGLRenderer:0x2a1aa8008 = 0x19957e3cc
dyld: fixup: AppleMetalOpenGLRenderer:0x2a1aa8010 = 0x19957f54c
dyld: fixup: AppleMetalOpenGLRenderer:0x2a1aa8018 = 0x1995822ec
...
dyld: loaded: <B58FF098-8789-3D4B-98FD-78A0B1F549D0> /System/Library/Frameworks/OpenGL.framework/Versions/A/Resources/GLRendererFloat.bundle/GLRendererFloat
dyld: loaded: <B7F38BA5-84F4-3FC2-BF97-EA05FEAAAD16> /System/Library/Extensions/AGXMetal13_3.bundle/Contents/MacOS/AGXMetal13_3
dyld: loaded: <9A488340-95B1-3742-9D23-6F14BEF6CCDD> /System/Library/PrivateFrameworks/IOGPU.framework/Versions/A/IOGPU
dyld: fixup: AGXMetal13_3:0x2a20ec000 = 0x1feefa078
dyld: fixup: AGXMetal13_3:0x2a20ec008 = 0x1feef9f88
dyld: fixup: AGXMetal13_3:0x2a20ec010 = 0x1f8816e90
dyld: fixup: AGXMetal13_3:0x2a20ec018 = 0x1f8816e40
...
dyld: loaded: <CF360CA0-E351-316F-A250-4D1C290B5437> /System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/libmetal_timestamp.dylib
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B8038 = OpenGL:_CGLDescribeRenderer, *0x2A06B8038 = 0x1DB4FF898
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B8260 = libsystem_malloc.dylib:_malloc, *0x2A06B8260 = 0x1993219A4
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B8138 = libsystem_c.dylib:___memset_chk, *0x2A06B8138 = 0x1994453C4
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B8058 = OpenGL:_CGLDestroyRendererInfo, *0x2A06B8058 = 0x1DB4FF850
dyld: lazy bind: libnativewindow_macosx.dylib:0x2A0638018 = SkyLight:_CGDisplayCurrentMode, *0x2A0638018 = 0x19DFFA0B8
dyld: lazy bind: libnativewindow_macosx.dylib:0x2A0638000 = CoreFoundation:_CFDictionaryGetValue, *0x2A0638000 = 0x1995822EC
dyld: lazy bind: libnativewindow_macosx.dylib:0x2A0638008 = CoreFoundation:_CFNumberGetValue, *0x2A0638008 = 0x199597234
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B8080 = OpenGL:_CGLLockContext, *0x2A06B8080 = 0x1DB4FE4E8
dyld: lazy bind: libjogl_desktop.dylib:0x2A06B80B0 = OpenGL:_CGLUnlockContext, *0x2A06B80B0 = 0x1DB4FE528
dyld: lazy bind: libvtkRenderingOpenGL2Java.jnilib:0x16F6A0E78 = libvtkRenderingOpenGL2-9.1.1.dylib:__ZN28vtkGenericOpenGLRenderWindow3NewEv, *0x16F6A0E78 = 0x287FEC204
...
I am surprised that libGL provided by macOS gets loaded after the one provided by Mesa which is said to be loaded first.
Any idea how I can prevent Metal from handling OpenGL in favor of Mesa3D?