//Основной поток:
//...
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;
}
//...
Многопоточный рендер
Дело в том, что конткест рендера должен соотвествовать потоку и не
может быть использован в двух потоках разом, а мне надо в одном потоке формировать дисплейные списки и списки текстур, а в другом воспроизводить, для этого рассматривал такие варианты:
Вариант 1.:
1. Создать контекст рендера в основном потоке (для воспроизведения)
2. Создать контекст рендера в потоке загрузчика для формирования
OPen GL-ных списков.
3. Расшарить контекст в потоке загрзчика для контекста в потоке воспроизведения. - Вот этот вариант и не прокатывает - при вызове
wglShareList(...) получаю ошибку 170 (контекст занят (контекст потока воспроизведения), а при попытке его освободить на время приложение вообще вылетает).
-----------------------------
Вариант2:
1-2 - Тоже самое.
3. Скопировать информацию о дисплейных листах с контекста потока загрзчика в контекст потока воспроизведения. - тоже не катит, при
вызове wglCopyContext(...,...,GL_LIST_BIT) - опять получаю ошибку 170
----------------------------------------------------
Как решить проблему?
Проблема уже решена. Спасибо, тем кто хотябы сюда заглянул :)
И, интересно, как же удалось это разрешить? Когда-то тоже сталкивался с проблемой расшаривания контекста между потоками...
одного девайс контекста. Далее расшарил один контекст
для другого - главное: это надо сделать до того как назначить
эти контексты как текущие в потоках.
После расшаривания контекста установил первый для первого потока,
второй для воторого потока.
Код:
--------------------------------------------------------------
Код:
//Во втором потоке:
//Установить контекст рендеринга:
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;
}
//...
//Установить контекст рендеринга:
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 это возможно) - пришлось от этого отказаться и расшаривать контекст до установления его текущим.