同步围栏和纹理卸载

时间:2017-03-14 20:03:53

标签: c++ multithreading opengl textures

我的OpenGL应用程序显示一个3D视图,根据可见内容按需加载图像。加载操作向纹理加载器线程发送加载请求,然后执行此操作:

...
    <Open image and read into an openGL texture = tex>

    // is this lock needed if this is one of multiple loader threads that each pass textures to the main thread? I.e is glClientWaitSync() thread-safe?
    {   
        std::lock_guard<std::mutex> lk(mOpenGLClientWaitSyncMutex); 

         // we need to wait on a fence before alerting the primary thread that the Texture is ready
         glClientWaitSync(mSync, GL_SYNC_GPU_COMMANDS_COMPLETE, 0);

         // Pass texture to MAIN THREAD
         textureLoaderRequest->mContentViewer->setTexture(tex, requestFrameIndex);
    }
...

请注意。为每个加载器线程创建一个共享的OpenGL上下文,并与main相关联。

我有以下不确定的领域:

a) OpenGL Fences。 我必须承认,我仍在咀嚼OpenGL围栏主题。目前只有1个纹理加载器线程和主线程。如果我有多个纹理加载器线程,我是否需要同步fence-&gt; clientWaitSync()&#39; s? (或者我在这里愚蠢,因为每个加载器线程中的clientWaitSync()为多个线程提供必要的同步保护,设置要在主线程上绘制的纹理)。我做了一些阅读,添加了上面的lock_guard,以及一些测试,它似乎没有影响任何东西。 (但这并不意味着什么,因此我的问题)。

b)纹理卸载。 我的目标是让另一个执行卸载的线程保持UI流畅,同时不延迟IO相关的加载器线程。因为我在加载器线程上创建纹理,所以需要什么样的上下文排列,以便卸载程序线程可以卸载它。我的意思是,目前他们都是附加的&#39;在主要背景下,所以我想我的问题是兄弟姐妹是否需要某种&#34;直接&#34;共享安排,或者由于与主要opengl上下文的关联而已经共享?你会如何解决这个问题?

0 个答案:

没有答案