Я пытаюсь тщательно проследить из пользовательского пространства в пространство ядра, чтобы найти место, где я могу зацепить пальцы в пространстве ядра, чтобы получить некоторую информацию для моего драйвера процессора. Пытаясь немного понять сторону пользовательского пространства. Я ищу, чтобы обнаружить замены кадрового буфера, чтобы я мог отслеживать 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);
}
Я надеюсь, что мне не хватает чего-то явно очевидного, и что кто-то может указать, где эта функция выполняет замену буфера, чтобы я мог копаться в кроличьей норе в направлении моего безопасного места в пространстве ядра.
Задача ещё не решена.
Других решений пока нет …