summaryrefslogtreecommitdiff
path: root/test/egl/va_egl_x11.c
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-09-26 10:48:35 +0200
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-09-26 11:17:11 +0200
commit2afd3966a516b37ed451777feeb8e313e1b9dc33 (patch)
tree9b0dc74836485bdfd493e00633be555bf726698e /test/egl/va_egl_x11.c
parent44b03ffcdb814392a9acf025615f99a06fed63d4 (diff)
Revert Pixmap-based EGL interfaces.
This was work-in-progress and it turned out to be less efficient than a dedicated API that could allow direct texturing from YUV components. This reverts the following commits: 30b5e62: fix license template for Makefile.am d1acbc9: add the missing license header to some files fc8f1b8: include va_egl.h instead of va.h c3ab994: array bound check 7b663dc: update the VA/EGL implementation in VAAPI 0851426: move va_egl.h to va/ to avoid compile error 1cda440: VA/EGL interfaces af294d1: fix compiling error if GLESv1_CM isn't installed in the default location 2a4fcff: fix the number of the allocated elements 2f484d7: update VA/EGL test case as well 2ac9bac: a test case to use VA/EGL interfaces 731d575: new hooks to create/free native pixmap Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
Diffstat (limited to 'test/egl/va_egl_x11.c')
-rw-r--r--test/egl/va_egl_x11.c622
1 files changed, 0 insertions, 622 deletions
diff --git a/test/egl/va_egl_x11.c b/test/egl/va_egl_x11.c
deleted file mode 100644
index 28c7ddd..0000000
--- a/test/egl/va_egl_x11.c
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
- * Copyright (c) 2012 Intel Corporation. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/keysym.h>
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <va/va_x11.h>
-#include <va/va_egl.h>
-
-struct va_egl_context
-{
- Display *x11_dpy;
- Window win;
-
- EGLDisplay egl_dpy;
- EGLContext egl_ctx;
- EGLSurface egl_surf;
- unsigned int egl_target;
- EGLClientBuffer egl_buffer;
- EGLImageKHR egl_image;
- PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr;
- PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_hkr;
- PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glegl_image_target_texture2d_oes;
-
- VADisplay va_dpy;
- VASurfaceID va_surface;
- VASurfaceEGL va_egl_surface;
-
- int x, y;
- unsigned int width, height;
- GLuint texture;
- GLfloat ar;
- unsigned int box_width;
- unsigned char ydata;
-};
-
-static void
-va_egl_fini_egl(struct va_egl_context *ctx)
-{
- eglMakeCurrent(ctx->egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
- eglTerminate(ctx->egl_dpy);
-}
-
-static int
-va_egl_init_egl(struct va_egl_context *ctx)
-{
- EGLint egl_major, egl_minor;
- const char *s;
-
- ctx->egl_dpy = eglGetDisplay(ctx->x11_dpy);
-
- if (!ctx->egl_dpy) {
- printf("Error: eglGetDisplay() failed\n");
- return -1;
- }
-
- if (!eglInitialize(ctx->egl_dpy, &egl_major, &egl_minor)) {
- printf("Error: eglInitialize() failed\n");
- return -1;
- }
-
- s = eglQueryString(ctx->egl_dpy, EGL_VERSION);
- printf("EGL_VERSION = %s\n", s);
-
- return 0;
-}
-
-static int
-yuvgen_planar(int width, int height,
- unsigned char *Y_start, int Y_pitch,
- unsigned char *U_start, int U_pitch,
- unsigned char *V_start, int V_pitch,
- int UV_interleave, int box_width, unsigned char ydata)
-{
- int row;
-
- /* copy Y plane */
- for (row = 0; row < height; row++) {
- unsigned char *Y_row = Y_start + row * Y_pitch;
- int jj, xpos, ypos;
-
- ypos = (row / box_width) & 0x1;
-
- for (jj = 0; jj < width; jj++) {
- xpos = ((jj) / box_width) & 0x1;
-
- if ((xpos == 0) && (ypos == 0))
- Y_row[jj] = ydata;
- if ((xpos == 1) && (ypos == 1))
- Y_row[jj] = ydata;
-
- if ((xpos == 1) && (ypos == 0))
- Y_row[jj] = 0xff - ydata;
- if ((xpos == 0) && (ypos == 1))
- Y_row[jj] = 0xff - ydata;
- }
- }
-
- /* copy UV data */
- for( row = 0; row < height/2; row++) {
- unsigned short value = 0x80;
-
- if (UV_interleave) {
- unsigned short *UV_row = (unsigned short *)(U_start + row * U_pitch);
-
- memset(UV_row, value, width);
- } else {
- unsigned char *U_row = U_start + row * U_pitch;
- unsigned char *V_row = V_start + row * V_pitch;
-
- memset(U_row, value, width / 2);
- memset(V_row, value, width / 2);
- }
- }
-
- return 0;
-}
-
-static int
-va_egl_upload_surface(struct va_egl_context *ctx)
-{
- VAImage surface_image;
- void *surface_p = NULL, *U_start, *V_start;
-
- vaDeriveImage(ctx->va_dpy, ctx->va_surface, &surface_image);
-
- vaMapBuffer(ctx->va_dpy, surface_image.buf, &surface_p);
-
- U_start = (char *)surface_p + surface_image.offsets[1];
- V_start = (char *)surface_p + surface_image.offsets[2];
-
- /* assume surface is planar format */
- yuvgen_planar(surface_image.width, surface_image.height,
- (unsigned char *)surface_p, surface_image.pitches[0],
- (unsigned char *)U_start, surface_image.pitches[1],
- (unsigned char *)V_start, surface_image.pitches[2],
- (surface_image.format.fourcc==VA_FOURCC_NV12),
- ctx->box_width, ctx->ydata);
-
- vaUnmapBuffer(ctx->va_dpy,surface_image.buf);
-
- vaDestroyImage(ctx->va_dpy,surface_image.image_id);
-
- return 0;
-}
-
-static void
-va_egl_fini_va(struct va_egl_context *ctx)
-{
- vaDestroySurfaces(ctx->va_dpy, &ctx->va_surface, 1);
- vaTerminate(ctx->va_dpy);
-}
-
-static int
-va_egl_init_va(struct va_egl_context *ctx)
-{
- VAStatus va_status;
- int major_ver, minor_ver;
-
- ctx->va_dpy = vaGetDisplayEGL(ctx->x11_dpy, ctx->egl_dpy);
-
- if (!ctx->va_dpy) {
- printf("Error: vaGetDisplayEGL() failed\n");
- return -1;
- }
-
- va_status = vaInitialize(ctx->va_dpy, &major_ver, &minor_ver);
-
- if (va_status != VA_STATUS_SUCCESS) {
- printf("Error: vaInitialize() failed\n");
- return -1;
- }
-
- va_status = vaCreateSurfaces(ctx->va_dpy,
- ctx->width, ctx->height,
- VA_RT_FORMAT_YUV420,
- 1, &ctx->va_surface);
-
- if (va_status != VA_STATUS_SUCCESS) {
- printf("Error: vaCreateSurfaces() failed\n");
- return -1;
- }
-
- va_egl_upload_surface(ctx);
-
- return 0;
-}
-
-static void
-va_egl_make_window(struct va_egl_context *ctx, const char *title)
-{
- int scrnum;
- XSetWindowAttributes attr;
- unsigned long mask;
- Window root;
- XVisualInfo *visInfo, visTemplate;
- int num_visuals;
- EGLConfig config;
- EGLint num_configs, vid;
- const EGLint attribs[] = {
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
- EGL_NONE
- };
-
- scrnum = DefaultScreen(ctx->x11_dpy);
- root = RootWindow(ctx->x11_dpy, scrnum);
-
- if (!eglChooseConfig(ctx->egl_dpy, attribs, &config, 1, &num_configs) ||
- !num_configs) {
- printf("Error: couldn't get an EGL visual config\n");
-
- return;
- }
-
- if (!eglGetConfigAttrib(ctx->egl_dpy, config, EGL_NATIVE_VISUAL_ID, &vid)) {
- printf("Error: eglGetConfigAttrib() failed\n");
-
- return;
- }
-
- /* The X window visual must match the EGL config */
- visTemplate.visualid = vid;
- visInfo = XGetVisualInfo(ctx->x11_dpy, VisualIDMask, &visTemplate, &num_visuals);
-
- if (!visInfo) {
- printf("Error: couldn't get X visual\n");
-
- return;
- }
-
- /* window attributes */
- attr.background_pixel = 0;
- attr.border_pixel = 0;
- attr.colormap = XCreateColormap(ctx->x11_dpy, root, visInfo->visual, AllocNone);
- attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
- attr.override_redirect = 0;
- mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
-
- ctx->win = XCreateWindow(ctx->x11_dpy,
- root,
- ctx->x, ctx->y,
- ctx->width, ctx->height,
- 0, visInfo->depth, InputOutput,
- visInfo->visual, mask, &attr);
-
- /* set hints and properties */
- {
- XSizeHints sizehints;
- sizehints.x = ctx->x;
- sizehints.y = ctx->y;
- sizehints.width = ctx->width;
- sizehints.height = ctx->height;
- sizehints.flags = USSize | USPosition;
- XSetNormalHints(ctx->x11_dpy, ctx->win, &sizehints);
- XSetStandardProperties(ctx->x11_dpy, ctx->win, title, title,
- None, (char **)NULL, 0, &sizehints);
- }
-
- eglBindAPI(EGL_OPENGL_ES_API);
-
- ctx->egl_ctx = eglCreateContext(ctx->egl_dpy, config, EGL_NO_CONTEXT, NULL);
-
- if (!ctx->egl_ctx) {
- printf("Error: eglCreateContext() failed\n");
-
- return;
- }
-
- ctx->egl_surf = eglCreateWindowSurface(ctx->egl_dpy, config, ctx->win, NULL);
- eglMakeCurrent(ctx->egl_dpy, ctx->egl_surf, ctx->egl_surf, ctx->egl_ctx);
- XFree(visInfo);
-}
-
-static int
-va_egl_init_extension(struct va_egl_context *ctx)
-{
- const char *exts;
-
- exts = eglQueryString(ctx->egl_dpy, EGL_EXTENSIONS);
- ctx->egl_create_image_khr =
- (PFNEGLCREATEIMAGEKHRPROC)eglGetProcAddress("eglCreateImageKHR");
- ctx->egl_destroy_image_hkr =
- (PFNEGLDESTROYIMAGEKHRPROC)eglGetProcAddress("eglDestroyImageKHR");
-
- if (!exts ||
- !strstr(exts, "EGL_KHR_image_base") ||
- !ctx->egl_create_image_khr ||
- !ctx->egl_destroy_image_hkr) {
- printf("EGL does not support EGL_KHR_image_base\n");
- return -1;
- }
-
- exts = (const char *)glGetString(GL_EXTENSIONS);
- ctx->glegl_image_target_texture2d_oes =
- (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)eglGetProcAddress("glEGLImageTargetTexture2DOES");
-
- if (!exts ||
- !strstr(exts, "GL_OES_EGL_image") ||
- !ctx->glegl_image_target_texture2d_oes) {
- printf("OpenGL ES does not support GL_OES_EGL_image\n");
- return -1;
- }
-
- return 0;
-}
-
-static void
-va_egl_fini_gles(struct va_egl_context *ctx)
-{
- glDeleteTextures(1, &ctx->texture);
-}
-
-static int
-va_egl_init_gles(struct va_egl_context *ctx)
-{
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glColor4f(1.0, 1.0, 1.0, 1.0);
-
- glDisable(GL_BLEND);
- glDisable(GL_DEPTH_TEST);
-
- glGenTextures(1, &ctx->texture);
- glBindTexture(GL_TEXTURE_2D, ctx->texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glEnable(GL_TEXTURE_2D);
-
- return 0;
-}
-
-static void
-va_egl_fini_va_egl(struct va_egl_context *ctx)
-{
- if (ctx->egl_image)
- ctx->egl_destroy_image_hkr(ctx->egl_dpy, ctx->egl_image);
-
- vaDeassociateSurfaceEGL(ctx->va_dpy, ctx->va_egl_surface);
- vaDestroySurfaceEGL(ctx->va_dpy, ctx->va_egl_surface);
-}
-
-static int
-va_egl_init_va_egl(struct va_egl_context *ctx)
-{
- VAStatus va_status;
- int num_max_targets = 0, num_targets = 0;
- int num_max_attributes = 0, num_attribs = 0;
- unsigned int *target_list = NULL;
- EGLint *img_attribs = NULL;
-
- num_targets = num_max_targets = vaMaxNumSurfaceTargetsEGL(ctx->va_dpy);
-
- if (num_max_targets < 1) {
- printf("Error: vaMaxNumSurfaceTargetsEGL() returns %d\n", num_max_targets);
- return -1;
- }
-
- num_attribs = num_max_attributes = vaMaxNumSurfaceAttributesEGL(ctx->va_dpy);
-
- if (num_max_attributes < 1) {
- printf("Error: vaMaxNumSurfaceAttributesEGL() returns %d\n", num_max_attributes);
- return -1;
- }
-
- target_list = malloc(num_max_targets * sizeof(unsigned int));
- va_status = vaQuerySurfaceTargetsEGL(ctx->va_dpy,
- target_list,
- &num_targets);
-
- if (va_status != VA_STATUS_SUCCESS || num_targets < 1) {
- printf("Error: vaQuerySurfaceTargetsEGL() failed\n");
- return -1;
- }
-
- va_status = vaCreateSurfaceEGL(ctx->va_dpy,
- target_list[0],
- ctx->width, ctx->height,
- &ctx->va_egl_surface);
-
- if (va_status != VA_STATUS_SUCCESS) {
- printf("Error: vaCreateSurfaceEGL() failed\n");
- return -1;
- }
-
- va_status = vaAssociateSurfaceEGL(ctx->va_dpy,
- ctx->va_egl_surface,
- ctx->va_surface,
- 0);
-
- if (va_status != VA_STATUS_SUCCESS) {
- printf("Error: vaAssociateSurfaceEGL() failed\n");
- return -1;
- }
-
- img_attribs = malloc(2 * num_max_attributes * sizeof(EGLint));
- va_status = vaGetSurfaceInfoEGL(ctx->va_dpy,
- ctx->va_egl_surface,
- &ctx->egl_target,
- &ctx->egl_buffer,
- img_attribs,
- &num_attribs);
-
- if (va_status != VA_STATUS_SUCCESS) {
- printf("Error: vaGetSurfaceInfoEGL() failed\n");
- return -1;
- }
-
- ctx->egl_image = ctx->egl_create_image_khr(ctx->egl_dpy,
- EGL_NO_CONTEXT,
- ctx->egl_target,
- ctx->egl_buffer,
- img_attribs);
-
- vaSyncSurfaceEGL(ctx->va_dpy, ctx->va_egl_surface);
- ctx->glegl_image_target_texture2d_oes(GL_TEXTURE_2D,
- (GLeglImageOES)ctx->egl_image);
-
- return 0;
-}
-
-static void
-va_egl_fini(struct va_egl_context *ctx)
-{
- va_egl_fini_gles(ctx);
- va_egl_fini_va(ctx);
- va_egl_fini_egl(ctx);
- va_egl_fini_gles(ctx);
- va_egl_fini_va_egl(ctx);
-
- // XDestroyWindow(ctx->x11_dpy, ctx->win);
- XCloseDisplay(ctx->x11_dpy);
-}
-
-static int
-va_egl_init(struct va_egl_context *ctx, int argc, char **argv)
-{
- memset(ctx, 0, sizeof(*ctx));
- ctx->x11_dpy = XOpenDisplay(NULL);
- ctx->width = 320;
- ctx->height = 320;
- ctx->ar = 1.0;
- ctx->box_width = 16;
- ctx->ydata = 0xff;
-
- if (!ctx->x11_dpy) {
- printf("Error: couldn't open display %s\n", getenv("DISPLAY"));
- return -1;
- }
-
- if (va_egl_init_egl(ctx) != 0)
- return -1;
-
- if (va_egl_init_va(ctx) != 0)
- return -1;
-
- va_egl_make_window(ctx, "VA/EGL");
- va_egl_init_extension(ctx);
- va_egl_init_gles(ctx);
- va_egl_init_va_egl(ctx);
-
- return 0;
-}
-
-static void
-va_egl_reshape(struct va_egl_context *ctx, int width, int height)
-{
- GLfloat ar = (GLfloat) width / (GLfloat) height;
-
- ctx->width = width;
- ctx->height = height;
- ctx->ar = ar;
-
- glViewport(0, 0, (GLint) width, (GLint) height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrthof(-ar, ar, -ar, ar, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-}
-
-static void
-va_egl_draw(struct va_egl_context *ctx)
-{
- const GLfloat verts[][3] = {
- { -ctx->ar, -ctx->ar, 0 },
- { ctx->ar, -ctx->ar, 0 },
- { ctx->ar, ctx->ar, 0 },
- { -ctx->ar, ctx->ar, 0 }
- };
- const GLfloat texs[][2] = {
- { 0, 0 },
- { 1, 0 },
- { 1, 1 },
- { 0, 1 }
- };
-
- glClear(GL_COLOR_BUFFER_BIT);
-
- glVertexPointer(3, GL_FLOAT, 0, verts);
- glTexCoordPointer(2, GL_FLOAT, 0, texs);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
-}
-
-static void
-va_egl_event_loop(struct va_egl_context *ctx)
-{
- while (1) {
- int redraw = 0;
-
- if (XPending(ctx->x11_dpy) > 0) {
- XEvent event;
- XNextEvent(ctx->x11_dpy, &event);
-
- switch (event.type) {
- case Expose:
- redraw = 1;
- break;
-
- case ConfigureNotify:
- va_egl_reshape(ctx, event.xconfigure.width, event.xconfigure.height);
- redraw = 1;
- break;
-
- case KeyPress:
- {
- char buffer[10];
- int code;
- code = XLookupKeysym(&event.xkey, 0);
-
- if (code == XK_y) {
- ctx->ydata += 0x10;
- va_egl_upload_surface(ctx);
- vaSyncSurfaceEGL(ctx->va_dpy, ctx->va_egl_surface);
- ctx->glegl_image_target_texture2d_oes(GL_TEXTURE_2D,
- (GLeglImageOES)ctx->egl_image);
- redraw = 1;
- } else {
- XLookupString(&event.xkey, buffer, sizeof(buffer),
- NULL, NULL);
-
- if (buffer[0] == 27) {
- /* escape */
- return;
- }
- }
- }
-
- break;
-
- default:
- ; /*no-op*/
- }
- }
-
- if (redraw) {
- va_egl_draw(ctx);
- eglSwapBuffers(ctx->egl_dpy, ctx->egl_surf);
- }
- }
-}
-
-static void
-va_egl_run(struct va_egl_context *ctx)
-{
- XMapWindow(ctx->x11_dpy, ctx->win);
- va_egl_reshape(ctx, ctx->width, ctx->height);
- va_egl_event_loop(ctx);
-}
-
-int
-main(int argc, char *argv[])
-{
- struct va_egl_context ctx;
-
- printf("Usage: press 'y' to change Y plane \n\n");
-
- if (va_egl_init(&ctx, argc, argv) == 0) {
- va_egl_run(&ctx);
- va_egl_fini(&ctx);
- }
-
- return 0;
-}