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