Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Многопоточный рендер

279
11 декабря 2006 года
bave
456 / / 07.03.2004
Проблема с адаптацией OpenGL-ого рендера под Multithread приложение.
Дело в том, что конткест рендера должен соотвествовать потоку и не
может быть использован в двух потоках разом, а мне надо в одном потоке формировать дисплейные списки и списки текстур, а в другом воспроизводить, для этого рассматривал такие варианты:
Вариант 1.:
1. Создать контекст рендера в основном потоке (для воспроизведения)
2. Создать контекст рендера в потоке загрузчика для формирования
OPen GL-ных списков.
3. Расшарить контекст в потоке загрзчика для контекста в потоке воспроизведения. - Вот этот вариант и не прокатывает - при вызове
wglShareList(...) получаю ошибку 170 (контекст занят (контекст потока воспроизведения), а при попытке его освободить на время приложение вообще вылетает).
-----------------------------
Вариант2:
1-2 - Тоже самое.
3. Скопировать информацию о дисплейных листах с контекста потока загрзчика в контекст потока воспроизведения. - тоже не катит, при
вызове wglCopyContext(...,...,GL_LIST_BIT) - опять получаю ошибку 170
----------------------------------------------------
Как решить проблему?
279
13 декабря 2006 года
bave
456 / / 07.03.2004
Проблема уже решена. Спасибо, тем кто хотябы сюда заглянул :)
391
21 декабря 2006 года
Archie
562 / / 03.02.2005
И, интересно, как же удалось это разрешить? Когда-то тоже сталкивался с проблемой расшаривания контекста между потоками...
279
26 декабря 2006 года
bave
456 / / 07.03.2004
В основном потоке создал два контекста рендера поверх
одного девайс контекста. Далее расшарил один контекст
для другого - главное: это надо сделать до того как назначить
эти контексты как текущие в потоках.
После расшаривания контекста установил первый для первого потока,
второй для воторого потока.

Код:
//Основной поток:
//...
if(!(pWindow->m_hDC = GetDC(pWindow->m_hWnd)))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL,  "Can't Create A GL Device Context", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
    if(!(PixelFormat = ChoosePixelFormat(pWindow->m_hDC, &pfd)))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL,  "Can't Find A Suitable PixelFormat", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
    if(!SetPixelFormat(pWindow->m_hDC, PixelFormat, &pfd))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL, "Can't Set The PixelFormat", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
    if(!(pWindow->m_hPrimaryRC = wglCreateContext(pWindow->m_hDC)))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL, "Can't Create The Primary GL Rendering Context", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
    if(!(pWindow->m_hSecondaryRC = wglCreateContext(pWindow->m_hDC)))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL, "Can't Create The Secondary GL Rendering Context", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }

    if(!wglShareLists(pWindow->m_hSecondaryRC, pWindow->m_hPrimaryRC))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL, "Can't Share Lists Of The Secondary GL RC", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }

    if(!wglMakeCurrent(pWindow->m_hDC, pWindow->m_hPrimaryRC))
    {
        DestroyGLWindow(pWindow);
        MessageBox(NULL, "Can't Activate The GL Rendering Context", "ERROR", MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
//...

--------------------------------------------------------------
Код:
//Во втором потоке:
    //Установить контекст рендеринга:
    if(!wglMakeCurrent(g_bw32glapp.m_hDC, g_bw32glapp.m_hSecondaryRC))
    {
        MessageBox(0, "The Rendering Context can not be maked current.", "Error", MB_OK|MB_ICONERROR);
        g_tpsMain.m_isTerminateThread = TRUE;
        SetEvent(g_tpsLoader.m_hEvent);
        return FALSE;
    }

//...

----------------------------------------------------------------
Ошибка 170 получалась потому, что я пытался расшарить контекст который уже был задействован. Контекст с которого уже транслируются
OpenGL команды нельзя ни расшарить, ни скопировать...
---------------------------------------------------------------------
Единственное, что не просёк - это почему приложение вылетало при
попытке освободить контекст задйствованный в первом потоке из вотрого
потока (судя по тому, что написанно в MSDN это возможно) - пришлось от этого отказаться и расшаривать контекст до установления его текущим.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог