首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL/OpenCL在无头服务器上的互操作性?

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

Stack Overflow用户
提问于 2014-10-29 20:15:02
回答 2查看 350关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-10-29 23:39:11

OpenGL/OpenCL互操作通常与OpenGL + OpenCL实现的特定组合相关联。通常,在同一个GPU驱动程序包中找到的实现是协同工作的唯一组合。

Mesa实际上有一些OpenCL支持,但老实说,我不知道它工作得有多好,它的约束是什么等等。当然,只有当有一个大规模并行化处理器可用时,例如GPU或CPU集群,OpenCL才会非常有用。英特尔有一个针对多核CPU的OpenCL实现,但我不知道它对任意的OpenGL实现有多好(如果有的话)。

如果您有一个OpenCL功能的GPU可用,那么最简单的事情是启动一个X11服务器,没有或仅仅配置了一个虚拟屏幕(是的,这是可能的)。

票数 2
EN

Stack Overflow用户

发布于 2022-10-27 18:56:29

肯定有办法。您可以使用EGL设置OpenGL上下文,而不是使用WindowSurface,您可以使用PbufferSurface。

代码语言:javascript
复制
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互操作演示,请重新编写自述文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26639817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档