使用 ubuntu 在不同的显示器上共享 opengl 上下文

Posted

技术标签:

【中文标题】使用 ubuntu 在不同的显示器上共享 opengl 上下文【英文标题】:sharing opengl context on different displays using ubuntu 【发布时间】:2011-02-23 19:14:34 【问题描述】:

我们有一个应用程序,它使用 3 个显卡在不同屏幕上具有多个窗口。每个窗口都使用 opengl 来渲染字体、图像等... 到目前为止,这工作得很好,除了共享资源。我们试图实现这样的东西(fenster 是一个自定义类,用于存储上下文等信息......):

//a list of display names
vector<string> displays;
displays.push_back(":0.0");
displays.push_back(":0.1");
displays.push_back(":0.2");
displays.push_back(":0.3");    
displays.push_back(":0.4");


//and then we loop them
FOREACH(string dispName in displays): //dummy code

static int dblBuf[]  = GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None;

Display* disp;
if(dispName != "default")
    disp = XOpenDisplay(dispName.c_str());
else
    disp = XOpenDisplay(NULL);

if(disp == NULL)

    cout << "ERROR GETING DISPLAY " << dispName << endl;
    return NULL;


cout << "CREATING WINDOW ON SCREEN "<< dispName << endl;

XVisualInfo *vi = glXChooseVisual(disp, DefaultScreen(disp), dblBuf);

fenster->display = disp;

fenster->window = XCreateSimpleWindow(disp, RootWindow(disp, vi->screen), 1, 1, 500, 500, 0, BlackPixel (disp, 0), BlackPixel(disp, 0));

XSetStandardProperties(fenster->display, fenster->window, "main", "main", None,NULL, 0, NULL);

XMapWindow(disp, fenster->window);

if(fensterList.size()==0)
    fenster->glXContext = glXCreateContext(disp, vi, NULL, GL_TRUE);
else
    fenster->glXContext = glXCreateContext(fensterList[0]->display, vi, fensterList[0]->glXContext, GL_TRUE);

XSelectInput(disp, fenster->window, ButtonPressMask|KeyPressMask);

glXMakeCurrent(disp, fenster->window, fenster->glXContext);

glEnable(GL_DEPTH_TEST);
glClearColor(0.0, 0.0, 0.0, 0.0);

XFlush(disp);

fenster->id = fensterList.size();

fensterList.push_back(fenster);

fenster->setup();

这可以正常编译,但在运行时会产生以下错误:

CREATING WINDOW ON SCREEN :0.0
CREATING WINDOW ON SCREEN :0.1
X Error of failed request: BadMatch (invalid parameter attributes)
  Major opcode of failed request: 137 (GLX)
  Minor opcode of failed request: 3 (X_GLXCreateContext)
  Serial number of failed request: 90
  Current serial number in output stream: 91

当我尝试在同一个桌面上创建多个窗口(使用 display :0.0)时,该代码有效。

系统是ubuntu 10.10,使用专有的ATI驱动。

有什么想法吗?有没有可能?

【问题讨论】:

【参考方案1】:

来自http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xml:

如果要创建的上下文不会生成,则会生成 BadMatch 共享由 shareList 指定的上下文的地址空间或屏幕

规范的措辞表明,如果您有直接的渲染上下文并且它们都是由同一个进程创建的,那么这应该可以工作,但实际上 X 服务器和/或 libGL 可能会有不同的想法。

【讨论】:

【参考方案2】:

使用 3 个显卡

每张显卡都有自己的状态,自己的纹理内存等。也许如果你在 Crossfire 模式下运行,他们可以直接访问彼此的内存,但你没有说什么。

共享资源需要一个公共地址空间,正如 Nathan 在规范中发现的那样。但我认为这是在谈论 GDRAM 地址空间,而不是单个进程。

【讨论】:

谢谢,我想可能是这样。但是,当尝试在同一张显卡但两个不同的屏幕上共享上下文时,代码仍然无法正常工作。这也是一种限制吗?这些卡目前没有在交火中运行,但我们可以设置它。至少对于他们两个。但我想,我们可能会更好地将所有资源发送到每张卡上。 在同一张卡控制的两个不同屏幕之间听起来理论上应该是可能的,但可能无法实现。想知道在同一卡上的屏幕之间共享是否适用于操作系统和驱动程序版本的其他组合,我怀疑至少有几个驱动程序支持它。

以上是关于使用 ubuntu 在不同的显示器上共享 opengl 上下文的主要内容,如果未能解决你的问题,请参考以下文章

宿主机共享文件夹给不同Linux虚拟机的方法

如何在 Ubuntu 和 Linux Mint 上启用桌面共享

编译在ubuntu中生成共享对象文件

ubuntu系统虚拟机下共享文件夹

VMware Workstation 11 中 Ubuntu 14.04 的 VMware Tools 问题 :没有显示共享文件夹

Ubuntu系统上局域网的设置