如何确定哪些OpenGL方法导致回退到软件渲染?

时间:2013-06-25 00:46:22

标签: opengl opengl-es fallback

我正在编写一个OpenGL(ES)应用程序,我的设备似乎又回归到软件渲染。如何确定导致此情况发生的API调用/设备限制?

就我而言,这是在使用OpenGL ES 2.0的Raspberry Pi上进行的,但理想的答案应该适用于更广泛的OpenGL版本和操作系统。

2 个答案:

答案 0 :(得分:3)

老实说,我认为找不到合适的方法。

显卡驱动程序将为特定版本的OpenGL提供功能,据我所知,它不必为这些功能提供硬件支持,只需能够处理请求它们的应用程序。所以一张卡可以声称支持OpenGL 4,但几乎所有比OpenGL3更新的东西都可以简单地渲染软件。

您可能能够找到您希望运行的硬件的一些文档,它们将告诉您什么是硬件加速。如果做不到这一点,你可能需要简单地尝试建立你慢慢使用的功能列表,直到你开始看到它已经落后于软件渲染。

另外,你怎么知道它正在使用软件渲染,它只是性能受到打击?我想有可能虽然它确实支持硬件功能,但它确实非常糟糕。您也可能无法正确创建上下文,因此无法利用最新版本。

答案 1 :(得分:3)

如果设备支持GL_ARB_debug_output,那么调试输出可能有线索是否有软件渲染或性能不佳。

文档http://www.opengl.org/registry/specs/ARB/debug_output.txt中描述了用法 简而言之,您应该设置将接收消息的日志缓冲区或回调函数。

还有一个调试扩展http://www.opengl.org/registry/specs/KHR/debug.txt可能还存在一些。

使用KHR扩展你应该正确初始化上下文

EGLint ctx_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR,
EGL_NONE};

EGLContext *ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, ctx_attribs);

并设置回调

static void on_gl_error(enum source, enum type, uint id, enum severity, 
sizei length, const char* message, void *userParam)
{
    printf("%s\n", message);
}

static void enable_debug_callbacks(void)
{
    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR, GL_TRUE);
    glDebugMessageCallbackKHR(on_gl_error, NULL);
}

其他人可能以类似的方式工作,你应该在尝试之前检查支持的扩展,这是通过检查调用的返回来完成的。它是一个包含所有支持的扩展名列表的字符串。

glGetString(GL_EXTENSIONS);