Предупреждение о производительности пиксельного тракта: передача пикселей синхронизируется с 3D-рендерингом
Я загружаю данные изображения в текстуру GL асинхронно.
В выводе отладки я получаю эти предупреждения во время рендеринга:
Источник:OpenGL, тип: Другое, id: 131185, серьезность: Уведомление
Сообщение: подробная информация о буфере: объект буфера 1 (связанный с GL_PIXEL_UNPACK_BUFFER_ARB, подсказка об использовании GL_DYNAMIC_DRAW) был отображен WRITE_ONLY в памяти SYSTEM HEAP (быстро). Источник:OpenGL, тип: Performance, id: 131154, серьезность: средняя. Сообщение: предупреждение о производительности пиксельного тракта: передача пикселя синхронизирована с 3D-рендерингом.
Я не вижу никакого неправильного использования PBO в моем случае или каких-либо ошибок. Так что вопросы в том, безопасны ли эти предупреждения, или я действительно что-то делаю неправильно.
Мой код для этой части:
//start copuying pixels into PBO from RAM:
mPBOs[mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);
const uint32_t buffSize = pipe->GetBufferSize();
GLubyte* ptr = (GLubyte*)mPBOs[mCurrentPBO].MapRange(0, buffSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
if (ptr)
{
memcpy(ptr, pipe->GetBuffer(), buffSize);
mPBOs[mCurrentPBO].Unmap();
}
//copy pixels from another already full PBO(except of first frame into texture //
mPBOs[1 - mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);
//mCopyTex is bound to mCopyFBO as attachment
glTextureSubImage2D(mCopyTex->GetHandle(), 0, 0, 0, mClientSize.x, mClientSize.y,
GL_RGBA, GL_UNSIGNED_BYTE, 0);
mCurrentPBO = 1 - mCurrentPBO;
Затем я просто перетаскиваю результат в буфер кадров по умолчанию. Нет рендеринга геометрии или чего-то в этом роде.
glBlitNamedFramebuffer(
mCopyFBO,
0,//default FBO id
0,
0,
mViewportSize.x,
mViewportSize.y,
0,
0,
mViewportSize.x,
mViewportSize.y,
GL_COLOR_BUFFER_BIT,
GL_LINEAR);
Работает на карте NVIDIA GTX 960.
1 ответ
Это предупреждение о производительности относится только к nividia и предназначено для подсказки, указывающей на то, что вы не собираетесь использовать отдельную очередь передачи hw, что неудивительно, так как вы используете однопотоковую модель с единым контекстом GL, в которой оба рендеринга (хотя бы твой блин) и перевод осуществляются.
Посмотрите эту презентацию nvidia, чтобы узнать, как nvidia справляется с этим. Страница 22 также объясняет это конкретное предупреждение. Обратите внимание, что это предупреждение не означает, что ваша передача не является асинхронной. Он все еще полностью асинхронен с потоком процессора. Он будет просто синхронно обрабатываться в графическом процессоре относительно команд рендеринга, находящихся в одной и той же очереди команд, и вы не используете механизм асинхронного копирования, который мог бы делать эти копии независимо от команд рендеринга в отдельной очереди команд.
Я не вижу никакого неправильного использования PBO в моем случае или каких-либо ошибок. Так что вопросы в том, безопасны ли эти предупреждения, или я действительно что-то делаю неправильно.
Там нет ничего плохого с вашим использованием PBO.
Не ясно, может ли ваше конкретное приложение получить выгоду от использования более сложной схемы отдельной очереди передачи.