**是否有办法在无头服务器上运行使用OpenGL/OpenCL互操作性的应用程序?**也许没有硬件加速。也许使用一些库进行屏幕外渲染。
现在有很多流行的云持续集成服务,如drone.io或travis-ci。但测试使用OpenGL/OpenCL的项目似乎仍然是一个问题。
3okqufwl1#
OpenGL/OpenCL互操作性通常与OpenGL + OpenCL实现的特定组合相关联。通常,只有在同一GPU驱动程序包中才能找到协同工作的实现组合。梅萨实际上有一些OpenCL支持,但老实说,我不知道它的工作效果如何,它的约束是什么等等。当然,OpenCL只有在你有一个大规模并行处理器可用时才是最有用的,比如GPU或CPU集群。英特尔有一个针对他们的多核CPU的OpenCL实现,但我不知道它与任意OpenGL实现的工作效果如何(如果有的话)。如果你有一个支持OpenCL的GPU,那么最简单的事情就是启动一个X11服务器,不配置或只配置一个虚拟屏幕(是的,这是可能的)。
uemypmqf2#
当然有一种方法。你可以用EGL来设置你的OpenGL上下文,而不是WindowSurface,你可以用PbufferSurface。
EGLDisplay display; EGLSurface surface; EGLContext context; //bind desktop OpenGL eglBindAPI(EGL_OPENGL_API); display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, nullptr, nullptr); //example constraints const EGLint egl_config_constraints[] = { EGL_STENCIL_SIZE, static_cast<EGLint>(8), EGL_DEPTH_SIZE, static_cast<EGLint>(16), EGL_BUFFER_SIZE, static_cast<EGLint>(32), EGL_RED_SIZE, static_cast<EGLint>(8), EGL_GREEN_SIZE, static_cast<EGLint>(8), EGL_BLUE_SIZE, static_cast<EGLint>(8), EGL_ALPHA_SIZE, static_cast<EGLint>(8), EGL_SAMPLE_BUFFERS, EGL_FALSE, EGL_SAMPLES, 0, EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_CONFORMANT, EGL_OPENGL_BIT, EGL_CONFIG_CAVEAT, EGL_NONE, EGL_NONE }; EGLint configCount; EGLConfig configs[1]; //find a fitting config eglChooseConfig(display, egl_config_constraints, configs, 1, &configCount); //set up the PbufferSurface EGLint pbuffer_attrib_list[] = { EGL_WIDTH, WIDTH, EGL_HEIGHT, HEIGHT, EGL_NONE }; surface = eglCreatePbufferSurface(display, configs[0], pbuffer_attrib_list); //setup the EGLContext const EGLint contextVersion[] = { EGL_CONTEXT_MAJOR_VERSION, 4, EGL_CONTEXT_MINOR_VERSION, 6, EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT, EGL_CONTEXT_OPENGL_DEBUG, debug ? EGL_TRUE : EGL_FALSE, EGL_NONE }; context = eglCreateContext(display, configs[0], EGL_NO_CONTEXT, contextVersion); eglMakeCurrent(display, surface, surface, context); eglSwapInterval(display, 1);
上面的代码是一个相当全面的例子,说明了如何做到这一点。我从我自己的项目www.example.com中获得了这些代码https://github.com/kallaballa/GCV/blob/1052a3d9dda2acb1642ab695f10459f30092bf00/src/common/subsystems.hpp#L476,它可以进行屏幕上和屏幕外渲染。如果你想编译和运行本repo中的OpenGL/OpenCL/VAAPI互操作演示,请参阅自述文件。
2条答案
按热度按时间3okqufwl1#
OpenGL/OpenCL互操作性通常与OpenGL + OpenCL实现的特定组合相关联。通常,只有在同一GPU驱动程序包中才能找到协同工作的实现组合。
梅萨实际上有一些OpenCL支持,但老实说,我不知道它的工作效果如何,它的约束是什么等等。当然,OpenCL只有在你有一个大规模并行处理器可用时才是最有用的,比如GPU或CPU集群。英特尔有一个针对他们的多核CPU的OpenCL实现,但我不知道它与任意OpenGL实现的工作效果如何(如果有的话)。
如果你有一个支持OpenCL的GPU,那么最简单的事情就是启动一个X11服务器,不配置或只配置一个虚拟屏幕(是的,这是可能的)。
uemypmqf2#
当然有一种方法。你可以用EGL来设置你的OpenGL上下文,而不是WindowSurface,你可以用PbufferSurface。
上面的代码是一个相当全面的例子,说明了如何做到这一点。我从我自己的项目www.example.com中获得了这些代码https://github.com/kallaballa/GCV/blob/1052a3d9dda2acb1642ab695f10459f30092bf00/src/common/subsystems.hpp#L476,它可以进行屏幕上和屏幕外渲染。如果你想编译和运行本repo中的OpenGL/OpenCL/VAAPI互操作演示,请参阅自述文件。