glTexImage2D занимает много времени на некоторых ПК

Фон:

  1. Используйте DXVA2 для декодирования видео 4K 30FPS, затем передайте декодированные кадры непосредственно в opengl для рендеринга.
  2. Основой является декодирование с помощью графического процессора (DXVA2), а затем визуализация с помощью графического процессора (OpenGL) без копирования обратно в процессор.

Проблема:

  1. Я обнаружил, что в некоторых компьютерах glTexImage2D занимает слишком много времени (140 мс). Один из графических процессоров ПК — Intel HD 5500 + Nivida GeFoce 940M.
  2. Но на некоторых ПК это занимает всего 16 мс. Один из графических процессоров для ПК — Intel HD 5500 + AMD R7 M260.
  3. На всех компьютерах установлена ​​последняя версия драйвера gpu.

Исходный код:

Ниже приведен исходный код декодирования DXVA2.

static int dxva2_retrieve_data(AVCodecContext *s, AVFrame *frame)
{
LPDIRECT3DSURFACE9 surface =  (LPDIRECT3DSURFACE9)frame->data[3];
InputStream        *ist = (InputStream *)s->opaque;
DXVA2Context       *ctx = (DXVA2Context*)ist->hwaccel_ctx;
D3DSURFACE_DESC    surfaceDesc;
D3DLOCKED_RECT     LockedRect;
HRESULT            hr;
int                ret;

IDirect3DSurface9_GetDesc(surface, &surfaceDesc);

hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL, D3DLOCK_READONLY);
if (FAILED(hr)) {
av_log(NULL, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
return AVERROR_UNKNOWN;
}

picture->data[0] = (uint8_t*)LockedRect.pBits;
picture->data[1] = (uint8_t*)LockedRect.pBits + LockedRect.Pitch * surfaceDesc.Height;
frameWidth = frame->width;
frameHeight = frame->height;
//glFinish() <---- commentee suggestion
DWORD start = GetTickCount();//test time
Draw();//opengl draw
//glFinish() <---- commentee suggestion
DWORD end = GetTickCount();//test time
printf("draw time:%d\n", end - start);//test time
start = end - start;
picture->data[0] = nullptr;
picture->data[1] = nullptr;

IDirect3DSurface9_UnlockRect(surface);
return 0;
fail:
return ret;
}

Ниже приведен код функции Draw.

void Draw()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_SMOOTH);

glClearColor(0.0, 255, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

glUseProgram(g_program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, g_texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, frameWidth, frameHeight, 0, GL_RED, GL_UNSIGNED_BYTE, picture->data[0]);
glUniform1i(y, 0);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, g_texture[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, frameWidth / 2, frameHeight / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, picture->data[1]);
glUniform1i(uv, 1);

DrawHorizontal();

glBindVertexArray(0);
glUseProgram(0);
glBindTexture(GL_TEXTURE_2D, 0);
}

Вопрос:

Кто подскажет, почему один и тот же код имеет разные результаты на разных компьютерах?
Или дать мне несколько советов?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]