У меня есть приложение, которое выполняет много GPGPU, используя Opengl и Pixel Buffer Objects для передачи и обработки данных.
В настоящее время я использую пул этих ресурсов, в основном у меня есть пул для каждого измерения буфера и использования, которое использует мое приложение. Когда использование ресурса заканчивается, он возвращается в соответствующий пул для повторного использования. Тем не менее, я начинаю задумываться о том, есть ли что-то в этом, так как мне нужно «осиротить» 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);
});
});
}