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

时间:2011-02-23 19:14:34

标签: c++ linux opengl share openglcontext

我们有一个应用程序,使用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驱动程序。

有什么想法吗?它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

  

使用3张图片卡

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

共享资源需要像Nathan在规范中找到的公共地址空间。但我认为这是在谈论GDRAM地址空间,而不是单一过程。

相关问题