не может разобрать функцию eglSwapBuffers - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь тщательно проследить из пространства пользователя в пространство ядра, чтобы найти место, где я могу зацепить пальцы в пространстве ядра, чтобы получить некоторую информацию для моего драйвера процессора.Пытаясь немного понять сторону пользовательского пространства.Я ищу, чтобы обнаружить замены кадрового буфера, чтобы я мог отслеживать FPS в ядре (надеюсь).Я работаю с Odroid XU3 под управлением Android 4.4.4 и ядром 3.10.9.

Из того, что я могу сказать, происходит перестановка буфера в библиотеке egl в файле eglApi.cpp с функцией 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);
}

Я надеюсь, что упускаю что-то явно очевидное и что кто-то может указать, где эта функция выполняет перестановку буфера, такЯ могу копаться в кроличьей норе к своему безопасному месту в пространстве ядра.

...