美文网首页
eglWaitSyncKHR 和 eglWaitClientKH

eglWaitSyncKHR 和 eglWaitClientKH

作者: SMSM | 来源:发表于2022-07-21 15:05 被阅读0次

    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)

    相关文章

      网友评论

          本文标题:eglWaitSyncKHR 和 eglWaitClientKH

          本文链接:https://www.haomeiwen.com/subject/abiuirtx.html