2014-04-12 3 views
0

주 창이있는 응용 프로그램이 있습니다. 그것은 자신의 스레드와 OpenGL 컨텍스트를 가지고 있습니다. 이 응용 프로그램에는 소프트웨어 렌더링 텍스처를 만들고 업로드하기 위해 프로세서 당 하나의 작업자 스레드가 있습니다. 이것은 완벽하게 잘 작동합니다.단일 창 device_context, 다중 OpenGL 컨텍스트

제 걱정은 작업자 스레드의 OpenGL 컨텍스트가 주 창의 device_context로 생성된다는 것입니다. 따라서 이중 프로세서 시스템의 경우, 이는 3 개의 OpenGL 컨텍스트가 동일한 창 device_context에 바인드된다는 것을 의미합니다. 그것들은 모두 메인 윈도우 스레드에서 생성 된 다음 공유리스트가 호출되어 텍스처를 공유하게하고, 각각의 gl_context는 메인 윈도우 스레드를위한 하나의 스레드, 각 워커 스레드를위한 하나의 스레드에서만 활성화됩니다.

이전에 썼듯이 이것은 테스트 한 모든 컴퓨터에서 완벽하게 작동하지만 내가하고있는 일을 설명하는 문서는 보지 못했으며 내가하고있는 일이 잘되어 있다는 유일한 확인을 보았습니다. 이 링크에 대한 마지막 코멘트는 OpenGL multiple rendering contexts in one window입니다.

그래서 누군가가 이것이 모든 시스템에서 작동한다는 확인을 알기를 바랬습니다.

편집 : 이전에 언급 한 것을 잊어 버렸지 만 한 가지 문제가 있습니다. 두 작업자 스레드가 모두 wglmakecurrent (common_window_device_context, private_opengl_context)를 호출하면 그 중 하나가 glgeterror = GL_INVALID_OPERATION으로 실패합니다. 이 경우 솔루션은 sleep (1)을 호출하여 다른 스레드의 동일한 호출에 대한 시간을 허용하고 wglmakecurrent를 다시 호출 한 다음 모든 것이 매우 부드럽게 작동합니다. 적어도 테스트 한 모든 컴퓨터에서.

+1

나는이 문제에 대한 해결책을 취하지 않겠다. 실제 임계 영역에서 두 스레드가 동시에이 작업을 수행하지 못하게하려고합니다. –

+0

좋은 점은 금요일에 구현 한 빠른 수정으로 월요일에 할 수 있습니다. 그래도 주요 질문에 어떤 생각? 최소한의 자원을 사용하고 작동하는 것처럼 보이지만 ?? – Marladu

답변

1

그래서 누군가가 이것이 모든 시스템에서 작동한다는 것을 알고 있었으면합니다.

동일한 장치 컨텍스트에서 다른 스레드의 OpenGL 컨텍스트를 여러 개 사용하는 것은 완벽합니다. 최악의 상황은 OpenGL 동기화 지점의 상호 작용이 심각한 성능 문제와 정의되지 않은 렌더링 결과를 생성한다는 것입니다. 여러 OpenGL 컨텍스트에서 렌더링 호출을하는 경우에만 문제가됩니다. 그러나 I/O 작업 (예 : VBO 데이터의 텍스처로드)을 위해 이들을 사용하려는 것 같습니다. 렌더링 스레드에서 오지 않는 한 작업자 스레드가 조작하는 데이터 객체를 참조하지 않으면 동기화 지점의 부작용이 발생하지 않으며 사용자는 명확합니다.

다중 컨텍스트 상호 작용의 정확한 의미는 OpenGL-3 및 이후 사양에서 정의됩니다. 나는 당신이 그것을 읽는 것이 좋습니다.

+0

답해 주셔서 감사합니다. – Marladu