Я пытался заставить ffmpeg декодировать и преобразовывать пиксели в формат rgb8, записывать в буфер отображенных пикселей и использовать потоковую передачу для обновления текстуры opengl, которая затем отображается в окне sdl.
Декодирование и загрузка происходит в выделенном потоке (запись в sws_scale в сопоставленный буфер), и рендеринг выполняется в потоке рендеринга в другом контексте с совместным использованием. (PBO на самом деле содержит несколько кадров, а текстура представляет собой текстуру 2d-массива, чтобы отделить позиции.)
Все работает хорошо, если я flu sh отобразил диапазон в потоке декодирования и использую glTextureSubImage3D в поток рендеринга для обновления текстуры по необходимому индексу. Интегрированный Intel GPU работает довольно быстро (это должно) в этом сценарии, но драйвер NV жалуется на Pixel-path performance warning: Pixel transfer is synchronized with 3D rendering.
Я подумал, что это может быть только факт, что только glTextureSubImage3D действительно загружает, поэтому я переместил glTextureSubImage3D сразу после грипп sh операция. На этот раз NV NV работает нормально, и предупреждение исчезает, в то время как Intel GPU выдает черное окно и показывает только декодированный контент при закрытии.
Код выглядит примерно так:
//render thread
void RenderFrame(SDL_Window* window,GLobjects& glo, int index, int width, int height) {
glUniform1f(glo.index_location,index);
//The function in question
glTextureSubImage3D(glo.texture, 0, 0, 0, index, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)(index * width * height * 4));
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
SDL_GL_SwapWindow(window);
}
//Decode thread
int DecodeFrameToPBO(GLobjects& glo, int index){
//fill the mapped range needed
glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, index * width * height * 4, 4 * width * height);
//The function in question
//glTextureSubImage3D(glo.texture, 0, 0, 0, index, width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)(index * width * height * 4));
}
Я действительно смущен идеей памяти на стороне клиента и тем, как драйвер асинхронно загружает текстуру, где именно должна происходить загрузка и что фактически делает glTextureSubImage3D, когда GL_PIXEL_UNPACK_BUFFER связан?
РЕДАКТИРОВАТЬ:
После добавления команды glFlu sh () к flu sh очереди команд контекста загрузки после каждой загрузки, версия intel работает правильно без черного экрана.
ОБНОВЛЕНИЕ:
Добавление glFlu sh (), по-видимому, заставляет NVU GPU выдавать предупреждение «Предупреждение о производительности пиксельного тракта: передача пикселя синхронизирована с 3D-рендерингом». опять же, и использование GPU того же образца видео выросло с 8% до 10%. Кажется, glFlu sh () запускает внутреннюю синхронизацию, которая, возможно, делает вещи go занятыми? Поскольку графический процессор Intel не может работать без glFlu sh, даже с версией clientwaitsyn c с установленным битом команды flu sh и явным вызовом flu sh на стороне рендеринга также не работает. Итак, что нужно сделать, чтобы оба водителя были довольны (и сократили загрузку)?