Skip to content

A wrapper DLL draws nothing under Wine on macOS, and its log says "version '130' is not supported" ​

Symptoms ​

A wrapper that draws with OpenGL opens its window, but every pixel stays black. Its log shows OpenGL 2.1 Metal - 90.5, then a shader error: version '130' is not supported. Calls that do not draw still work.

Cause ​

Wine's macOS driver gives wglCreateContext an OpenGL 2.1 context, which has GLSL up to 1.20 (observed). macOS gives OpenGL 3.2 and later only as a forward-compatible core profile (observed). A request for a core profile without the forward-compatible flag returns no context (observed).

Evidence ​

glidetest.exe under Wine on an Apple M3 Max. With GLIDE_LOG set, the log showed OpenGL 2.1 Metal. Then wglCreateContextAttribsARB with version 3.2 and the core profile returned null. With WGL_CONTEXT_FLAGS_ARB set to WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB it returned a context that reports OpenGL 4.1 Metal, and all 27 checks of the test passed.

What to do ​

Create the plain context. If GL_VERSION is below 3, create a core context with wglCreateContextAttribsARB, with the forward-compatible flag (0x2094 = 2) and the core profile (0x9126 = 1), and make it current. Compile the shaders as GLSL 1.50 there. Bind a vertex array object before drawing, as a core context draws nothing without one. Keep line widths at 1, as a forward-compatible context refuses wider lines. wrappers/glide/src/window.rs (core_context) does this. The other choice is shaders in GLSL 1.20, as wrappers/sgl has.

Tried ​

  • A 3.2 core profile without the forward-compatible flag: no context.
  • Loading glGenVertexArrays in the function table of a 2.1 context: missing, so the table fails to load. Load it apart, only in a core context.

Code: Apache 2.0. Content: CC0 1.0. No game material: bring your own copy.