2011-02-23 49 views
2

我們有一個應用程序在不同的屏幕上使用3個圖形卡的多個窗口。每個窗口使用opengl來渲染字體,圖像等... 迄今爲止,它的工作非常好,除了共享資源。我們試圖實現這樣的事情(是站住腳存儲喜歡的上下文信息的自定義類,等...):使用ubuntu在不同的顯示器上共享opengl上下文

//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可能會有不同的想法。

1

使用3個顯卡

每個圖形卡都有自己的狀態,自身的紋理內存,等等也許如果你在交火模式下運行,他們可以直接訪問彼此的記憶,但你還沒有說過這些。

共享資源需要像Nathan在規範中找到的公共地址空間。但我認爲這是談論GDRAM地址空間,而不是一個單獨的過程。

+0

謝謝,我認爲可能是這種情況。但是,當試圖在相同的圖形卡上共享上下文但兩個不同的屏幕時,代碼仍然不起作用。這也是一個限制嗎?目前這些卡沒有在交火中運行,但我們可以設置它。至少有兩個人。但我想,我們可能會更好地發送所有資源到每張卡。 – underdoeg 2011-02-24 00:00:20

+0

在由同一張卡控制的兩個不同屏幕之間聽起來像理論上應該是可能的,但可能無法實現。有興趣知道在同一張卡上的屏幕之間共享是否可以在其他操作系統和驅動程序版本的組合上工作,我懷疑至少有幾個驅動程序支持它。 – 2011-02-24 00:10:41

相關問題