如何在客户端代码中设置_EGLDisplay的PlatformDisplay成员?
问题分析与解决方案
错误原因
你遇到的编译错误本质是EGLDisplay是EGL规范定义的不透明指针(void*类型),它的内部结构(比如Mesa的_EGLDisplay)属于实现细节,并未在公开头文件中暴露,因此直接通过egl_display.PlatformDisplay访问内部成员是不符合EGL设计规范的,也必然会编译失败。
正确解决方法
实际上你完全不需要手动设置PlatformDisplay——在调用eglGetPlatformDisplayEXT时,你已经将Wayland的display作为第二个参数传入,EGL实现(比如Mesa)内部会自动完成EGLDisplay与Wayland display的关联工作。直接删除引发错误的那一行代码即可:
EGLDisplay egl_display; EGLConfig egl_config; EGLContext egl_context; egl_display = eglGetPlatformDisplayEXT(EGL_PLATFORM_WAYLAND_EXT, display, NULL); if (egl_display == EGL_NO_DISPLAY) { fprintf(stderr, "Failed to create EGL display\n"); goto error; } // 移除这一行:egl_display.PlatformDisplay = display; if (eglInitialize(egl_display, NULL, NULL) == EGL_FALSE) { fprintf(stderr, "Failed to initialize EGL\n"); goto error; }
关于依赖内部结构的风险
如果出于特殊需求你一定要访问Mesa的内部_EGLDisplay结构,虽然可以尝试包含Mesa私有头文件(比如src/egl/main/egldisplay.h),但这种做法会导致你的代码完全依赖Mesa的实现细节,无法兼容其他EGL实现(比如NVIDIA的EGL驱动),而且Mesa的内部结构随时可能变更,代码稳定性无法保证,强烈不推荐。
内容的提问来源于stack exchange,提问作者Pavel Samsonov
相关产品推荐
相关产品推荐

