是否有一种方法可以在无头服务器上使用OpenGL/OpenCL互操作性来运行应用程序?可能没有硬件加速。也许使用一些库进行屏幕外渲染。
现在有很多流行的云持续集成服务,比如drone.io或travis。但是使用OpenGL/OpenCL测试项目似乎仍然是个问题。
发布于 2014-10-29 23:39:11
OpenGL/OpenCL互操作通常与OpenGL + OpenCL实现的特定组合相关联。通常,在同一个GPU驱动程序包中找到的实现是协同工作的唯一组合。
Mesa实际上有一些OpenCL支持,但老实说,我不知道它工作得有多好,它的约束是什么等等。当然,只有当有一个大规模并行化处理器可用时,例如GPU或CPU集群,OpenCL才会非常有用。英特尔有一个针对多核CPU的OpenCL实现,但我不知道它对任意的OpenGL实现有多好(如果有的话)。
如果您有一个OpenCL功能的GPU可用,那么最简单的事情是启动一个X11服务器,没有或仅仅配置了一个虚拟屏幕(是的,这是可能的)。
发布于 2022-10-27 18:56:29
肯定有办法。您可以使用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);上面的代码是关于如何做到这一点的一个相当全面的例子。我已经从我自己的项目https://github.com/kallaballa/GCV/blob/1052a3d9dda2acb1642ab695f10459f30092bf00/src/common/subsystems.hpp#L476中提取了代码,它可以在屏幕上和屏幕外进行渲染。如果您想在此回购中编译和运行OpenGL/OpenCL/VAAPI互操作演示,请重新编写自述文件。
https://stackoverflow.com/questions/26639817
复制相似问题