先检测当前 DLL 的 EGL 能力,再选择独立 EGL 上下文或普通 RenderTarget 回退;不要在主渲染帧内嵌套创建 EGL 上下文。
EGL 是 OpenGL ES 的平台接口层。XGE 将 EGL 能力探测、显式 EGL 上下文和普通 RenderTarget 回退分开:先探测当前构建是否包含 PBuffer 或 Surfaceless 支持,再决定是否创建独立上下文。绝大多数窗口应用只需要 RenderTarget;它不需要嵌套 EGL 上下文。
| 函数 | 说明 |
|---|---|
xgeEGLCapsGet | 查询当前编译的 EGL、PBuffer、Surfaceless 和 native-window 能力。 |
xgeEGLInit | 在应用初始化阶段创建独立 EGL 上下文。 |
xgeEGLMakeCurrent | 将已创建的 EGL 上下文绑定到当前线程。 |
xgeOffscreenInit | 初始化离屏封装;不应在已有主渲染帧中嵌套调用。 |
gcc -O2 -I. -o build\ch98_main1.exe examples\tutorial_capture\ch98_main1.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
build\ch98_main1.exe --capture tutorial\img\ch98_1.pngxge_egl_caps_t caps = { 0 };
xgeEGLCapsGet(&caps);
if (caps.bCompiled && caps.bPBuffer) {
// 在应用初始化阶段创建独立 PBuffer 上下文。
xge_egl_desc_t desc = { 0 };
desc.iWidth = 512; desc.iHeight = 512; desc.bPBuffer = 1;
} else {
// 普通窗口应用使用 xgeRenderTargetCreate 作为跨平台回退。
}权威源码位于 examples/tutorial_capture/ch98_main1.c。它只调用 xgeEGLCapsGet,将 compiled、offscreen、PBuffer、surfaceless 与 native-window 能力显示成状态卡,并显示始终可选的 RenderTarget 回退。这样截图证明的是当前 DLL 的真实能力,而不是在桌面窗口中伪造一个成功的第二上下文。
xgeRun 帧回调中反复调用 xgeOffscreenInit 或 xgeEGLInit。XGE_ERROR_UNSUPPORTED 作为正常分支处理。bPBuffer 选择 EGL PBuffer 或 RenderTarget 回退,并记录选择结果。