xref: /aosp_15_r20/external/libva/va/wayland/va_wayland.c (revision 54e60f844a168e9a219354de272cd517ee8cd4b7)
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