MSVC-2015 unit-tests совместно с OpenGL
От: AlexGin Беларусь  
Дата: 02.11.16 11:45
Оценка:
Доброе время суток, уважаемые коллеги!

Вчера вечером, я и мои товарищи по работе столкнулись с проблемой:
Используя Visual Studio 2015 — делаем юнит-тест, как описано здесь https://msdn.microsoft.com/en-us/library/hh598953.aspx
Наш проект, использующий OpenGL (freeglut, etc.), не работает нормально.
Но процедура , которая должна запускать отрисовку в окне не запускается, почему — неизвестно.

    glutSetWindow(m_hWindow); 
    glutPostRedisplay(); // команда на отрисовку 
    glutMainLoopEvent(); // пройти один цикл обработки glut сообщений


Сам OpenGL не вызывает зарегистрированной call-back функции:
    glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!


Всё работает в одном thread-е (многопточность блокирована).
OS Windows-7 / 64 (+SP1).
В обычном консольном проекте, также как и в MFC/Qt приложении всё работает нормально.
Проект опробован — на MFC приложении: там всё работает, как швейцарские часы

Заранее благодарны за любые мысли!
Возможно, есть какие-либо настройки и опции для Visual Studio 2015 юнит-тест подсистемы?

P.S. замечу что:
   m_hWindow = glutCreateWindow("Model Window"); // возвращает валидный "хендл"

При исполнении приложения — никаких run-time errors нет; все коды возврата — валидные;
exceptions — также нет, однако вышеуказанная проблема — есть.
Re: MSVC-2015 unit-tests совместно с OpenGL
От: uzhas Ниоткуда  
Дата: 02.11.16 12:07
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Сам OpenGL не вызывает зарегистрированной call-back функции:

AG>
AG>    glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!
AG>



предположу, что что-то не проинициализировали в коде теста
можете дать минимальный код теста, чтобы погонять у себя? пусть рисуется что угодно, хоть черный квадрат
Re: MSVC-2015 unit-tests совместно с OpenGL
От: turbocode  
Дата: 02.11.16 15:39
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>P.S. замечу что:

AG>
AG>   m_hWindow = glutCreateWindow("Model Window"); // возвращает валидный "хендл"
AG>


Очевидно что попробовать без glut:
   
   HDC hdc = ::GetDC(hwnd);
   PIXELFORMATDESCRIPTOR pixel_format = {sizeof(PIXELFORMATDESCRIPTOR), ... };
   int pixel_format_id = ::ChoosePixelFormat(hdc, &pixel_format);
   ::SetPixelFormat(hdc, pixel_format_id, &pixel_format);

   HGLRC hglrc = wglCreateContext(hdc); 
   wglMakeCurrent (hdc, hglrc);

   //call OpenGL APIs as desired ...
Re[2]: MSVC-2015 unit-tests совместно с OpenGL
От: AlexGin Беларусь  
Дата: 03.11.16 07:19
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, AlexGin, Вы писали:


AG>>Сам OpenGL не вызывает зарегистрированной call-back функции:

AG>>
AG>>    glutDisplayFunc(DisplayGL); // наша DisplayGL не вызывается!!!
AG>>


U>предположу, что что-то не проинициализировали в коде теста

Предположение — ошибочно, так как точно такой же код, только в виде command-line Win32 application — нормально работает.

U>можете дать минимальный код теста, чтобы погонять у себя? пусть рисуется что угодно, хоть черный квадрат

Это довольно большие и закрученные куски кода. Вытаскивать что-то минимальное непросто
Тем не менее, спасибо, уважаемый uzhas, за желание помочь!
Re[2]: MSVC-2015 unit-tests совместно с OpenGL
От: AlexGin Беларусь  
Дата: 03.11.16 09:25
Оценка:
Здравствуйте, turbocode, Вы писали:

T>Здравствуйте, AlexGin, Вы писали:


AG>>P.S. замечу что:

AG>>
AG>>   m_hWindow = glutCreateWindow("Model Window"); // возвращает валидный "хендл"
AG>>


T>Очевидно что попробовать без glut:

T>
   
T>   HDC hdc = ::GetDC(hwnd);
T>   PIXELFORMATDESCRIPTOR pixel_format = {sizeof(PIXELFORMATDESCRIPTOR), ... };
T>   int pixel_format_id = ::ChoosePixelFormat(hdc, &pixel_format);
T>   ::SetPixelFormat(hdc, pixel_format_id, &pixel_format);

T>   HGLRC hglrc = wglCreateContext(hdc); 
T>   wglMakeCurrent (hdc, hglrc);

T>   //call OpenGL APIs as desired ... 
T>

Нет, делать весь glut "вручную" — ИМХО не самое правильное решение

P.S. Удалось пофиксить данную проблему
Ларчик просто открывался:
Раскоментировали вызов функции glutShowWindow() — показать окно,
в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.
Re[3]: MSVC-2015 unit-tests совместно с OpenGL
От: turbocode  
Дата: 03.11.16 10:23
Оценка:
Здравствуйте, AlexGin, Вы писали:
AG>в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.

Логично, потому что тесты почти всегда не визуальны.
Re[3]: MSVC-2015 unit-tests совместно с OpenGL
От: VTT http://vtt.to
Дата: 03.11.16 10:31
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Ларчик просто открывался:

AG>Раскоментировали вызов функции glutShowWindow() — показать окно,
AG>в юнит-тесте почему-то окно по умолчанию "скрыто", в других проектах она была закомментирована и всё работало нормально.

Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется.
Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[4]: MSVC-2015 unit-tests совместно с OpenGL
От: turbocode  
Дата: 03.11.16 11:45
Оценка:
VTT>Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется.
VTT>Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.

Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат.
Re[5]: MSVC-2015 unit-tests совместно с OpenGL
От: AlexGin Беларусь  
Дата: 03.11.16 11:57
Оценка:
Здравствуйте, turbocode, Вы писали:

VTT>>Наверное процесс, выполняющий тест, запускается с указанием SW_HIDDEN в STARTUPINFO, соответственно окно по-умолчанию не появляется.

VTT>>Если этот тест просто на отрисовку, то имеет смысл вообще не создавать никаких окон.

T>Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат.

А насколько это возможно для OpenGL?
Re[6]: MSVC-2015 unit-tests совместно с OpenGL
От: turbocode  
Дата: 03.11.16 12:48
Оценка:
T>>Мне также думается что показывать окно это неверный путь, нужно рисовать в память (а не на окно) и сравнивать результат.
AG>А насколько это возможно для OpenGL?

glReadPixels (еще лучше Pixel Buffer Objects[PBO], если версия OpenGL позволяет) на бэкбуффер, как то так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.