Qt / OpenGL:绘制到非暴露窗口

时间:2015-08-21 12:41:36

标签: windows qt opengl gitlab-ci gitlab-ci-runner

我正在使用gitlab-ci-runner在每次提交时自动测试桌面Qt / OpenGL应用程序。在Windows 8上,应用程序由安装有gitlab-ci-runner的系统服务执行,因此它运行"隐藏",即在没有可见的桌面上。无论如何,所有的UI模块都会初始化和运行,除了OpenGL模块,它永远不会得到"暴露"事件;如果我试图在不暴露窗口的情况下绘制到OpenGL上下文中,我会收到错误:

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

我发现在运行的桌面会话中从服务执行Windows GUI应用程序是相当困难的,不建议这样做。(参见How can a Windows service execute a GUI application?)。

现在,我不需要用户查看应用程序,我只需要OpenGL部分就能正常工作。有没有办法可以"假装"以某种方式公开窗口,还是有其他方法让它从系统服务正确运行?

1 个答案:

答案 0 :(得分:0)

  

有没有办法可以"假装"以某种方式公开窗口,还是有其他方法让它从系统服务正确运行?

您遇到的两个问题:

  1. 如果窗口未曝光,则渲染的所有像素都将失败像素所有权测试,渲染将变为所有像素的NoOp。解决方法是使用一个PBuffer或(推荐)一个帧缓冲对象。它们都不会立即使用屏幕窗口,因此您必须更改一些代码。

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

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

    如果您可以在没有GPU加速的情况下继续使用,请使用您的程序.exe旁边的softpipe渲染器删除Windows版本的Mesa; Windows Mesa softpipe版本以opengl32.dll完全API和ABI与标准opengl32.dll兼容,但独立于任何图形驱动程序。它为您提供OpenGL-3.3支持,包括FBO和PBuffers。

相关问题