19e5bca2287057f03b3babdcca42487c0d7ba359fwangkun/*
29e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
39e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
49e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Permission is hereby granted, free of charge, to any person obtaining a
59e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * copy of this software and associated documentation files (the
69e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * "Software"), to deal in the Software without restriction, including
79e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * without limitation the rights to use, copy, modify, merge, publish,
89e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * distribute, sub license, and/or sell copies of the Software, and to
99e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * permit persons to whom the Software is furnished to do so, subject to
109e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * the following conditions:
119e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
129e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * The above copyright notice and this permission notice (including the
139e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * next paragraph) shall be included in all copies or substantial portions
149e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * of the Software.
159e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
169e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
179e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
189e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
199e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
209e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
219e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
229e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
239e5bca2287057f03b3babdcca42487c0d7ba359fwangkun */
249e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
259e5bca2287057f03b3babdcca42487c0d7ba359fwangkun/*
269e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Initial EGL backend, and subject to change
279e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
289e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Gstreamer gst-gltexture has a framework to support associating a buffer
299e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * to a texture via EGL_KHR_image_base and GL_OES_EGL_image_external.
309e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
319e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * EGL_KHR_image_base:
329e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *   EGLImageKHR eglCreateImageKHR(
339e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *                           EGLDisplay dpy,
349e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *                           EGLContext ctx,
359e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *                           EGLenum target,
369e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *                           EGLClientBuffer buffer,
379e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *                           const EGLint *attrib_list)
389e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
399e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * GL_OES_EGL_image_external:
409e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * This extension provides a mechanism for creating EGLImage texture targets
419e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * from EGLImages.  This extension defines a new texture target TEXTURE_EXTERNAL_OES.
429e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * This texture target can only be specified using an EGLImage.
439e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * The first eglCreateImageKHR will create an EGLImage from an EGLClientBufferm, and with
449e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * an EGLImage, gst-gltexture can use GL_OES_EGL_image_external extension to create textures.
459e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
469e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * eglCreateImageKHR and GL_OES_EGL_image_external are all called directly from gst-gltexture,
479e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * thus the simplest way to support gst-gltexture is defining a new API to pass EGLClientBuffer
489e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * to gst-gltexture.
499e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
509e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * EGLClientBuffer is gfx/video driver implementation specific (?). It means we need to pass up
519e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * the low-level buffer ID (or handle) of the decoded surface to gst-gltexture, and gst-gltexture
529e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * then pass down it to gfx driver.
539e5bca2287057f03b3babdcca42487c0d7ba359fwangkun *
549e5bca2287057f03b3babdcca42487c0d7ba359fwangkun * Bellow API vaGetEGLClientBufferFromSurface is for this purpose
559e5bca2287057f03b3babdcca42487c0d7ba359fwangkun */
569e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
579e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include "va.h"
589e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include "va_backend_egl.h"
599e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#include "va_egl.h"
609e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
619e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
629e5bca2287057f03b3babdcca42487c0d7ba359fwangkun#define CHECK_DISPLAY(dpy) if( !vaDisplayIsValid(dpy) ) { return VA_STATUS_ERROR_INVALID_DISPLAY; }
639e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
649e5bca2287057f03b3babdcca42487c0d7ba359fwangkunVAStatus vaGetEGLClientBufferFromSurface (
659e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    VADisplay dpy,
669e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    VASurfaceID surface,
679e5bca2287057f03b3babdcca42487c0d7ba359fwangkun    EGLClientBuffer *buffer /* out*/
689e5bca2287057f03b3babdcca42487c0d7ba359fwangkun)
699e5bca2287057f03b3babdcca42487c0d7ba359fwangkun{
709e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  VADriverContextP ctx;
719e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  struct VADriverVTableEGL *va_egl;
729e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  CHECK_DISPLAY(dpy);
739e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  ctx = CTX(dpy);
749e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
759e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  va_egl = (struct VADriverVTableEGL *)ctx->vtable_egl;
769e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  if (va_egl && va_egl->vaGetEGLClientBufferFromSurface) {
779e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      return va_egl->vaGetEGLClientBufferFromSurface(ctx, surface, buffer);
789e5bca2287057f03b3babdcca42487c0d7ba359fwangkun  } else
799e5bca2287057f03b3babdcca42487c0d7ba359fwangkun      return VA_STATUS_ERROR_UNIMPLEMENTED;
809e5bca2287057f03b3babdcca42487c0d7ba359fwangkun}
819e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
829e5bca2287057f03b3babdcca42487c0d7ba359fwangkun
83