我们有一个应用程序与多个窗口在不同的屏幕上使用3个graphics卡。 每个窗口使用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
当我尝试在同一个桌面上创build多个窗口(使用display:0.0)时,该代码工作正常。
该系统是Ubuntu 10.10,使用专有的ATI驱动程序。
有任何想法吗? 这甚至有可能吗?
从http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xml :
如果要创建的上下文不共享地址空间或由shareList指定的上下文的屏幕 ,则会生成BadMatch。
规范的措辞表明,这应该工作,如果你有直接渲染上下文,他们都是由同一个进程创建的,但实际上X服务器和/或libGL可能会有不同的想法。
使用3个图形卡
每张图形卡都有自己的状态,自己的纹理存储器等等。也许如果你在交火模式下运行,他们可以直接访问对方的内存,但是你没有提到这个。
共享资源需要像Nathan在规范中找到的公共地址空间。 但我认为这是谈论GDRAM地址空间,而不是一个单一的过程。