VDPAU interop + QGLWidget - как?
Когда-то подружил 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());
Вот что написано в документации:
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;