JavaFX 0x300b:无法获得 EGL 表面

Posted

技术标签:

【中文标题】JavaFX 0x300b:无法获得 EGL 表面【英文标题】:JavaFX 0x300b: Could not get EGL surface 【发布时间】:2020-04-21 08:39:07 【问题描述】:

我正在尝试在嵌入式环境 (buildroot) 中的 raspaberry pi 3 上运行 javafx 示例,我想在没有 X 的情况下运行它。当我运行命令时:

/root/jre-13.0.1/bin/java  -Dfile.encoding=UTF-8 --add-modules javafx.controls,javafx.fxml -Dprism.verbose=true -Djavafx.verbose=true -Dglass.platform=Monocle -Dprism.order=es2 -Djava.library.path=/root/jre-13.0.1/lib/ -Dembedded=monocle   -jar /home/root/NetBeansProjects//JavaFXFXML/dist/JavaFXFXML.jar 

我收到以下错误:

cmd : cd '/home/root/NetBeansProjects//JavaFXFXML'; '/root/jre-13.0.1//bin/java'  -Dfile.encoding=UTF-8 --add-modules javafx.controls,javafx.fxml -Dprism.verbose=true -Djavafx.verbose=true -Dglass.platform=Monocle -Dprism.order=es2 -Djava.library.path=/root/jre-13.0.1/lib/ -Dembedded=monocle   -jar /home/root/NetBeansProjects//JavaFXFXML/dist/JavaFXFXML.jar 
JavaFX launchApplication method: launchMode=LM_JAR
Prism pipeline init order: 
es2 
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Using system sized mask for primitives
Not 
f
orcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2_monocle
Loaded /root/jre-13.0.1/lib/libprism_es2_monocle.so from java.library.path
    succeeded.
GLFactory using com.sun.prism.es2.MonocleGLFactory
Loaded /root/jre-13.0.1/lib/libglass_monocle.so from java.library.path
com.sun.glass.ui.monocle.GLException: 0x300b: Could not get EGL surface
    at javafx.graphics/com.sun.glass.ui.monocle.AcceleratedScreen.<init>(Unknown Source)
    at javafx.graphics/com.sun.glass.ui.monocle.NativePlatform.getAcceleratedScreen(Unknown Source)
    at javafx.graphics/com.sun.prism.es2.MonocleGLFactory.initialize(Unknown Source)
    at javafx.graphics/com.sun.prism.es2.ES2Pipeline.<clinit>(Unknown Source)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Unknown Source)
    at javafx.graphics/com.sun.prism.GraphicsPipeline.createPipeline(Unknown Source)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(Unknown Source)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
(X) Got class = class com.sun.prism.es2.ES2Pipeline
GraphicsPipeline.createPipeline: error initializing pipeline com.sun.prism.es2.ES2Pipeline
Graphics Device initialization failed for :  es2

我运行了 hello_triangle 和 hello_dispmanx 示例来测试 gpu 加速并且没有问题。 不知道为什么会出现Could not get EGL surface 错误,有什么办法可以调试这个错误

Java 设置:

# java --version
openjdk 13.0.1-BellSoft 2019-10-15
OpenJDK Runtime Environment (build 13.0.1-BellSoft+9)
OpenJDK Server VM (build 13.0.1-BellSoft+9, mixed mode)

【问题讨论】:

你可以试试switching off the hardware rendering pipeline and using the software rendering pipeline instead 看看是否可行。 使用 SW Pipeline 工作,我只是想尝试使用硬件加速 尝试联系您的 JDK 供应商 BellSoft 并询问他们。 【参考方案1】:

终于明白了…… 由于我使用的是 buildroot,所有树莓派用户区 (GPU) 库都在 /usr/lib 文件夹中。但是,深入单片机源代码,更准确地说是在DispmanPlatformFactory.java,我们可以看到它们匹配平台的方式是在/opt/vc/lib 中搜索libbcm_host.so,这在buildroot 配置中不存在。对于那些使用 buildroot 的人来说,一个快速的解决方法是在 /opt/vc/lib 中创建一个指向 libbcm_host.so 的符号链接

【讨论】:

以上是关于JavaFX 0x300b:无法获得 EGL 表面的主要内容,如果未能解决你的问题,请参考以下文章

EGL:创建 pBuffer 表面时是不是会创建 FBO?

egl离屏渲染中的pbuffer vs fbo

我的OpenGL学习进阶之旅EGL简介

我的OpenGL学习进阶之旅EGL简介

Android OpenGL 开发---EGL 的使用

EGL_emulation 无法建立与主机的连接 - android