OpenGL ES 如何實現 Multi-Threaded Rendering?
01-26
看了一下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 |