1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * va_wayland.c - Wayland API
3*54e60f84SAndroid Build Coastguard Worker *
4*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2012 Intel Corporation. All Rights Reserved.
5*54e60f84SAndroid Build Coastguard Worker *
6*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*54e60f84SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*54e60f84SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*54e60f84SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*54e60f84SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*54e60f84SAndroid Build Coastguard Worker * the following conditions:
13*54e60f84SAndroid Build Coastguard Worker *
14*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*54e60f84SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*54e60f84SAndroid Build Coastguard Worker * of the Software.
17*54e60f84SAndroid Build Coastguard Worker *
18*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*54e60f84SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*54e60f84SAndroid Build Coastguard Worker * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
22*54e60f84SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*54e60f84SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*54e60f84SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*54e60f84SAndroid Build Coastguard Worker */
26*54e60f84SAndroid Build Coastguard Worker
27*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
28*54e60f84SAndroid Build Coastguard Worker #include <stdarg.h>
29*54e60f84SAndroid Build Coastguard Worker #include "va_wayland.h"
30*54e60f84SAndroid Build Coastguard Worker #include "va_wayland_linux_dmabuf.h"
31*54e60f84SAndroid Build Coastguard Worker #include "va_wayland_drm.h"
32*54e60f84SAndroid Build Coastguard Worker #include "va_wayland_emgd.h"
33*54e60f84SAndroid Build Coastguard Worker #include "va_wayland_private.h"
34*54e60f84SAndroid Build Coastguard Worker #include "va_backend.h"
35*54e60f84SAndroid Build Coastguard Worker #include "va_backend_wayland.h"
36*54e60f84SAndroid Build Coastguard Worker #include "va_internal.h"
37*54e60f84SAndroid Build Coastguard Worker
38*54e60f84SAndroid Build Coastguard Worker static inline VADriverContextP
get_driver_context(VADisplay dpy)39*54e60f84SAndroid Build Coastguard Worker get_driver_context(VADisplay dpy)
40*54e60f84SAndroid Build Coastguard Worker {
41*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
42*54e60f84SAndroid Build Coastguard Worker return NULL;
43*54e60f84SAndroid Build Coastguard Worker return ((VADisplayContextP)dpy)->pDriverContext;
44*54e60f84SAndroid Build Coastguard Worker }
45*54e60f84SAndroid Build Coastguard Worker
46*54e60f84SAndroid Build Coastguard Worker void
va_wayland_error(const char * format,...)47*54e60f84SAndroid Build Coastguard Worker va_wayland_error(const char *format, ...)
48*54e60f84SAndroid Build Coastguard Worker {
49*54e60f84SAndroid Build Coastguard Worker va_list args;
50*54e60f84SAndroid Build Coastguard Worker
51*54e60f84SAndroid Build Coastguard Worker va_start(args, format);
52*54e60f84SAndroid Build Coastguard Worker fprintf(stderr, "VA error: wayland: ");
53*54e60f84SAndroid Build Coastguard Worker vfprintf(stderr, format, args);
54*54e60f84SAndroid Build Coastguard Worker fprintf(stderr, "\n");
55*54e60f84SAndroid Build Coastguard Worker va_end(args);
56*54e60f84SAndroid Build Coastguard Worker }
57*54e60f84SAndroid Build Coastguard Worker
58*54e60f84SAndroid Build Coastguard Worker static void
va_DisplayContextDestroy(VADisplayContextP pDisplayContext)59*54e60f84SAndroid Build Coastguard Worker va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
60*54e60f84SAndroid Build Coastguard Worker {
61*54e60f84SAndroid Build Coastguard Worker VADriverContextP pDriverContext;
62*54e60f84SAndroid Build Coastguard Worker VADisplayContextWaylandP pDisplayContextWl;
63*54e60f84SAndroid Build Coastguard Worker
64*54e60f84SAndroid Build Coastguard Worker if (!pDisplayContext)
65*54e60f84SAndroid Build Coastguard Worker return;
66*54e60f84SAndroid Build Coastguard Worker
67*54e60f84SAndroid Build Coastguard Worker pDisplayContextWl = pDisplayContext->opaque;
68*54e60f84SAndroid Build Coastguard Worker if (pDisplayContextWl && pDisplayContextWl->destroy)
69*54e60f84SAndroid Build Coastguard Worker pDisplayContextWl->destroy(pDisplayContext);
70*54e60f84SAndroid Build Coastguard Worker
71*54e60f84SAndroid Build Coastguard Worker pDriverContext = pDisplayContext->pDriverContext;
72*54e60f84SAndroid Build Coastguard Worker if (pDriverContext) {
73*54e60f84SAndroid Build Coastguard Worker free(pDriverContext->vtable_wayland);
74*54e60f84SAndroid Build Coastguard Worker pDriverContext->vtable_wayland = NULL;
75*54e60f84SAndroid Build Coastguard Worker free(pDriverContext);
76*54e60f84SAndroid Build Coastguard Worker pDisplayContext->pDriverContext = NULL;
77*54e60f84SAndroid Build Coastguard Worker }
78*54e60f84SAndroid Build Coastguard Worker
79*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext->opaque);
80*54e60f84SAndroid Build Coastguard Worker pDisplayContext->opaque = NULL;
81*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext);
82*54e60f84SAndroid Build Coastguard Worker }
83*54e60f84SAndroid Build Coastguard Worker
84*54e60f84SAndroid Build Coastguard Worker /* -------------------------------------------------------------------------- */
85*54e60f84SAndroid Build Coastguard Worker /* --- Public interface --- */
86*54e60f84SAndroid Build Coastguard Worker /* -------------------------------------------------------------------------- */
87*54e60f84SAndroid Build Coastguard Worker
88*54e60f84SAndroid Build Coastguard Worker struct va_wayland_backend {
89*54e60f84SAndroid Build Coastguard Worker VADisplayContextCreateFunc create;
90*54e60f84SAndroid Build Coastguard Worker VADisplayContextDestroyFunc destroy;
91*54e60f84SAndroid Build Coastguard Worker };
92*54e60f84SAndroid Build Coastguard Worker
93*54e60f84SAndroid Build Coastguard Worker static const struct va_wayland_backend g_backends[] = {
94*54e60f84SAndroid Build Coastguard Worker {
95*54e60f84SAndroid Build Coastguard Worker va_wayland_linux_dmabuf_create,
96*54e60f84SAndroid Build Coastguard Worker va_wayland_linux_dmabuf_destroy
97*54e60f84SAndroid Build Coastguard Worker },
98*54e60f84SAndroid Build Coastguard Worker {
99*54e60f84SAndroid Build Coastguard Worker va_wayland_drm_create,
100*54e60f84SAndroid Build Coastguard Worker va_wayland_drm_destroy
101*54e60f84SAndroid Build Coastguard Worker },
102*54e60f84SAndroid Build Coastguard Worker #ifdef HAVE_EMGD
103*54e60f84SAndroid Build Coastguard Worker {
104*54e60f84SAndroid Build Coastguard Worker va_wayland_emgd_create,
105*54e60f84SAndroid Build Coastguard Worker va_wayland_emgd_destroy
106*54e60f84SAndroid Build Coastguard Worker },
107*54e60f84SAndroid Build Coastguard Worker #endif
108*54e60f84SAndroid Build Coastguard Worker { NULL, }
109*54e60f84SAndroid Build Coastguard Worker };
110*54e60f84SAndroid Build Coastguard Worker
111*54e60f84SAndroid Build Coastguard Worker VADisplay
vaGetDisplayWl(struct wl_display * display)112*54e60f84SAndroid Build Coastguard Worker vaGetDisplayWl(struct wl_display *display)
113*54e60f84SAndroid Build Coastguard Worker {
114*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext = NULL;
115*54e60f84SAndroid Build Coastguard Worker VADriverContextP pDriverContext;
116*54e60f84SAndroid Build Coastguard Worker struct VADriverVTableWayland *vtable;
117*54e60f84SAndroid Build Coastguard Worker unsigned int i;
118*54e60f84SAndroid Build Coastguard Worker
119*54e60f84SAndroid Build Coastguard Worker pDisplayContext = va_newDisplayContext();
120*54e60f84SAndroid Build Coastguard Worker if (!pDisplayContext)
121*54e60f84SAndroid Build Coastguard Worker return NULL;
122*54e60f84SAndroid Build Coastguard Worker
123*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaDestroy = va_DisplayContextDestroy;
124*54e60f84SAndroid Build Coastguard Worker
125*54e60f84SAndroid Build Coastguard Worker pDriverContext = va_newDriverContext(pDisplayContext);
126*54e60f84SAndroid Build Coastguard Worker if (!pDriverContext)
127*54e60f84SAndroid Build Coastguard Worker goto error;
128*54e60f84SAndroid Build Coastguard Worker
129*54e60f84SAndroid Build Coastguard Worker pDriverContext->native_dpy = display;
130*54e60f84SAndroid Build Coastguard Worker pDriverContext->display_type = VA_DISPLAY_WAYLAND;
131*54e60f84SAndroid Build Coastguard Worker
132*54e60f84SAndroid Build Coastguard Worker vtable = calloc(1, sizeof(*vtable));
133*54e60f84SAndroid Build Coastguard Worker if (!vtable)
134*54e60f84SAndroid Build Coastguard Worker goto error;
135*54e60f84SAndroid Build Coastguard Worker pDriverContext->vtable_wayland = vtable;
136*54e60f84SAndroid Build Coastguard Worker
137*54e60f84SAndroid Build Coastguard Worker vtable->version = VA_WAYLAND_API_VERSION;
138*54e60f84SAndroid Build Coastguard Worker
139*54e60f84SAndroid Build Coastguard Worker for (i = 0; g_backends[i].create != NULL; i++) {
140*54e60f84SAndroid Build Coastguard Worker if (g_backends[i].create(pDisplayContext))
141*54e60f84SAndroid Build Coastguard Worker return (VADisplay)pDisplayContext;
142*54e60f84SAndroid Build Coastguard Worker g_backends[i].destroy(pDisplayContext);
143*54e60f84SAndroid Build Coastguard Worker }
144*54e60f84SAndroid Build Coastguard Worker
145*54e60f84SAndroid Build Coastguard Worker error:
146*54e60f84SAndroid Build Coastguard Worker va_DisplayContextDestroy(pDisplayContext);
147*54e60f84SAndroid Build Coastguard Worker return NULL;
148*54e60f84SAndroid Build Coastguard Worker }
149*54e60f84SAndroid Build Coastguard Worker
150*54e60f84SAndroid Build Coastguard Worker VAStatus
vaGetSurfaceBufferWl(VADisplay dpy,VASurfaceID surface,unsigned int flags,struct wl_buffer ** out_buffer)151*54e60f84SAndroid Build Coastguard Worker vaGetSurfaceBufferWl(
152*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
153*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
154*54e60f84SAndroid Build Coastguard Worker unsigned int flags,
155*54e60f84SAndroid Build Coastguard Worker struct wl_buffer **out_buffer
156*54e60f84SAndroid Build Coastguard Worker )
157*54e60f84SAndroid Build Coastguard Worker {
158*54e60f84SAndroid Build Coastguard Worker VADriverContextP const ctx = get_driver_context(dpy);
159*54e60f84SAndroid Build Coastguard Worker
160*54e60f84SAndroid Build Coastguard Worker if (!ctx)
161*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY;
162*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable_wayland || !ctx->vtable_wayland->vaGetSurfaceBufferWl)
163*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED;
164*54e60f84SAndroid Build Coastguard Worker return ctx->vtable_wayland->vaGetSurfaceBufferWl(ctx, surface, flags,
165*54e60f84SAndroid Build Coastguard Worker out_buffer);
166*54e60f84SAndroid Build Coastguard Worker }
167*54e60f84SAndroid Build Coastguard Worker
168*54e60f84SAndroid Build Coastguard Worker VAStatus
vaGetImageBufferWl(VADisplay dpy,VAImageID image,unsigned int flags,struct wl_buffer ** out_buffer)169*54e60f84SAndroid Build Coastguard Worker vaGetImageBufferWl(
170*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
171*54e60f84SAndroid Build Coastguard Worker VAImageID image,
172*54e60f84SAndroid Build Coastguard Worker unsigned int flags,
173*54e60f84SAndroid Build Coastguard Worker struct wl_buffer **out_buffer
174*54e60f84SAndroid Build Coastguard Worker )
175*54e60f84SAndroid Build Coastguard Worker {
176*54e60f84SAndroid Build Coastguard Worker VADriverContextP const ctx = get_driver_context(dpy);
177*54e60f84SAndroid Build Coastguard Worker
178*54e60f84SAndroid Build Coastguard Worker if (!ctx)
179*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY;
180*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable_wayland || !ctx->vtable_wayland->vaGetImageBufferWl)
181*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED;
182*54e60f84SAndroid Build Coastguard Worker return ctx->vtable_wayland->vaGetImageBufferWl(ctx, image, flags,
183*54e60f84SAndroid Build Coastguard Worker out_buffer);
184*54e60f84SAndroid Build Coastguard Worker }
185