# What the VA-API driver that libva actually loads offers, per profile.
import ctypes, os
from ctypes import POINTER, byref, c_char_p, c_int, c_void_p

va = ctypes.CDLL("libva.so.2")
va_drm = ctypes.CDLL("libva-drm.so.2")
va_drm.vaGetDisplayDRM.restype = c_void_p
va_drm.vaGetDisplayDRM.argtypes = [c_int]
va.vaInitialize.argtypes = [c_void_p, POINTER(c_int), POINTER(c_int)]
va.vaQueryVendorString.restype = c_char_p
va.vaQueryVendorString.argtypes = [c_void_p]
va.vaMaxNumProfiles.argtypes = [c_void_p]
va.vaMaxNumEntrypoints.argtypes = [c_void_p]
va.vaQueryConfigProfiles.argtypes = [c_void_p, POINTER(c_int), POINTER(c_int)]
va.vaQueryConfigEntrypoints.argtypes = [c_void_p, c_int, POINTER(c_int), POINTER(c_int)]
va.vaProfileStr.restype = c_char_p
va.vaProfileStr.argtypes = [c_int]
va.vaEntrypointStr.restype = c_char_p
va.vaEntrypointStr.argtypes = [c_int]

dpy = va_drm.vaGetDisplayDRM(os.open("/dev/dri/renderD128", os.O_RDWR))
major, minor = c_int(), c_int()
assert va.vaInitialize(dpy, byref(major), byref(minor)) == 0
print(va.vaQueryVendorString(dpy).decode())

profiles, n = (c_int * va.vaMaxNumProfiles(dpy))(), c_int()
va.vaQueryConfigProfiles(dpy, profiles, byref(n))
for p in profiles[:n.value]:
    eps, m = (c_int * va.vaMaxNumEntrypoints(dpy))(), c_int()
    va.vaQueryConfigEntrypoints(dpy, p, eps, byref(m))
    names = [va.vaEntrypointStr(e).decode().removeprefix("VAEntrypoint") for e in eps[:m.value]]
    print(f"  {va.vaProfileStr(p).decode().removeprefix('VAProfile'):26} {' '.join(names)}")
