Предупреждение о производительности пиксельного тракта: передача пикселей синхронизируется с 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.

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

Другие вопросы по тегам