diff options
author | wm4 <wm4@nowhere> | 2015-09-27 16:10:22 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-09-27 16:18:06 +0200 |
commit | 2e5df94f0f479a477e436c019a72c03498141159 (patch) | |
tree | 520ee75e32912141b025c859e23c23212160476d /video/out/opengl/hwdec_vaegl.c | |
parent | 0c494c238a33c6f003f5fb31e2bb5f5399e3c141 (diff) |
vo_opengl: vaapi: redo how EGL extensions are loaded
It looks like my hope that we can unconditionally include EGL headers in
the OpenGL code is not coming true, because OSX does not support EGL at
all. So I prefer loading the VAAPI EGL/GL specific extensions manually,
because it's less of a mess. Partially reverts commit d47dff3f.
Diffstat (limited to 'video/out/opengl/hwdec_vaegl.c')
-rw-r--r-- | video/out/opengl/hwdec_vaegl.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/video/out/opengl/hwdec_vaegl.c b/video/out/opengl/hwdec_vaegl.c index 74f6c0d6f8..cbdcbb8755 100644 --- a/video/out/opengl/hwdec_vaegl.c +++ b/video/out/opengl/hwdec_vaegl.c @@ -22,6 +22,7 @@ #include <assert.h> #include <EGL/egl.h> +#include <EGL/eglext.h> #include <va/va_drmcommon.h> @@ -42,6 +43,12 @@ struct priv { VAImage current_image; bool buffer_acquired; struct mp_image *current_ref; + + EGLImageKHR (EGLAPIENTRY *CreateImageKHR)(EGLDisplay, EGLContext, + EGLenum, EGLClientBuffer, + const EGLint *); + EGLBoolean (EGLAPIENTRY *DestroyImageKHR)(EGLDisplay, EGLImageKHR); + void (EGLAPIENTRY *EGLImageTargetTexture2DOES)(GLenum, GLeglImageOES); }; static bool test_format(struct gl_hwdec *hw); @@ -53,7 +60,7 @@ static void unref_image(struct gl_hwdec *hw) for (int n = 0; n < 4; n++) { if (p->images[n]) - hw->gl->DestroyImageKHR(eglGetCurrentDisplay(), p->images[n]); + p->DestroyImageKHR(eglGetCurrentDisplay(), p->images[n]); p->images[n] = 0; } @@ -121,26 +128,38 @@ 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; - Display *x11disp = + p->xdisplay = hw->gl->MPGetNativeDisplay ? hw->gl->MPGetNativeDisplay("x11") : NULL; - if (!x11disp) + if (!p->xdisplay) return -1; - if (!gl->CreateImageKHR || !gl->EGLImageTargetTexture2DOES || - !strstr(gl->extensions, "EXT_image_dma_buf_import") || + 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; - 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; - p->xdisplay = x11disp; - p->display = vaGetDisplay(x11disp); + // 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 = vaGetDisplay(p->xdisplay); if (!p->display) return -1; @@ -262,13 +281,13 @@ static int map_image(struct gl_hwdec *hw, struct mp_image *hw_image, ADD_ATTRIB(EGL_DMA_BUF_PLANE0_OFFSET_EXT, va_image->offsets[n]); ADD_ATTRIB(EGL_DMA_BUF_PLANE0_PITCH_EXT, va_image->pitches[n]); - p->images[n] = hw->gl->CreateImageKHR(eglGetCurrentDisplay(), + p->images[n] = p->CreateImageKHR(eglGetCurrentDisplay(), EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attribs); if (!p->images[n]) goto err; gl->BindTexture(GL_TEXTURE_2D, p->gl_textures[n]); - gl->EGLImageTargetTexture2DOES(GL_TEXTURE_2D, p->images[n]); + p->EGLImageTargetTexture2DOES(GL_TEXTURE_2D, p->images[n]); out_textures[n] = p->gl_textures[n]; } |