OpenGL/OpenCL在无头服务器上的互操作性?

w9apscun  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(131)

**是否有办法在无头服务器上运行使用OpenGL/OpenCL互操作性的应用程序?**也许没有硬件加速。也许使用一些库进行屏幕外渲染。

现在有很多流行的云持续集成服务,如drone.io或travis-ci。但测试使用OpenGL/OpenCL的项目似乎仍然是一个问题。

3okqufwl

3okqufwl1#

OpenGL/OpenCL互操作性通常与OpenGL + OpenCL实现的特定组合相关联。通常,只有在同一GPU驱动程序包中才能找到协同工作的实现组合。
梅萨实际上有一些OpenCL支持,但老实说,我不知道它的工作效果如何,它的约束是什么等等。当然,OpenCL只有在你有一个大规模并行处理器可用时才是最有用的,比如GPU或CPU集群。英特尔有一个针对他们的多核CPU的OpenCL实现,但我不知道它与任意OpenGL实现的工作效果如何(如果有的话)。
如果你有一个支持OpenCL的GPU,那么最简单的事情就是启动一个X11服务器,不配置或只配置一个虚拟屏幕(是的,这是可能的)。

uemypmqf

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互操作演示,请参阅自述文件。

相关问题