static int create(struct gl_hwdec *hw) { GL *gl = hw->gl; struct priv *p = talloc_zero(hw, struct priv); hw->priv = p; p->current_image.buf = p->current_image.image_id = VA_INVALID_ID; p->log = hw->log; if (hw->hwctx) return -1; if (!eglGetCurrentDisplay()) return -1; if (!strstr(gl->extensions, "EXT_image_dma_buf_import") || !strstr(gl->extensions, "EGL_KHR_image_base") || !strstr(gl->extensions, "GL_OES_EGL_image") || !(gl->mpgl_caps & MPGL_CAP_TEX_RG)) return -1; // EGL_KHR_image_base p->CreateImageKHR = (void *)eglGetProcAddress("eglCreateImageKHR"); p->DestroyImageKHR = (void *)eglGetProcAddress("eglDestroyImageKHR"); // GL_OES_EGL_image p->EGLImageTargetTexture2DOES = (void *)eglGetProcAddress("glEGLImageTargetTexture2DOES"); if (!p->CreateImageKHR || !p->DestroyImageKHR || !p->EGLImageTargetTexture2DOES) return -1; p->display = create_native_va_display(gl); if (!p->display) return -1; p->ctx = va_initialize(p->display, p->log, true); if (!p->ctx) { vaTerminate(p->display); return -1; } if (hw->reject_emulated && va_guess_if_emulated(p->ctx)) { destroy(hw); return -1; } MP_VERBOSE(p, "using VAAPI EGL interop\n"); insane_hack(hw); if (!test_format(hw)) { destroy(hw); return -1; } hw->hwctx = &p->ctx->hwctx; return 0; }
static int create(struct gl_hwdec *hw) { if (hw->info->vaapi_ctx) return -1; if (!hw->mpgl->vo->x11 || !glXGetCurrentContext()) return -1; struct priv *p = talloc_zero(hw, struct priv); hw->priv = p; p->display = vaGetDisplayGLX(hw->mpgl->vo->x11->display); if (!p->display) return -1; p->ctx = va_initialize(p->display); if (!p->ctx) { vaTerminate(p->display); return -1; } hw->info->vaapi_ctx = p->ctx; hw->converted_imgfmt = IMGFMT_RGBA; return 0; }
static int create(struct gl_hwdec *hw) { if (hw->hwctx) return -1; Display *x11disp = glXGetCurrentDisplay(); if (!x11disp) return -1; int x11scr = DefaultScreen(x11disp); struct priv *p = talloc_zero(hw, struct priv); hw->priv = p; p->log = hw->log; p->xdisplay = x11disp; const char *glxext = glXQueryExtensionsString(x11disp, x11scr); if (!glxext || !strstr(glxext, "GLX_EXT_texture_from_pixmap")) return -1; p->glXBindTexImage = (void*)glXGetProcAddressARB((void*)"glXBindTexImageEXT"); p->glXReleaseTexImage = (void*)glXGetProcAddressARB((void*)"glXReleaseTexImageEXT"); if (!p->glXBindTexImage || !p->glXReleaseTexImage) return -1; p->display = vaGetDisplay(x11disp); if (!p->display) return -1; p->ctx = va_initialize(p->display, p->log, true); if (!p->ctx) { vaTerminate(p->display); return -1; } if (hw->reject_emulated && va_guess_if_emulated(p->ctx)) { destroy(hw); return -1; } int attribs[] = { GLX_BIND_TO_TEXTURE_RGBA_EXT, True, GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, GLX_Y_INVERTED_EXT, True, GLX_DOUBLEBUFFER, False, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 0, None }; int fbcount; GLXFBConfig *fbc = glXChooseFBConfig(x11disp, x11scr, attribs, &fbcount); if (fbcount) p->fbc = fbc[0]; if (fbc) XFree(fbc); if (!fbcount) { MP_VERBOSE(p, "No texture-from-pixmap support.\n"); destroy(hw); return -1; } hw->hwctx = &p->ctx->hwctx; hw->converted_imgfmt = IMGFMT_RGB0; return 0; }