LINUX.ORG.RU

VDPAU interop + QGLWidget - как?


0

1

Когда-то подружил VDPAU и QWidget через vdp_presentation_queue_target_create_x11. Но вот потребовалось связать OpenGL и VDPAU да так, чтобы через QGLWidget. Не получилось.

По порядку.

Нашел рабочий пример traceplay от NVIDIA, в котором используется отображение Vdpau Surface -> GL Texture. Для инициализации окна и контекста рисования там используются низкоуровневые X-овые команды (с этим я не дружен). Решил по аналогии реализовать, но используя QGLWidget, т.к. встраиваю в рабочий проект, написанный целиком на QT. Итак. Инициализирую QGLWidget с использованием DirectRendering, цепляю vdpau, используя QX11Info и vdp_device_create_x11. Далее пытаюсь инициализировать VDPAU interop. И тут встречаю следующую проблему:

QGLWidget::makeCurrent();
glVDPAUInitNV( (void *)(size_t)(&m_vc->vdpDevice), (void *)(uintptr_t)m_vc->vdp_get_proc_address );
	qDebug() << ">>>>>>>>> glVDPAUInitNV state:" << (char *)gluErrorString(glGetError());
Выдает: «>>>>>>>>> glVDPAUInitNV state: invalid operation» Если не вызываю makeCurrent(), то инициализация проходит без ошибок, но на поверку оказывается, что тот же glVDPAURegisterOutputSurfaceNV() всегда возвращает 0. Т.е. ничего как бы не инициализировалось.

Вот что написано в документации:

INVALID_OPERATION is generated if VDPAUInitNV is called on a given GL context, where VDPAUInitNV has been called, and VDPAUFiniNV has not been called since.

INVALID_OPERATION is generated by VDPAUInitNV, VDPAURegisterVideoSurfaceNV, or VDPAURegisterOutputSurfaceNV if the VDPAU driver refuses the request for some reason.

Этого явно недостаточно.

Какие мысли?

Distrib: Ubuntu 10.10; Kernel: 2.6.36; GPU: NVIDIA GPU GeForce GT 220; VDPAU implementation : NVIDIA VDPAU Driver Shared Library 290.10 Wed Nov 16 19:53:31 PST 2011; OpenGL: 3.3.0;



Последнее исправление: progdevel (всего исправлений: 1)

Собственно, сам себе на вопрос и отвечу =) VDPAU Trace показал, что ошибка кроется здесь:

glVDPAUInitNV( (void *)(size_t)(&m_vc->vdpDevice), (void *)(uintptr_t)m_vc->vdp_get_proc_address );
Ох уж эти void-указатели! Вместо (void *)(size_t)&m_vc->vdpDevice нужно передавать (void *)(size_t)m_vc->vdpDevice

Спасибо за внимание.

progdevel
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.