1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
3*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2023 Emil Velikov
4*54e60f84SAndroid Build Coastguard Worker *
5*54e60f84SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*54e60f84SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
7*54e60f84SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
8*54e60f84SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
9*54e60f84SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
10*54e60f84SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
11*54e60f84SAndroid Build Coastguard Worker * the following conditions:
12*54e60f84SAndroid Build Coastguard Worker *
13*54e60f84SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
14*54e60f84SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
15*54e60f84SAndroid Build Coastguard Worker * of the Software.
16*54e60f84SAndroid Build Coastguard Worker *
17*54e60f84SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*54e60f84SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*54e60f84SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20*54e60f84SAndroid Build Coastguard Worker * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21*54e60f84SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22*54e60f84SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23*54e60f84SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24*54e60f84SAndroid Build Coastguard Worker */
25*54e60f84SAndroid Build Coastguard Worker
26*54e60f84SAndroid Build Coastguard Worker #define _GNU_SOURCE 1
27*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
28*54e60f84SAndroid Build Coastguard Worker #include "va.h"
29*54e60f84SAndroid Build Coastguard Worker #include "va_backend.h"
30*54e60f84SAndroid Build Coastguard Worker #include "va_internal.h"
31*54e60f84SAndroid Build Coastguard Worker #include "va_trace.h"
32*54e60f84SAndroid Build Coastguard Worker #include "va_x11.h"
33*54e60f84SAndroid Build Coastguard Worker #include "va_dri2.h"
34*54e60f84SAndroid Build Coastguard Worker #include "va_dri2_priv.h"
35*54e60f84SAndroid Build Coastguard Worker #include "va_dri3.h"
36*54e60f84SAndroid Build Coastguard Worker #include "va_dricommon.h"
37*54e60f84SAndroid Build Coastguard Worker #include "va_nvctrl.h"
38*54e60f84SAndroid Build Coastguard Worker #include "va_fglrx.h"
39*54e60f84SAndroid Build Coastguard Worker #include <stdio.h>
40*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
41*54e60f84SAndroid Build Coastguard Worker #include <stdarg.h>
42*54e60f84SAndroid Build Coastguard Worker #include <string.h>
43*54e60f84SAndroid Build Coastguard Worker #include <unistd.h>
44*54e60f84SAndroid Build Coastguard Worker #include <sys/types.h>
45*54e60f84SAndroid Build Coastguard Worker #include <sys/stat.h>
46*54e60f84SAndroid Build Coastguard Worker #include <fcntl.h>
47*54e60f84SAndroid Build Coastguard Worker #include <errno.h>
48*54e60f84SAndroid Build Coastguard Worker
va_DisplayContextDestroy(VADisplayContextP pDisplayContext)49*54e60f84SAndroid Build Coastguard Worker static void va_DisplayContextDestroy(
50*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext
51*54e60f84SAndroid Build Coastguard Worker )
52*54e60f84SAndroid Build Coastguard Worker {
53*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
54*54e60f84SAndroid Build Coastguard Worker struct dri_state *dri_state;
55*54e60f84SAndroid Build Coastguard Worker
56*54e60f84SAndroid Build Coastguard Worker if (pDisplayContext == NULL)
57*54e60f84SAndroid Build Coastguard Worker return;
58*54e60f84SAndroid Build Coastguard Worker
59*54e60f84SAndroid Build Coastguard Worker ctx = pDisplayContext->pDriverContext;
60*54e60f84SAndroid Build Coastguard Worker dri_state = ctx->drm_state;
61*54e60f84SAndroid Build Coastguard Worker
62*54e60f84SAndroid Build Coastguard Worker if (dri_state && dri_state->close)
63*54e60f84SAndroid Build Coastguard Worker dri_state->close(ctx);
64*54e60f84SAndroid Build Coastguard Worker
65*54e60f84SAndroid Build Coastguard Worker if (dri_state && dri_state->base.fd != -1)
66*54e60f84SAndroid Build Coastguard Worker close(dri_state->base.fd);
67*54e60f84SAndroid Build Coastguard Worker
68*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext->pDriverContext->drm_state);
69*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext->pDriverContext);
70*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext);
71*54e60f84SAndroid Build Coastguard Worker }
72*54e60f84SAndroid Build Coastguard Worker
va_DisplayContextGetDriverNames(VADisplayContextP pDisplayContext,char ** drivers,unsigned * num_drivers)73*54e60f84SAndroid Build Coastguard Worker static VAStatus va_DisplayContextGetDriverNames(
74*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext,
75*54e60f84SAndroid Build Coastguard Worker char **drivers, unsigned *num_drivers
76*54e60f84SAndroid Build Coastguard Worker )
77*54e60f84SAndroid Build Coastguard Worker {
78*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
79*54e60f84SAndroid Build Coastguard Worker
80*54e60f84SAndroid Build Coastguard Worker if (!getenv("LIBVA_DRI3_DISABLE"))
81*54e60f84SAndroid Build Coastguard Worker vaStatus = va_DRI3_GetDriverNames(pDisplayContext, drivers, num_drivers);
82*54e60f84SAndroid Build Coastguard Worker if (vaStatus != VA_STATUS_SUCCESS)
83*54e60f84SAndroid Build Coastguard Worker vaStatus = va_DRI2_GetDriverNames(pDisplayContext, drivers, num_drivers);
84*54e60f84SAndroid Build Coastguard Worker #ifdef HAVE_NVCTRL
85*54e60f84SAndroid Build Coastguard Worker if (vaStatus != VA_STATUS_SUCCESS)
86*54e60f84SAndroid Build Coastguard Worker vaStatus = va_NVCTRL_GetDriverNames(pDisplayContext, drivers, num_drivers);
87*54e60f84SAndroid Build Coastguard Worker #endif
88*54e60f84SAndroid Build Coastguard Worker #ifdef HAVE_FGLRX
89*54e60f84SAndroid Build Coastguard Worker if (vaStatus != VA_STATUS_SUCCESS)
90*54e60f84SAndroid Build Coastguard Worker vaStatus = va_FGLRX_GetDriverNames(pDisplayContext, drivers, num_drivers);
91*54e60f84SAndroid Build Coastguard Worker #endif
92*54e60f84SAndroid Build Coastguard Worker
93*54e60f84SAndroid Build Coastguard Worker return vaStatus;
94*54e60f84SAndroid Build Coastguard Worker }
95*54e60f84SAndroid Build Coastguard Worker
vaGetDisplay(Display * native_dpy)96*54e60f84SAndroid Build Coastguard Worker VADisplay vaGetDisplay(
97*54e60f84SAndroid Build Coastguard Worker Display *native_dpy /* implementation specific */
98*54e60f84SAndroid Build Coastguard Worker )
99*54e60f84SAndroid Build Coastguard Worker {
100*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext;
101*54e60f84SAndroid Build Coastguard Worker VADriverContextP pDriverContext;
102*54e60f84SAndroid Build Coastguard Worker struct dri_state *dri_state;
103*54e60f84SAndroid Build Coastguard Worker
104*54e60f84SAndroid Build Coastguard Worker if (!native_dpy)
105*54e60f84SAndroid Build Coastguard Worker return NULL;
106*54e60f84SAndroid Build Coastguard Worker
107*54e60f84SAndroid Build Coastguard Worker pDisplayContext = va_newDisplayContext();
108*54e60f84SAndroid Build Coastguard Worker if (!pDisplayContext)
109*54e60f84SAndroid Build Coastguard Worker return NULL;
110*54e60f84SAndroid Build Coastguard Worker
111*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaDestroy = va_DisplayContextDestroy;
112*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaGetDriverNames = va_DisplayContextGetDriverNames;
113*54e60f84SAndroid Build Coastguard Worker
114*54e60f84SAndroid Build Coastguard Worker pDriverContext = va_newDriverContext(pDisplayContext);
115*54e60f84SAndroid Build Coastguard Worker if (!pDriverContext) {
116*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext);
117*54e60f84SAndroid Build Coastguard Worker return NULL;
118*54e60f84SAndroid Build Coastguard Worker }
119*54e60f84SAndroid Build Coastguard Worker
120*54e60f84SAndroid Build Coastguard Worker pDriverContext->native_dpy = (void *)native_dpy;
121*54e60f84SAndroid Build Coastguard Worker pDriverContext->x11_screen = XDefaultScreen(native_dpy);
122*54e60f84SAndroid Build Coastguard Worker pDriverContext->display_type = VA_DISPLAY_X11;
123*54e60f84SAndroid Build Coastguard Worker
124*54e60f84SAndroid Build Coastguard Worker dri_state = calloc(1, sizeof(*dri_state));
125*54e60f84SAndroid Build Coastguard Worker if (!dri_state) {
126*54e60f84SAndroid Build Coastguard Worker free(pDisplayContext);
127*54e60f84SAndroid Build Coastguard Worker free(pDriverContext);
128*54e60f84SAndroid Build Coastguard Worker return NULL;
129*54e60f84SAndroid Build Coastguard Worker }
130*54e60f84SAndroid Build Coastguard Worker
131*54e60f84SAndroid Build Coastguard Worker dri_state->base.fd = -1;
132*54e60f84SAndroid Build Coastguard Worker dri_state->base.auth_type = VA_NONE;
133*54e60f84SAndroid Build Coastguard Worker
134*54e60f84SAndroid Build Coastguard Worker pDriverContext->drm_state = dri_state;
135*54e60f84SAndroid Build Coastguard Worker
136*54e60f84SAndroid Build Coastguard Worker return (VADisplay)pDisplayContext;
137*54e60f84SAndroid Build Coastguard Worker }
138*54e60f84SAndroid Build Coastguard Worker
139*54e60f84SAndroid Build Coastguard Worker void va_TracePutSurface(
140*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
141*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
142*54e60f84SAndroid Build Coastguard Worker void *draw, /* the target Drawable */
143*54e60f84SAndroid Build Coastguard Worker short srcx,
144*54e60f84SAndroid Build Coastguard Worker short srcy,
145*54e60f84SAndroid Build Coastguard Worker unsigned short srcw,
146*54e60f84SAndroid Build Coastguard Worker unsigned short srch,
147*54e60f84SAndroid Build Coastguard Worker short destx,
148*54e60f84SAndroid Build Coastguard Worker short desty,
149*54e60f84SAndroid Build Coastguard Worker unsigned short destw,
150*54e60f84SAndroid Build Coastguard Worker unsigned short desth,
151*54e60f84SAndroid Build Coastguard Worker VARectangle *cliprects, /* client supplied clip list */
152*54e60f84SAndroid Build Coastguard Worker unsigned int number_cliprects, /* number of clip rects in the clip list */
153*54e60f84SAndroid Build Coastguard Worker unsigned int flags /* de-interlacing flags */
154*54e60f84SAndroid Build Coastguard Worker );
155*54e60f84SAndroid Build Coastguard Worker
vaPutSurface(VADisplay dpy,VASurfaceID surface,Drawable draw,short srcx,short srcy,unsigned short srcw,unsigned short srch,short destx,short desty,unsigned short destw,unsigned short desth,VARectangle * cliprects,unsigned int number_cliprects,unsigned int flags)156*54e60f84SAndroid Build Coastguard Worker VAStatus vaPutSurface(
157*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
158*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
159*54e60f84SAndroid Build Coastguard Worker Drawable draw, /* X Drawable */
160*54e60f84SAndroid Build Coastguard Worker short srcx,
161*54e60f84SAndroid Build Coastguard Worker short srcy,
162*54e60f84SAndroid Build Coastguard Worker unsigned short srcw,
163*54e60f84SAndroid Build Coastguard Worker unsigned short srch,
164*54e60f84SAndroid Build Coastguard Worker short destx,
165*54e60f84SAndroid Build Coastguard Worker short desty,
166*54e60f84SAndroid Build Coastguard Worker unsigned short destw,
167*54e60f84SAndroid Build Coastguard Worker unsigned short desth,
168*54e60f84SAndroid Build Coastguard Worker VARectangle *cliprects, /* client supplied clip list */
169*54e60f84SAndroid Build Coastguard Worker unsigned int number_cliprects, /* number of clip rects in the clip list */
170*54e60f84SAndroid Build Coastguard Worker unsigned int flags /* de-interlacing flags */
171*54e60f84SAndroid Build Coastguard Worker )
172*54e60f84SAndroid Build Coastguard Worker {
173*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
174*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
175*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
176*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
177*54e60f84SAndroid Build Coastguard Worker
178*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TracePutSurface, dpy, surface, (void *)draw, srcx, srcy, srcw, srch,
179*54e60f84SAndroid Build Coastguard Worker destx, desty, destw, desth,
180*54e60f84SAndroid Build Coastguard Worker cliprects, number_cliprects, flags);
181*54e60f84SAndroid Build Coastguard Worker
182*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaPutSurface(ctx, surface, (void *)draw, srcx, srcy, srcw, srch,
183*54e60f84SAndroid Build Coastguard Worker destx, desty, destw, desth,
184*54e60f84SAndroid Build Coastguard Worker cliprects, number_cliprects, flags);
185*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
186*54e60f84SAndroid Build Coastguard Worker return vaStatus;
187*54e60f84SAndroid Build Coastguard Worker }
188