无法解密eglSwapBuffers函数

时间:2018-12-27 15:50:39

标签: android c++ opengl egl

我正在尝试从用户空间彻底跟踪到内核空间,以找到可以在内核空间中用手指钩住的地方,以获取有关CPU驱动程序的信息。试图稍微了解用户空间方面。我正在寻找检测帧缓冲区交换的方法,以便可以(希望)跟踪内核中的FPS。我正在使用运行Android 4.4.4和3.10.9内核的Odroid XU3。

据我所知,eglApi.cpp文件中发生了egl库中的缓冲区交换,并粘贴了以下函数EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)。现在我的问题是我无法理解此功能的工作方式。在我看来,像return s->cnx->egl.eglSwapBuffers(dp->disp.dpy, s->surface)之后,由于

使我回到相同的函数,所以递归调用自身
struct egl_t {
    #include "EGL/egl_entries.in"
};

然后从源头开始

#define EGL_ENTRY(_r, _api, ...) #_api, 
EGL_ENTRY(EGLBoolean, eglSwapBuffers, EGLDisplay, EGLSurface)

从源文件 eglApi.cpp

粘贴的完整功能(减去跟踪内容)
EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
{
    ATRACE_CALL();
    clearError();

    const egl_display_ptr dp = validate_display(dpy);
    if (!dp) return EGL_FALSE;

    SurfaceRef _s(dp.get(), draw);
    if (!_s.get())
        return setError(EGL_BAD_SURFACE, EGL_FALSE);

#if EGL_TRACE
    ...
#endif

    egl_surface_t const * const s = get_surface(draw);

    if (CC_UNLIKELY(dp->traceGpuCompletion)) {
        EGLSyncKHR sync = eglCreateSyncKHR(dpy, EGL_SYNC_FENCE_KHR, NULL);
        if (sync != EGL_NO_SYNC_KHR) {
            FrameCompletionThread::queueSync(sync);
        }
    }

    if (CC_UNLIKELY(dp->finishOnSwap)) {
        uint32_t pixel;
        egl_context_t * const c = get_context( egl_tls_t::getContext() );
        if (c) {
            // glReadPixels() ensures that the frame is complete
            s->cnx->hooks[c->version]->gl.glReadPixels(0,0,1,1,
                    GL_RGBA,GL_UNSIGNED_BYTE,&pixel);
        }
    }

    return s->cnx->egl.eglSwapBuffers(dp->disp.dpy, s->surface);
}

我希望我明显遗漏了一些东西,有人可以指出该函数在哪里执行缓冲区交换,以便我可以将兔子洞钻到我在内核空间中的安全位置。

0 个答案:

没有答案