4.2 KiB
MobileGL on Windows (WGL opengl32.dll drop-in)
On Windows, MobileGL builds as MobileGL.dll plus an identical copy named opengl32.dll. The copy
exports the WGL entry points (wglCreateContext, wglGetProcAddress, wglSwapBuffers, ...) and
the OpenGL functions. A program that loads opengl32.dll from its own directory gets MobileGL
instead of the system OpenGL driver.
When to use it
- You want to run a Windows OpenGL program (for example Minecraft through GLFW/LWJGL) on MobileGL, to test MobileGL or to compare its backends on desktop hardware.
When not to use it:
- Split rendering. On Windows only monolith is supported; the server executable is not built for Windows.
- As a system-wide driver. Do not replace
C:\Windows\System32\opengl32.dll. The drop-in works per application directory.
Build status on the current branch: building
feat/disaggregatedwith MSVC 19.38 (Visual Studio 2022 17.8) fails witherror C2610inMobileGL/MG_Util/Damage/Damage.h(a defaultedoperator==) and the same error in several Magma headers. Newer MSVC toolsets were not tested. The steps below are the ones the Windows tooling in this repository uses (tools/cts/scripts/wgl_glcts_pipeline.py); they apply once the tree builds with your compiler.
Requirements
- Windows x64, Visual Studio 2022 with the Desktop C++ workload, CMake, Python 3, Git.
- The Vulkan SDK, so that CMake's
find_package(Vulkan)finds it. - For Magma: a Vulkan driver for your GPU (
vulkan-1.dlland a vendor ICD). The SDK alone provides no GPU device. - For Espryt: Espryt on Windows always runs on ANGLE. Put matching x64
libEGL.dll,libGLESv2.dllandd3dcompiler_47.dllfrom one ANGLE build next to the program.
Build
Prepare the sources first (submodules and glslang's external sources, see building.md). Then, from the repository root:
cmake -S . -B C:\mgl-build -G "Visual Studio 17 2022" -A x64 -DMOBILEGL_BUILD_TEST=OFF -DMOBILEGL_BUILD_BENCHMARK=OFF
cmake --build C:\mgl-build --config Release --target MobileGL
Keep the build directory path short: a full build under a deep path can exceed Windows' path length
limit. The result is C:\mgl-build\Release\MobileGL.dll and C:\mgl-build\Release\opengl32.dll
(with the Ninja generator, both are directly in the build directory).
Install
Copy opengl32.dll into the directory of the executable that creates the GL context. Windows
searches the application's directory before System32, so the copy wins.
| Program | Where opengl32.dll goes |
|---|---|
A native .exe |
next to the .exe |
| A Java program (Minecraft) | next to the java.exe / javaw.exe that runs it, in the runtime's bin directory. Use a private copy of the Java runtime so other programs are not affected. |
For Espryt, put the three ANGLE DLLs in the same directory.
Configure and run
Settings are environment variables (configuration.md). Set them in the shell that starts the program, or in your launcher's environment settings:
$env:MOBILEGL_BACKEND_TYPE = "DirectVulkan"
$env:MOBILEGL_LOG_FILE_PATH = "$PWD\mobilegl.log"
MobileGL does not log to the console on Windows, and writes no log file unless
MOBILEGL_LOG_FILE_PATH is set.
How to tell it works
- The program reports
GL_RENDERER=Magma (MobileGL Core) (...)orEspryt (MobileGL Core) (...). In Minecraft, look at the F3 screen. - The log file exists and contains
Config: Active backend type set to DirectVulkan. - For Espryt, the log has
Loaded GL backend library: libGLESv2.dll/libEGL.dll. tools/wgl-smoke/has two small test programs (a hand-written WGL bootstrap and a GLFW one) that render a triangle and check it withglReadPixels. Exit code 0 means pass. Build instructions are intools/wgl-smoke/README.md.tools/cts/scripts/wgl_glcts_pipeline.pyruns the Khronos OpenGL conformance suites against the drop-in. Its preflight checks that the suite really loaded MobileGL.
If the program still reports your GPU vendor's renderer, it loaded the system opengl32.dll:
check that the copy sits next to the executable that actually creates the context.