PBO потоковая передача, когда именно происходит синхронизация c? - PullRequest
1 голос
/ 13 февраля 2020

Я пытался заставить 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 на стороне рендеринга также не работает. Итак, что нужно сделать, чтобы оба водителя были довольны (и сократили загрузку)?

1 Ответ

2 голосов
/ 13 февраля 2020

Я думаю, что вас вводит в заблуждение предупреждение nvidia. Это не подразумевает, что есть синхронизация CPU-GPU, это только говорит о том, что рендеринг текстуры синхронизирован (должен ждать), загружая текстуру, что нормально. См. этот ответ для получения более подробной информации.

Итак, мой ответ: проблемы нет, поэтому решение состоит в том, чтобы ничего не менять.

Я думал, что возможно, что только glTextureSubImage3D на самом деле выполняет загрузку, поэтому я переместил glTextureSubImage3D сразу после операции flu sh [в поток декодирования].

Если вы сделаете это, теперь вам придется вручную синхронизировать рендеринг с загрузкой текстуры, или вы будете иногда встречать наполовину написанные кадры или даже неопределенный контент, и в основном есть состояние гонки.

Вы можете сделать такую ​​синхронизацию с OpenGL Syn c Objects . Но, в конце концов, вы не получите больше производительности, чем в исходном варианте.

, в то время как Intel GPU дает черное окно и показывает только декодированный контент при закрытии

Неясно, является ли это только результатом отсутствующей синхронизации, ошибки в вашем коде или даже ошибки драйвера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...