標籤:

OpenGL ES 如何實現 Multi-Threaded Rendering?

看了一下Imagination的文章

主要就是開幾個線程做資源upload 和 著色器編譯 避免主線程因為傳輸效率或CPU編譯時間導致CPU GPU閑置

不過沒找到什麼sample

目前知道的是

通過eglCreateContext()創造shared context

不過到底如何使用shared context呢?

幾個疑問

他們的共享是雙向的還是單向的

假設通過primary context傳入eglCreateContext()的share參數 創造出secondary context

這時是primary context 可以使用 secondary context 的資源

還是secondary context 可以使用 primary context 的資源

還是雙向的

共享是否有傳遞性呢

A B 互為共享 B C 互為共享

那麼A C呢?

這裡的共享的方式 是不是 直接使用另一個context線程中分配的handle 就可以了

並且是不是所謂共享 只是分配的資源是共享的(vbo vao ubo pbo texture shader)

也就是一個context線程中分配的資源handle 另一個context中也是有效的

渲染狀態不是共享的 是這個意思么

在仔細看EGL spec

不過還有很多細節不清楚

求一些例子 還有希望有經驗的大牛能告訴我一下這裡的坑


// main thread

shared_ctx = eglCreateContext(..., nullptr, ...);

// rendering thread 1

rendering_ctx1 = eglCreateContext(..., shared_ctx, ...);

// rendering thread 2

rendering_ctx2 = eglCreateContext(..., shared_ctx, ...);

就這麼用。

共享是雙向的,而且像剛才那樣的代碼,rendering_ctx1和rendering_ctx2的資源也共享了。資源共享,狀態獨立。


補充下,個人感覺shared_context實際上是GL狀態不共享,但是所有的GL objects都共享。。。

ps:

寫個代碼然後用Imagination的trace工具弄個dump就清晰多了,圖上是PVRTrace

吐槽下,,,高通的trace工具做的真是爛,,,


推薦閱讀:

如何編寫顯卡驅動?
某些設備上顯存是內存的一部分,這時OpenGL能否直接使用內存中的紋理?
Opengl 的片段著色器的Blend的疑惑 片段著色器的Alpha Blend次序?

TAG:OpenGLES |