2

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を使用)。

システムはubuntu10.10で、独自のATIドライバーを使用しています。

何か案は?それも可能ですか?

4

2 に答える 2

1

3枚のグラフィックカードを使用

各グラフィック カードには独自の状態、独自のテクスチャ メモリなどがあります。Crossfire モードで実行している場合、お互いのメモリに直接アクセスできるかもしれませんが、それについては何も言われていません。

Nathan が仕様で見つけたように、リソースを共有するには共通のアドレス空間が必要です。しかし、これは単一のプロセスではなく、GDRAM アドレス空間について話していると思います。

于 2011-02-23T23:17:51.637 に答える
1

http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xmlから:

作成されるコンテキストが、shareList で指定されたコンテキストのアドレス空間または画面を共有しない場合、BadMatch が生成されます。

仕様の文言は、ダイレクト レンダリング コンテキストがあり、それらがすべて同じプロセスで作成されている場合にこれが機能することを示唆していますが、実際には、X サーバーや libGL の考え方が異なる場合があります。

于 2011-02-23T20:17:50.310 に答える