Несколько окон с общим контекстом

В настоящее время у меня есть реализация, которая работает на всех видеокартах, кроме Mobile Intel GM45. К сожалению, когда я пытаюсь позвонить wglMakeCurrent(sDC, sRC); на указанной видеокарте он полностью вылетает. У меня нет физического доступа к этой видеокарте.

В моем методе я использую то же самое sRC основанный на первом sDC,

Теперь я прочитал, что "если оба окна используют один и тот же пиксельный формат, используйте 1 контекст GL для обоих окон" ( http://www.opengl.org/wiki/Platform_specifics:_Windows), что вы можете сделать это с помощью Единый контекст и несколько окон (DC) и, как уже говорилось, моя реализация отлично работает на всех других видеокартах.

static HDC sDC = NULL;
static HGLRC sRC = NULL;
static HWND sOldWindow = NULL;

void GfxReset(HWND newWindow) {
    if (sCurrentWindow != newWindow) {
         if (sDC) {
            AssertWGL(wglMakeCurrent(sDC, NULL));
            AssertWGL(ReleaseDC(sCurrentWindow, sDC));
        }

        sDC = GetDC(newWindow);
        Assert(sDC);

        PrepareDC(sDC);

        //Create the render context.
        if (!sRC) {
            sRC = wglCreateContext(sDC);
            Assert(sRC);
        }

        AssertWGL(wglMakeCurrent(sDC, sRC)); // CRASH (not assertion)

        sCurrentWindow = newWindow;
    }
}

static void PrepareDC(HDC hDC) {
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cDepthBits = 16;
    pfd.cStencilBits = 8;
    pfd.iLayerType = PFD_MAIN_PLANE;
    int format = ChoosePixelFormat(hDC, &pfd);
    Assert(format);
    Assert(SetPixelFormat(hDC, format, &pfd));
}

Я знаю, что я мог бы реализовать это, используя несколько контекстов и используя wglShareLists, Я не хочу идти по этому пути из-за необходимости рефакторинга большого количества кода в отношении загрузки активов и тому подобного.

Есть ли способ реализовать несколько окон в OpenGL, используя один контекст, чтобы значительно упростить создание текстур. В противном случае я должен был бы знать обо всех окнах в моем приложении и иметь те wglShareLists быть предварительно примененным, прежде чем я начал загружать текстуры, правильно?

РЕДАКТИРОВАТЬ: я также пытался реализовать wglCreateContextAttribsARB следующим образом: http://www.opengl.org/wiki/Tutorial%3A_OpenGL_3.1_The_First_Triangle_%28C%2B%2B/Win%29 однако сбой драйвера происходит при самом вызове.

1 ответ

Прежде всего, позвольте мне рассказать вам, как это здорово, что вы стремитесь к повторному использованию контекста. Однако, если вам нужно обойти ошибки драйвера (то, с чем вы сталкиваетесь, что вы никогда не должны делать, программа никогда не приводит к сбою программы. В худшем случае просто выдает ошибку), тогда хорошо, обойдите ее, используя wglShareLists.

Совершенно нормально объединить два пространства имен контекста, если нет столкновений идентификаторов объектов. Это означает, что ваш основной контекст уже может быть загружен текстурами и ресурсами, если контекст, в который вы объединяете пространство имен, является "девственным". Тогда все существующие активы "старого" контекста появятся и в новом.


Что-то, что я заметил в вашем коде: Вы написали: wglMakeCurrent(sDC, NULL) что предполагает, что у вас есть концепция, что RC OpenGL был каким-то образом "связан" с доступным для рисования DC. Это не то, что происходит. Ассоциация на самом деле между контекстами и потоками. Рекомендуемый вызов будет wglMakeCurrent(NULL, NULL)и, честно говоря, я даже не знаю, является ли результат wglMakeCurrent(<someDC not NULL>, NULL) на самом деле определяется. Может быть, это на самом деле причина вашей проблемы.

Другие вопросы по тегам