New hooks to create/free native pixmap
authorXiang, Haihao <haihao.xiang@intel.com>
Wed, 9 Nov 2011 08:32:51 +0000 (16:32 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Wed, 14 Dec 2011 00:27:03 +0000 (08:27 +0800)
Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com>
va/va_backend.h
va/x11/va_x11.c

index 9b47cae..22f1765 100644 (file)
@@ -459,6 +459,16 @@ struct VADisplayContext
     );
 
     void *opaque; /* opaque for display extensions (e.g. GLX) */
+
+    VAStatus (*vaCreateNativePixmap) (
+        VADisplayContextP pDisplayContext,
+        unsigned int width,
+        unsigned int height,
+        void **native_pixmap);
+
+    VAStatus (*vaFreeNativePixmap) (
+        VADisplayContextP pDisplayContext,
+        void *native_pixmap);
 };
 
 typedef VAStatus (*VADriverInit) (
index b51f5f0..036499c 100644 (file)
@@ -161,6 +161,47 @@ static VAStatus va_DisplayContextGetDriverName (
     return vaStatus;
 }
 
+static VAStatus va_CreateNativePixmap(
+    VADisplayContextP pDisplayContext,
+    unsigned int width,
+    unsigned int height,
+    void **native_pixmap)
+{
+    VADriverContextP ctx = pDisplayContext->pDriverContext;
+    Window root_window;
+    XWindowAttributes wattr;
+    Pixmap pixmap = None;
+
+    root_window = RootWindow(ctx->native_dpy, ctx->x11_screen);
+    XGetWindowAttributes(ctx->native_dpy, root_window, &wattr);
+
+    if (wattr.depth != 24 && wattr.depth != 32)
+        return VA_STATUS_ERROR_INVALID_DISPLAY;
+
+    pixmap = XCreatePixmap(
+        ctx->native_dpy,
+        root_window,
+        width,
+        height,
+        wattr.depth
+    );
+
+    *native_pixmap = (void *)pixmap;
+
+    return !pixmap ? VA_STATUS_ERROR_UNKNOWN : VA_STATUS_SUCCESS;
+}
+
+static VAStatus va_FreeNativePixmap(
+    VADisplayContextP pDisplayContext,
+    void *native_pixmap)
+{
+    VADriverContextP ctx = pDisplayContext->pDriverContext;
+    Pixmap pixmap = (Pixmap)native_pixmap;
+
+    XFreePixmap(ctx->native_dpy, pixmap);
+
+    return VA_STATUS_SUCCESS;
+}
 
 VADisplay vaGetDisplay (
     VANativeDisplay native_dpy /* implementation specific */
@@ -190,6 +231,8 @@ VADisplay vaGetDisplay (
          pDisplayContext->vaDestroy       = va_DisplayContextDestroy;
          pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
           pDisplayContext->opaque          = NULL;
+          pDisplayContext->vaCreateNativePixmap = va_CreateNativePixmap;
+          pDisplayContext->vaFreeNativePixmap   = va_FreeNativePixmap;
          pDriverContext->dri_state        = dri_state;
          dpy                              = (VADisplay)pDisplayContext;
       }