xref: /aosp_15_r20/external/libva/va/glx/va_glx.c (revision 54e60f844a168e9a219354de272cd517ee8cd4b7)
1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker  * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
3*54e60f84SAndroid Build Coastguard Worker  *
4*54e60f84SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*54e60f84SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the
6*54e60f84SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
7*54e60f84SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
8*54e60f84SAndroid Build Coastguard Worker  * distribute, sub license, and/or sell copies of the Software, and to
9*54e60f84SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
10*54e60f84SAndroid Build Coastguard Worker  * the following conditions:
11*54e60f84SAndroid Build Coastguard Worker  *
12*54e60f84SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
13*54e60f84SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial portions
14*54e60f84SAndroid Build Coastguard Worker  * of the Software.
15*54e60f84SAndroid Build Coastguard Worker  *
16*54e60f84SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*54e60f84SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*54e60f84SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19*54e60f84SAndroid Build Coastguard Worker  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20*54e60f84SAndroid Build Coastguard Worker  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21*54e60f84SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22*54e60f84SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23*54e60f84SAndroid Build Coastguard Worker  */
24*54e60f84SAndroid Build Coastguard Worker 
25*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
26*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
27*54e60f84SAndroid Build Coastguard Worker #include "va_glx_private.h"
28*54e60f84SAndroid Build Coastguard Worker #include "va_glx_impl.h"
29*54e60f84SAndroid Build Coastguard Worker 
30*54e60f84SAndroid Build Coastguard Worker #define INIT_CONTEXT(ctx, dpy) do {                             \
31*54e60f84SAndroid Build Coastguard Worker         if (!vaDisplayIsValid(dpy))                             \
32*54e60f84SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_INVALID_DISPLAY;             \
33*54e60f84SAndroid Build Coastguard Worker                                                                 \
34*54e60f84SAndroid Build Coastguard Worker         ctx = ((VADisplayContextP)(dpy))->pDriverContext;       \
35*54e60f84SAndroid Build Coastguard Worker         if (!(ctx))                                             \
36*54e60f84SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_INVALID_DISPLAY;             \
37*54e60f84SAndroid Build Coastguard Worker                                                                 \
38*54e60f84SAndroid Build Coastguard Worker         VAStatus status = va_glx_init_context(ctx);             \
39*54e60f84SAndroid Build Coastguard Worker         if (status != VA_STATUS_SUCCESS)                        \
40*54e60f84SAndroid Build Coastguard Worker             return status;                                      \
41*54e60f84SAndroid Build Coastguard Worker     } while (0)
42*54e60f84SAndroid Build Coastguard Worker 
43*54e60f84SAndroid Build Coastguard Worker #define INVOKE(ctx, func, args) do {                            \
44*54e60f84SAndroid Build Coastguard Worker         VADriverVTableGLXP vtable;                              \
45*54e60f84SAndroid Build Coastguard Worker         vtable = &VA_DRIVER_CONTEXT_GLX(ctx)->vtable;           \
46*54e60f84SAndroid Build Coastguard Worker         if (!vtable->va##func##GLX)                             \
47*54e60f84SAndroid Build Coastguard Worker             return VA_STATUS_ERROR_UNIMPLEMENTED;               \
48*54e60f84SAndroid Build Coastguard Worker         status = vtable->va##func##GLX args;                    \
49*54e60f84SAndroid Build Coastguard Worker     } while (0)
50*54e60f84SAndroid Build Coastguard Worker 
51*54e60f84SAndroid Build Coastguard Worker 
52*54e60f84SAndroid Build Coastguard Worker // Destroy VA/GLX display context
va_DisplayContextDestroy(VADisplayContextP pDisplayContext)53*54e60f84SAndroid Build Coastguard Worker static void va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
54*54e60f84SAndroid Build Coastguard Worker {
55*54e60f84SAndroid Build Coastguard Worker     VADisplayContextGLXP pDisplayContextGLX;
56*54e60f84SAndroid Build Coastguard Worker     VADriverContextP     pDriverContext;
57*54e60f84SAndroid Build Coastguard Worker     VADriverContextGLXP  pDriverContextGLX;
58*54e60f84SAndroid Build Coastguard Worker 
59*54e60f84SAndroid Build Coastguard Worker     if (!pDisplayContext)
60*54e60f84SAndroid Build Coastguard Worker         return;
61*54e60f84SAndroid Build Coastguard Worker 
62*54e60f84SAndroid Build Coastguard Worker     pDriverContext     = pDisplayContext->pDriverContext;
63*54e60f84SAndroid Build Coastguard Worker     pDriverContextGLX  = pDriverContext->glx;
64*54e60f84SAndroid Build Coastguard Worker     if (pDriverContextGLX) {
65*54e60f84SAndroid Build Coastguard Worker         free(pDriverContextGLX);
66*54e60f84SAndroid Build Coastguard Worker         pDriverContext->glx = NULL;
67*54e60f84SAndroid Build Coastguard Worker     }
68*54e60f84SAndroid Build Coastguard Worker 
69*54e60f84SAndroid Build Coastguard Worker     pDisplayContextGLX = pDisplayContext->opaque;
70*54e60f84SAndroid Build Coastguard Worker     if (pDisplayContextGLX) {
71*54e60f84SAndroid Build Coastguard Worker         vaDestroyFunc vaDestroy = pDisplayContextGLX->vaDestroy;
72*54e60f84SAndroid Build Coastguard Worker         free(pDisplayContextGLX);
73*54e60f84SAndroid Build Coastguard Worker         pDisplayContext->opaque = NULL;
74*54e60f84SAndroid Build Coastguard Worker         if (vaDestroy)
75*54e60f84SAndroid Build Coastguard Worker             vaDestroy(pDisplayContext);
76*54e60f84SAndroid Build Coastguard Worker     }
77*54e60f84SAndroid Build Coastguard Worker }
78*54e60f84SAndroid Build Coastguard Worker 
79*54e60f84SAndroid Build Coastguard Worker // Return a suitable VADisplay for VA API
vaGetDisplayGLX(Display * native_dpy)80*54e60f84SAndroid Build Coastguard Worker VADisplay vaGetDisplayGLX(Display *native_dpy)
81*54e60f84SAndroid Build Coastguard Worker {
82*54e60f84SAndroid Build Coastguard Worker     VADisplay            dpy                = NULL;
83*54e60f84SAndroid Build Coastguard Worker     VADisplayContextP    pDisplayContext    = NULL;
84*54e60f84SAndroid Build Coastguard Worker     VADisplayContextGLXP pDisplayContextGLX = NULL;
85*54e60f84SAndroid Build Coastguard Worker     VADriverContextP     pDriverContext;
86*54e60f84SAndroid Build Coastguard Worker     VADriverContextGLXP  pDriverContextGLX  = NULL;
87*54e60f84SAndroid Build Coastguard Worker 
88*54e60f84SAndroid Build Coastguard Worker     dpy = vaGetDisplay(native_dpy);
89*54e60f84SAndroid Build Coastguard Worker     if (!dpy)
90*54e60f84SAndroid Build Coastguard Worker         return NULL;
91*54e60f84SAndroid Build Coastguard Worker     pDisplayContext = (VADisplayContextP)dpy;
92*54e60f84SAndroid Build Coastguard Worker     pDriverContext  = pDisplayContext->pDriverContext;
93*54e60f84SAndroid Build Coastguard Worker 
94*54e60f84SAndroid Build Coastguard Worker     pDisplayContextGLX = calloc(1, sizeof(*pDisplayContextGLX));
95*54e60f84SAndroid Build Coastguard Worker     if (!pDisplayContextGLX)
96*54e60f84SAndroid Build Coastguard Worker         goto error;
97*54e60f84SAndroid Build Coastguard Worker 
98*54e60f84SAndroid Build Coastguard Worker     pDriverContextGLX = calloc(1, sizeof(*pDriverContextGLX));
99*54e60f84SAndroid Build Coastguard Worker     if (!pDriverContextGLX)
100*54e60f84SAndroid Build Coastguard Worker         goto error;
101*54e60f84SAndroid Build Coastguard Worker 
102*54e60f84SAndroid Build Coastguard Worker     pDriverContext->display_type  = VA_DISPLAY_GLX;
103*54e60f84SAndroid Build Coastguard Worker     pDisplayContextGLX->vaDestroy = pDisplayContext->vaDestroy;
104*54e60f84SAndroid Build Coastguard Worker     pDisplayContext->vaDestroy    = va_DisplayContextDestroy;
105*54e60f84SAndroid Build Coastguard Worker     pDisplayContext->opaque       = pDisplayContextGLX;
106*54e60f84SAndroid Build Coastguard Worker     pDriverContext->glx           = pDriverContextGLX;
107*54e60f84SAndroid Build Coastguard Worker     return dpy;
108*54e60f84SAndroid Build Coastguard Worker 
109*54e60f84SAndroid Build Coastguard Worker error:
110*54e60f84SAndroid Build Coastguard Worker     free(pDriverContextGLX);
111*54e60f84SAndroid Build Coastguard Worker     free(pDisplayContextGLX);
112*54e60f84SAndroid Build Coastguard Worker     pDisplayContext->vaDestroy(pDisplayContext);
113*54e60f84SAndroid Build Coastguard Worker     return NULL;
114*54e60f84SAndroid Build Coastguard Worker }
115*54e60f84SAndroid Build Coastguard Worker 
116*54e60f84SAndroid Build Coastguard Worker // Create a surface used for display to OpenGL
vaCreateSurfaceGLX(VADisplay dpy,GLenum target,GLuint texture,void ** gl_surface)117*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateSurfaceGLX(
118*54e60f84SAndroid Build Coastguard Worker     VADisplay dpy,
119*54e60f84SAndroid Build Coastguard Worker     GLenum    target,
120*54e60f84SAndroid Build Coastguard Worker     GLuint    texture,
121*54e60f84SAndroid Build Coastguard Worker     void    **gl_surface
122*54e60f84SAndroid Build Coastguard Worker )
123*54e60f84SAndroid Build Coastguard Worker {
124*54e60f84SAndroid Build Coastguard Worker     VADriverContextP ctx;
125*54e60f84SAndroid Build Coastguard Worker     VAStatus status;
126*54e60f84SAndroid Build Coastguard Worker 
127*54e60f84SAndroid Build Coastguard Worker     /* Make sure it is a valid GL texture object */
128*54e60f84SAndroid Build Coastguard Worker     if (!glIsTexture(texture))
129*54e60f84SAndroid Build Coastguard Worker         return VA_STATUS_ERROR_INVALID_PARAMETER;
130*54e60f84SAndroid Build Coastguard Worker 
131*54e60f84SAndroid Build Coastguard Worker     INIT_CONTEXT(ctx, dpy);
132*54e60f84SAndroid Build Coastguard Worker 
133*54e60f84SAndroid Build Coastguard Worker     INVOKE(ctx, CreateSurface, (ctx, target, texture, gl_surface));
134*54e60f84SAndroid Build Coastguard Worker     return status;
135*54e60f84SAndroid Build Coastguard Worker }
136*54e60f84SAndroid Build Coastguard Worker 
137*54e60f84SAndroid Build Coastguard Worker // Destroy a VA/GLX surface
vaDestroySurfaceGLX(VADisplay dpy,void * gl_surface)138*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroySurfaceGLX(
139*54e60f84SAndroid Build Coastguard Worker     VADisplay dpy,
140*54e60f84SAndroid Build Coastguard Worker     void     *gl_surface
141*54e60f84SAndroid Build Coastguard Worker )
142*54e60f84SAndroid Build Coastguard Worker {
143*54e60f84SAndroid Build Coastguard Worker     VADriverContextP ctx;
144*54e60f84SAndroid Build Coastguard Worker     VAStatus status;
145*54e60f84SAndroid Build Coastguard Worker 
146*54e60f84SAndroid Build Coastguard Worker     INIT_CONTEXT(ctx, dpy);
147*54e60f84SAndroid Build Coastguard Worker 
148*54e60f84SAndroid Build Coastguard Worker     INVOKE(ctx, DestroySurface, (ctx, gl_surface));
149*54e60f84SAndroid Build Coastguard Worker     return status;
150*54e60f84SAndroid Build Coastguard Worker }
151*54e60f84SAndroid Build Coastguard Worker 
152*54e60f84SAndroid Build Coastguard Worker // Copy a VA surface to a VA/GLX surface
vaCopySurfaceGLX(VADisplay dpy,void * gl_surface,VASurfaceID surface,unsigned int flags)153*54e60f84SAndroid Build Coastguard Worker VAStatus vaCopySurfaceGLX(
154*54e60f84SAndroid Build Coastguard Worker     VADisplay    dpy,
155*54e60f84SAndroid Build Coastguard Worker     void        *gl_surface,
156*54e60f84SAndroid Build Coastguard Worker     VASurfaceID  surface,
157*54e60f84SAndroid Build Coastguard Worker     unsigned int flags
158*54e60f84SAndroid Build Coastguard Worker )
159*54e60f84SAndroid Build Coastguard Worker {
160*54e60f84SAndroid Build Coastguard Worker     VADriverContextP ctx;
161*54e60f84SAndroid Build Coastguard Worker     VAStatus status;
162*54e60f84SAndroid Build Coastguard Worker 
163*54e60f84SAndroid Build Coastguard Worker     INIT_CONTEXT(ctx, dpy);
164*54e60f84SAndroid Build Coastguard Worker 
165*54e60f84SAndroid Build Coastguard Worker     INVOKE(ctx, CopySurface, (ctx, gl_surface, surface, flags));
166*54e60f84SAndroid Build Coastguard Worker     return status;
167*54e60f84SAndroid Build Coastguard Worker }
168