eglWaitSyncKHR 和 eglWaitClientKHR 的区别。eglWaitClientKHR用于阻塞cpu。eglWaitSyncKHR用于阻塞gpu。 EGL_KHR_wait_sync
status_t GLESRenderEngine::drawLayers
阻塞gpu的场景是,多buffer级联,比如drawdrawLayers。 layer的生产来自多gl线程,drawdrawLayers对layer的消费又在单独线程。
drawdrawLayers要等待layer绘制完成。就存在两种方案了,一种是cpu等待,一种是gpu等待。 两种方案看硬件支持情况存在降级的可能具体的看。status_t GLESRenderEngine::drawLayers(源码地址 native-refs_heads_android10-gsi/libs/renderengine/gl/GLESRenderEngine.cpp)
eglWaitSyncKHR(mEGLDisplay, sync, 0);
EGLint error = eglGetError();
if(error != EGL_NO_ERROR){ //GPU等待了失败走CPU等待
sync_wait(bufferFence.get(), -1);
}
GPU是如何等待的呢?
可能的机制是cpu走 eglCreateSyncKHR入参传null代表新建一个EGLSyncKHR,并会向glcommndbuffer中插入一个fence标记, 当gpu执行到fence时会唤醒所有wait端,完成gpu和cpu的同步。
//从已有fenceid中获得EGLSyncKHR 并让GPU等待GPU
EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fenceFd.release(), EGL_NONE};
EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, attribs);
eglWaitSyncKHR(mEGLDisplay, sync, 0);
//创建一个新的sync
EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, nullptr)
网友评论