0

I am using gitlab-ci-runner to automatically test a desktop Qt/OpenGL application on every commit. On Windows 8, the application is executed by a system service installed with gitlab-ci-runner, hence it is run "hidden", i.e. on no visible desktop. All the UI modules initialize and run anyway, except the OpenGL module, which never gets an "expose" event; if I try to draw into the OpenGL context without the window being exposed I get the error:

QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined

I have found out that it is rather difficult and not recommended to execute a Windows GUI application from a service on a running desktop session (see How can a Windows service execute a GUI application?).

Now, I don't need the user to see the application, I just need the OpenGL part to work correctly. Is there a way I can "pretend" to expose a window somehow, or is there any other way to get this to run correctly from a system service?

4

1 回答 1

0

有没有一种方法可以“假装”以某种方式暴露一个窗口,或者有没有其他方法可以让它从系统服务中正确运行?

您遇到的两个问题:

  1. 如果一个窗口没有暴露,所有渲染的像素都将无法通过像素所有权测试,并且渲染变成所有像素的 NoOp。解决方法是使用一个 PBuffer 或(推荐)一个帧缓冲对象。两者都不会立即使用屏幕窗口,因此您必须更改一些代码。

  2. 在作为服务启动的 Windows 进程中,通常无法访问图形硬件,因此您受限于软件 GDI OpenGL 回退的功能(仅限于 OpenGL-1.1,因此不支持 FBO 或 PBuffer)。

如果您需要 GPU 加速,您可以投资一些网格计算 GPU 硬件(实际上每个 GPU 都可以,但驱动程序不允许它用于消费级的东西)以获得有效的 OpenGL 加速上下文。或者您可以迁移到 Linux,使用 KMS/DRI/DRM 支持的 GPU 并完全绕过任何图形系统。没有关于如何做到这一点的官方指南,但它在我的(冗长的)待办事项列表中编写这样的教程。

如果您可以在没有 GPU 加速的情况下生活,请在您的程序旁边放置带有软管道渲染器的 Mesa 的 Windows 构建.exe;Windows Mesa 软管道构建作为opengl32.dll与标准完全兼容的 API 和 ABI 提供opengl32.dll,但独立于任何图形驱动程序。它为您提供 OpenGL-3.3 支持,包括 FBO 和 PBuffer。

于 2015-08-21T13:17:38.750 回答