汇集PBO和纹理?

时间:2012-02-06 20:19:31

标签: c++ opengl

我有一个应用程序,它使用Opengl和Pixel Buffer Objects来传输和处理数据,从而完成了很多GPGPU。

目前我使用了这些资源的池,基本上我为我的应用程序使用的每个缓冲区维度和用法都有一个池。当资源的使用完成时,它返回到其各自的池以供重用。但是,我开始有几秒钟的想法,因为我需要在重新使用之前“孤儿”PBO,以免干扰正在进行的转移。

我的问题是,在PBO和纹理等资源汇集方面是否有任何优点,或者在需要时直接从OpenGL直接分配是否有用?

这是我正在做的一个例子。反之亦然,纹理。

std::shared_ptr<pbo> create_pbo(int size, bool write)
{
    auto pool = pbo_pools[write][size];
    std::shared_ptr<pbo> buffer;
    if(!pool->try_pop(buffer))  
        buffer = ogl_thread_.invoke([=]{return new pbo(size, write);}); 

    return spl::shared_ptr<pbo>(buffer.get(), [=](pbo*) mutable
    {
        ogl_thread_.begin_invoke([=]() mutable
        {       
            if(write)
                buffer->map();
            else // read
                buffer->unmap();

            pool->push(buffer);
        }); 
    });
}

1 个答案:

答案 0 :(得分:0)

  

我开始有几秒钟的想法,因为在重新使用之前,我需要“孤儿”PBO,以免干扰正在进行的转移。

不,你不必。这是PBO的好处:你可以向它们提交新的数据,而对glTex(Sub)Image的调用仍然可以从它们读取,而不会损坏读取操作。