1*54e60f84SAndroid Build Coastguard Worker /*
2*54e60f84SAndroid Build Coastguard Worker * Copyright (c) 2007 Intel Corporation. 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 #define _GNU_SOURCE 1
26*54e60f84SAndroid Build Coastguard Worker #include "sysdeps.h"
27*54e60f84SAndroid Build Coastguard Worker #include "va.h"
28*54e60f84SAndroid Build Coastguard Worker #include "va_backend.h"
29*54e60f84SAndroid Build Coastguard Worker #include "va_backend_prot.h"
30*54e60f84SAndroid Build Coastguard Worker #include "va_backend_vpp.h"
31*54e60f84SAndroid Build Coastguard Worker #include "va_internal.h"
32*54e60f84SAndroid Build Coastguard Worker #include "va_trace.h"
33*54e60f84SAndroid Build Coastguard Worker
34*54e60f84SAndroid Build Coastguard Worker #include <assert.h>
35*54e60f84SAndroid Build Coastguard Worker #include <stdarg.h>
36*54e60f84SAndroid Build Coastguard Worker #include <stdio.h>
37*54e60f84SAndroid Build Coastguard Worker #include <stdlib.h>
38*54e60f84SAndroid Build Coastguard Worker #include <string.h>
39*54e60f84SAndroid Build Coastguard Worker #if defined(_WIN32)
40*54e60f84SAndroid Build Coastguard Worker #include "compat_win32.h"
41*54e60f84SAndroid Build Coastguard Worker #define DRIVER_EXTENSION "_drv_video.dll"
42*54e60f84SAndroid Build Coastguard Worker #define DRIVER_PATH_STRING "%s\\%s%s"
43*54e60f84SAndroid Build Coastguard Worker #define ENV_VAR_SEPARATOR ";"
44*54e60f84SAndroid Build Coastguard Worker #else
45*54e60f84SAndroid Build Coastguard Worker #include <dlfcn.h>
46*54e60f84SAndroid Build Coastguard Worker #include <unistd.h>
47*54e60f84SAndroid Build Coastguard Worker #define DRIVER_EXTENSION "_drv_video.so"
48*54e60f84SAndroid Build Coastguard Worker #define DRIVER_PATH_STRING "%s/%s%s"
49*54e60f84SAndroid Build Coastguard Worker #define ENV_VAR_SEPARATOR ":"
50*54e60f84SAndroid Build Coastguard Worker #endif
51*54e60f84SAndroid Build Coastguard Worker #ifdef ANDROID
52*54e60f84SAndroid Build Coastguard Worker #include <log/log.h>
53*54e60f84SAndroid Build Coastguard Worker #endif
54*54e60f84SAndroid Build Coastguard Worker
55*54e60f84SAndroid Build Coastguard Worker #define ASSERT assert
56*54e60f84SAndroid Build Coastguard Worker #define CHECK_VTABLE(s, ctx, func) if (!va_checkVtable(dpy, ctx->vtable->va##func, #func)) s = VA_STATUS_ERROR_UNIMPLEMENTED;
57*54e60f84SAndroid Build Coastguard Worker #define CHECK_MAXIMUM(s, ctx, var) if (!va_checkMaximum(dpy, ctx->max_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
58*54e60f84SAndroid Build Coastguard Worker #define CHECK_STRING(s, ctx, var) if (!va_checkString(dpy, ctx->str_##var, #var)) s = VA_STATUS_ERROR_UNKNOWN;
59*54e60f84SAndroid Build Coastguard Worker
60*54e60f84SAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
61*54e60f84SAndroid Build Coastguard Worker
62*54e60f84SAndroid Build Coastguard Worker #ifndef HAVE_SECURE_GETENV
secure_getenv(const char * name)63*54e60f84SAndroid Build Coastguard Worker static char * secure_getenv(const char *name)
64*54e60f84SAndroid Build Coastguard Worker {
65*54e60f84SAndroid Build Coastguard Worker #if defined(__MINGW32__) || defined(__MINGW64__)
66*54e60f84SAndroid Build Coastguard Worker if (getuid() == geteuid())
67*54e60f84SAndroid Build Coastguard Worker #else
68*54e60f84SAndroid Build Coastguard Worker if (getuid() == geteuid() && getgid() == getegid())
69*54e60f84SAndroid Build Coastguard Worker #endif
70*54e60f84SAndroid Build Coastguard Worker return getenv(name);
71*54e60f84SAndroid Build Coastguard Worker else
72*54e60f84SAndroid Build Coastguard Worker return NULL;
73*54e60f84SAndroid Build Coastguard Worker }
74*54e60f84SAndroid Build Coastguard Worker #endif
75*54e60f84SAndroid Build Coastguard Worker
76*54e60f84SAndroid Build Coastguard Worker /*
77*54e60f84SAndroid Build Coastguard Worker * read a config "env" for libva.conf or from environment setting
78*54e60f84SAndroid Build Coastguard Worker * libva.conf has higher priority
79*54e60f84SAndroid Build Coastguard Worker * return 0: the "env" is set, and the value is copied into env_value
80*54e60f84SAndroid Build Coastguard Worker * 1: the env is not set
81*54e60f84SAndroid Build Coastguard Worker */
va_parseConfig(char * env,char * env_value)82*54e60f84SAndroid Build Coastguard Worker int va_parseConfig(char *env, char *env_value)
83*54e60f84SAndroid Build Coastguard Worker {
84*54e60f84SAndroid Build Coastguard Worker char *token, *value, *saveptr;
85*54e60f84SAndroid Build Coastguard Worker char oneline[1024];
86*54e60f84SAndroid Build Coastguard Worker FILE *fp = NULL;
87*54e60f84SAndroid Build Coastguard Worker
88*54e60f84SAndroid Build Coastguard Worker if (env == NULL)
89*54e60f84SAndroid Build Coastguard Worker return 1;
90*54e60f84SAndroid Build Coastguard Worker
91*54e60f84SAndroid Build Coastguard Worker fp = fopen(SYSCONFDIR "/libva.conf", "r");
92*54e60f84SAndroid Build Coastguard Worker while (fp && (fgets(oneline, 1024, fp) != NULL)) {
93*54e60f84SAndroid Build Coastguard Worker if (strlen(oneline) == 1)
94*54e60f84SAndroid Build Coastguard Worker continue;
95*54e60f84SAndroid Build Coastguard Worker token = strtok_r(oneline, "=\n", &saveptr);
96*54e60f84SAndroid Build Coastguard Worker value = strtok_r(NULL, "=\n", &saveptr);
97*54e60f84SAndroid Build Coastguard Worker
98*54e60f84SAndroid Build Coastguard Worker if (NULL == token || NULL == value)
99*54e60f84SAndroid Build Coastguard Worker continue;
100*54e60f84SAndroid Build Coastguard Worker
101*54e60f84SAndroid Build Coastguard Worker if (strcmp(token, env) == 0) {
102*54e60f84SAndroid Build Coastguard Worker if (env_value) {
103*54e60f84SAndroid Build Coastguard Worker strncpy(env_value, value, 1024);
104*54e60f84SAndroid Build Coastguard Worker env_value[1023] = '\0';
105*54e60f84SAndroid Build Coastguard Worker }
106*54e60f84SAndroid Build Coastguard Worker
107*54e60f84SAndroid Build Coastguard Worker fclose(fp);
108*54e60f84SAndroid Build Coastguard Worker
109*54e60f84SAndroid Build Coastguard Worker return 0;
110*54e60f84SAndroid Build Coastguard Worker }
111*54e60f84SAndroid Build Coastguard Worker }
112*54e60f84SAndroid Build Coastguard Worker if (fp)
113*54e60f84SAndroid Build Coastguard Worker fclose(fp);
114*54e60f84SAndroid Build Coastguard Worker
115*54e60f84SAndroid Build Coastguard Worker /* no setting in config file, use env setting */
116*54e60f84SAndroid Build Coastguard Worker value = secure_getenv(env);
117*54e60f84SAndroid Build Coastguard Worker if (value) {
118*54e60f84SAndroid Build Coastguard Worker if (env_value) {
119*54e60f84SAndroid Build Coastguard Worker strncpy(env_value, value, 1024);
120*54e60f84SAndroid Build Coastguard Worker env_value[1023] = '\0';
121*54e60f84SAndroid Build Coastguard Worker }
122*54e60f84SAndroid Build Coastguard Worker return 0;
123*54e60f84SAndroid Build Coastguard Worker }
124*54e60f84SAndroid Build Coastguard Worker
125*54e60f84SAndroid Build Coastguard Worker return 1;
126*54e60f84SAndroid Build Coastguard Worker }
127*54e60f84SAndroid Build Coastguard Worker
vaDisplayIsValid(VADisplay dpy)128*54e60f84SAndroid Build Coastguard Worker int vaDisplayIsValid(VADisplay dpy)
129*54e60f84SAndroid Build Coastguard Worker {
130*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
131*54e60f84SAndroid Build Coastguard Worker return pDisplayContext &&
132*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vadpy_magic == VA_DISPLAY_MAGIC &&
133*54e60f84SAndroid Build Coastguard Worker pDisplayContext->pDriverContext;
134*54e60f84SAndroid Build Coastguard Worker }
135*54e60f84SAndroid Build Coastguard Worker
136*54e60f84SAndroid Build Coastguard Worker /*
137*54e60f84SAndroid Build Coastguard Worker * Global log level configured from the config file or environment, which sets
138*54e60f84SAndroid Build Coastguard Worker * whether default logging appears or not (always overridden by explicitly
139*54e60f84SAndroid Build Coastguard Worker * user-configured logging).
140*54e60f84SAndroid Build Coastguard Worker */
141*54e60f84SAndroid Build Coastguard Worker static int default_log_level = 2;
142*54e60f84SAndroid Build Coastguard Worker
default_log_error(void * user_context,const char * buffer)143*54e60f84SAndroid Build Coastguard Worker static void default_log_error(void *user_context, const char *buffer)
144*54e60f84SAndroid Build Coastguard Worker {
145*54e60f84SAndroid Build Coastguard Worker if (default_log_level < 1)
146*54e60f84SAndroid Build Coastguard Worker return;
147*54e60f84SAndroid Build Coastguard Worker # ifdef ANDROID
148*54e60f84SAndroid Build Coastguard Worker ALOGE("%s", buffer);
149*54e60f84SAndroid Build Coastguard Worker # else
150*54e60f84SAndroid Build Coastguard Worker fprintf(stderr, "libva error: %s", buffer);
151*54e60f84SAndroid Build Coastguard Worker # endif
152*54e60f84SAndroid Build Coastguard Worker }
153*54e60f84SAndroid Build Coastguard Worker
default_log_info(void * user_context,const char * buffer)154*54e60f84SAndroid Build Coastguard Worker static void default_log_info(void *user_context, const char *buffer)
155*54e60f84SAndroid Build Coastguard Worker {
156*54e60f84SAndroid Build Coastguard Worker if (default_log_level < 2)
157*54e60f84SAndroid Build Coastguard Worker return;
158*54e60f84SAndroid Build Coastguard Worker # ifdef ANDROID
159*54e60f84SAndroid Build Coastguard Worker ALOGI("%s", buffer);
160*54e60f84SAndroid Build Coastguard Worker # else
161*54e60f84SAndroid Build Coastguard Worker fprintf(stderr, "libva info: %s", buffer);
162*54e60f84SAndroid Build Coastguard Worker # endif
163*54e60f84SAndroid Build Coastguard Worker }
164*54e60f84SAndroid Build Coastguard Worker
165*54e60f84SAndroid Build Coastguard Worker /**
166*54e60f84SAndroid Build Coastguard Worker * Set the callback for error messages, or NULL for no logging.
167*54e60f84SAndroid Build Coastguard Worker * Returns the previous one, or NULL if it was disabled.
168*54e60f84SAndroid Build Coastguard Worker */
vaSetErrorCallback(VADisplay dpy,VAMessageCallback callback,void * user_context)169*54e60f84SAndroid Build Coastguard Worker VAMessageCallback vaSetErrorCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
170*54e60f84SAndroid Build Coastguard Worker {
171*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx;
172*54e60f84SAndroid Build Coastguard Worker VAMessageCallback old_callback;
173*54e60f84SAndroid Build Coastguard Worker
174*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
175*54e60f84SAndroid Build Coastguard Worker return NULL;
176*54e60f84SAndroid Build Coastguard Worker
177*54e60f84SAndroid Build Coastguard Worker dctx = (VADisplayContextP)dpy;
178*54e60f84SAndroid Build Coastguard Worker old_callback = dctx->error_callback;
179*54e60f84SAndroid Build Coastguard Worker
180*54e60f84SAndroid Build Coastguard Worker dctx->error_callback = callback;
181*54e60f84SAndroid Build Coastguard Worker dctx->error_callback_user_context = user_context;
182*54e60f84SAndroid Build Coastguard Worker
183*54e60f84SAndroid Build Coastguard Worker return old_callback;
184*54e60f84SAndroid Build Coastguard Worker }
185*54e60f84SAndroid Build Coastguard Worker
186*54e60f84SAndroid Build Coastguard Worker /**
187*54e60f84SAndroid Build Coastguard Worker * Set the callback for info messages, or NULL for no logging.
188*54e60f84SAndroid Build Coastguard Worker * Returns the previous one, or NULL if it was disabled.
189*54e60f84SAndroid Build Coastguard Worker */
vaSetInfoCallback(VADisplay dpy,VAMessageCallback callback,void * user_context)190*54e60f84SAndroid Build Coastguard Worker VAMessageCallback vaSetInfoCallback(VADisplay dpy, VAMessageCallback callback, void *user_context)
191*54e60f84SAndroid Build Coastguard Worker {
192*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx;
193*54e60f84SAndroid Build Coastguard Worker VAMessageCallback old_callback;
194*54e60f84SAndroid Build Coastguard Worker
195*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
196*54e60f84SAndroid Build Coastguard Worker return NULL;
197*54e60f84SAndroid Build Coastguard Worker
198*54e60f84SAndroid Build Coastguard Worker dctx = (VADisplayContextP)dpy;
199*54e60f84SAndroid Build Coastguard Worker old_callback = dctx->info_callback;
200*54e60f84SAndroid Build Coastguard Worker
201*54e60f84SAndroid Build Coastguard Worker dctx->info_callback = callback;
202*54e60f84SAndroid Build Coastguard Worker dctx->info_callback_user_context = user_context;
203*54e60f84SAndroid Build Coastguard Worker
204*54e60f84SAndroid Build Coastguard Worker return old_callback;
205*54e60f84SAndroid Build Coastguard Worker }
206*54e60f84SAndroid Build Coastguard Worker
va_MessagingInit()207*54e60f84SAndroid Build Coastguard Worker static void va_MessagingInit()
208*54e60f84SAndroid Build Coastguard Worker {
209*54e60f84SAndroid Build Coastguard Worker char env_value[1024];
210*54e60f84SAndroid Build Coastguard Worker int ret;
211*54e60f84SAndroid Build Coastguard Worker
212*54e60f84SAndroid Build Coastguard Worker if (va_parseConfig("LIBVA_MESSAGING_LEVEL", &env_value[0]) == 0) {
213*54e60f84SAndroid Build Coastguard Worker ret = sscanf(env_value, "%d", &default_log_level);
214*54e60f84SAndroid Build Coastguard Worker if (ret < 1 || default_log_level < 0 || default_log_level > 2)
215*54e60f84SAndroid Build Coastguard Worker default_log_level = 2;
216*54e60f84SAndroid Build Coastguard Worker }
217*54e60f84SAndroid Build Coastguard Worker }
218*54e60f84SAndroid Build Coastguard Worker
va_errorMessage(VADisplay dpy,const char * msg,...)219*54e60f84SAndroid Build Coastguard Worker void va_errorMessage(VADisplay dpy, const char *msg, ...)
220*54e60f84SAndroid Build Coastguard Worker {
221*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx = (VADisplayContextP)dpy;
222*54e60f84SAndroid Build Coastguard Worker char buf[512], *dynbuf;
223*54e60f84SAndroid Build Coastguard Worker va_list args;
224*54e60f84SAndroid Build Coastguard Worker int n, len;
225*54e60f84SAndroid Build Coastguard Worker
226*54e60f84SAndroid Build Coastguard Worker if (dctx->error_callback == NULL)
227*54e60f84SAndroid Build Coastguard Worker return;
228*54e60f84SAndroid Build Coastguard Worker
229*54e60f84SAndroid Build Coastguard Worker va_start(args, msg);
230*54e60f84SAndroid Build Coastguard Worker len = vsnprintf(buf, sizeof(buf), msg, args);
231*54e60f84SAndroid Build Coastguard Worker va_end(args);
232*54e60f84SAndroid Build Coastguard Worker
233*54e60f84SAndroid Build Coastguard Worker if (len >= (int)sizeof(buf)) {
234*54e60f84SAndroid Build Coastguard Worker dynbuf = malloc(len + 1);
235*54e60f84SAndroid Build Coastguard Worker if (!dynbuf)
236*54e60f84SAndroid Build Coastguard Worker return;
237*54e60f84SAndroid Build Coastguard Worker va_start(args, msg);
238*54e60f84SAndroid Build Coastguard Worker n = vsnprintf(dynbuf, len + 1, msg, args);
239*54e60f84SAndroid Build Coastguard Worker va_end(args);
240*54e60f84SAndroid Build Coastguard Worker if (n == len)
241*54e60f84SAndroid Build Coastguard Worker dctx->error_callback(dctx->error_callback_user_context, dynbuf);
242*54e60f84SAndroid Build Coastguard Worker free(dynbuf);
243*54e60f84SAndroid Build Coastguard Worker } else if (len > 0)
244*54e60f84SAndroid Build Coastguard Worker dctx->error_callback(dctx->error_callback_user_context, buf);
245*54e60f84SAndroid Build Coastguard Worker }
246*54e60f84SAndroid Build Coastguard Worker
va_infoMessage(VADisplay dpy,const char * msg,...)247*54e60f84SAndroid Build Coastguard Worker void va_infoMessage(VADisplay dpy, const char *msg, ...)
248*54e60f84SAndroid Build Coastguard Worker {
249*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx = (VADisplayContextP)dpy;
250*54e60f84SAndroid Build Coastguard Worker char buf[512], *dynbuf;
251*54e60f84SAndroid Build Coastguard Worker va_list args;
252*54e60f84SAndroid Build Coastguard Worker int n, len;
253*54e60f84SAndroid Build Coastguard Worker
254*54e60f84SAndroid Build Coastguard Worker if (dctx->info_callback == NULL)
255*54e60f84SAndroid Build Coastguard Worker return;
256*54e60f84SAndroid Build Coastguard Worker
257*54e60f84SAndroid Build Coastguard Worker va_start(args, msg);
258*54e60f84SAndroid Build Coastguard Worker len = vsnprintf(buf, sizeof(buf), msg, args);
259*54e60f84SAndroid Build Coastguard Worker va_end(args);
260*54e60f84SAndroid Build Coastguard Worker
261*54e60f84SAndroid Build Coastguard Worker if (len >= (int)sizeof(buf)) {
262*54e60f84SAndroid Build Coastguard Worker dynbuf = malloc(len + 1);
263*54e60f84SAndroid Build Coastguard Worker if (!dynbuf)
264*54e60f84SAndroid Build Coastguard Worker return;
265*54e60f84SAndroid Build Coastguard Worker va_start(args, msg);
266*54e60f84SAndroid Build Coastguard Worker n = vsnprintf(dynbuf, len + 1, msg, args);
267*54e60f84SAndroid Build Coastguard Worker va_end(args);
268*54e60f84SAndroid Build Coastguard Worker if (n == len)
269*54e60f84SAndroid Build Coastguard Worker dctx->info_callback(dctx->info_callback_user_context, dynbuf);
270*54e60f84SAndroid Build Coastguard Worker free(dynbuf);
271*54e60f84SAndroid Build Coastguard Worker } else if (len > 0)
272*54e60f84SAndroid Build Coastguard Worker dctx->info_callback(dctx->info_callback_user_context, buf);
273*54e60f84SAndroid Build Coastguard Worker }
274*54e60f84SAndroid Build Coastguard Worker
va_driverErrorCallback(VADriverContextP ctx,const char * message)275*54e60f84SAndroid Build Coastguard Worker static void va_driverErrorCallback(VADriverContextP ctx,
276*54e60f84SAndroid Build Coastguard Worker const char *message)
277*54e60f84SAndroid Build Coastguard Worker {
278*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx = ctx->pDisplayContext;
279*54e60f84SAndroid Build Coastguard Worker if (!dctx)
280*54e60f84SAndroid Build Coastguard Worker return;
281*54e60f84SAndroid Build Coastguard Worker dctx->error_callback(dctx->error_callback_user_context, message);
282*54e60f84SAndroid Build Coastguard Worker }
283*54e60f84SAndroid Build Coastguard Worker
va_driverInfoCallback(VADriverContextP ctx,const char * message)284*54e60f84SAndroid Build Coastguard Worker static void va_driverInfoCallback(VADriverContextP ctx,
285*54e60f84SAndroid Build Coastguard Worker const char *message)
286*54e60f84SAndroid Build Coastguard Worker {
287*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx = ctx->pDisplayContext;
288*54e60f84SAndroid Build Coastguard Worker if (!dctx)
289*54e60f84SAndroid Build Coastguard Worker return;
290*54e60f84SAndroid Build Coastguard Worker dctx->info_callback(dctx->info_callback_user_context, message);
291*54e60f84SAndroid Build Coastguard Worker }
292*54e60f84SAndroid Build Coastguard Worker
va_newDisplayContext(void)293*54e60f84SAndroid Build Coastguard Worker VADisplayContextP va_newDisplayContext(void)
294*54e60f84SAndroid Build Coastguard Worker {
295*54e60f84SAndroid Build Coastguard Worker VADisplayContextP dctx = calloc(1, sizeof(*dctx));
296*54e60f84SAndroid Build Coastguard Worker if (!dctx)
297*54e60f84SAndroid Build Coastguard Worker return NULL;
298*54e60f84SAndroid Build Coastguard Worker
299*54e60f84SAndroid Build Coastguard Worker dctx->vadpy_magic = VA_DISPLAY_MAGIC;
300*54e60f84SAndroid Build Coastguard Worker
301*54e60f84SAndroid Build Coastguard Worker dctx->error_callback = default_log_error;
302*54e60f84SAndroid Build Coastguard Worker dctx->info_callback = default_log_info;
303*54e60f84SAndroid Build Coastguard Worker
304*54e60f84SAndroid Build Coastguard Worker return dctx;
305*54e60f84SAndroid Build Coastguard Worker }
306*54e60f84SAndroid Build Coastguard Worker
va_newDriverContext(VADisplayContextP dctx)307*54e60f84SAndroid Build Coastguard Worker VADriverContextP va_newDriverContext(VADisplayContextP dctx)
308*54e60f84SAndroid Build Coastguard Worker {
309*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx = calloc(1, sizeof(*ctx));
310*54e60f84SAndroid Build Coastguard Worker if (!ctx)
311*54e60f84SAndroid Build Coastguard Worker return NULL;
312*54e60f84SAndroid Build Coastguard Worker
313*54e60f84SAndroid Build Coastguard Worker dctx->pDriverContext = ctx;
314*54e60f84SAndroid Build Coastguard Worker ctx->pDisplayContext = dctx;
315*54e60f84SAndroid Build Coastguard Worker
316*54e60f84SAndroid Build Coastguard Worker ctx->error_callback = va_driverErrorCallback;
317*54e60f84SAndroid Build Coastguard Worker ctx->info_callback = va_driverInfoCallback;
318*54e60f84SAndroid Build Coastguard Worker
319*54e60f84SAndroid Build Coastguard Worker return ctx;
320*54e60f84SAndroid Build Coastguard Worker }
321*54e60f84SAndroid Build Coastguard Worker
va_checkVtable(VADisplay dpy,void * ptr,char * function)322*54e60f84SAndroid Build Coastguard Worker static bool va_checkVtable(VADisplay dpy, void *ptr, char *function)
323*54e60f84SAndroid Build Coastguard Worker {
324*54e60f84SAndroid Build Coastguard Worker if (!ptr) {
325*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "No valid vtable entry for va%s\n", function);
326*54e60f84SAndroid Build Coastguard Worker return false;
327*54e60f84SAndroid Build Coastguard Worker }
328*54e60f84SAndroid Build Coastguard Worker return true;
329*54e60f84SAndroid Build Coastguard Worker }
330*54e60f84SAndroid Build Coastguard Worker
va_checkMaximum(VADisplay dpy,int value,char * variable)331*54e60f84SAndroid Build Coastguard Worker static bool va_checkMaximum(VADisplay dpy, int value, char *variable)
332*54e60f84SAndroid Build Coastguard Worker {
333*54e60f84SAndroid Build Coastguard Worker if (!value) {
334*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "Failed to define max_%s in init\n", variable);
335*54e60f84SAndroid Build Coastguard Worker return false;
336*54e60f84SAndroid Build Coastguard Worker }
337*54e60f84SAndroid Build Coastguard Worker return true;
338*54e60f84SAndroid Build Coastguard Worker }
339*54e60f84SAndroid Build Coastguard Worker
va_checkString(VADisplay dpy,const char * value,char * variable)340*54e60f84SAndroid Build Coastguard Worker static bool va_checkString(VADisplay dpy, const char* value, char *variable)
341*54e60f84SAndroid Build Coastguard Worker {
342*54e60f84SAndroid Build Coastguard Worker if (!value) {
343*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "Failed to define str_%s in init\n", variable);
344*54e60f84SAndroid Build Coastguard Worker return false;
345*54e60f84SAndroid Build Coastguard Worker }
346*54e60f84SAndroid Build Coastguard Worker return true;
347*54e60f84SAndroid Build Coastguard Worker }
348*54e60f84SAndroid Build Coastguard Worker
349*54e60f84SAndroid Build Coastguard Worker static inline int
va_getDriverInitName(char * name,int namelen,int major,int minor)350*54e60f84SAndroid Build Coastguard Worker va_getDriverInitName(char *name, int namelen, int major, int minor)
351*54e60f84SAndroid Build Coastguard Worker {
352*54e60f84SAndroid Build Coastguard Worker int ret = snprintf(name, namelen, "__vaDriverInit_%d_%d", major, minor);
353*54e60f84SAndroid Build Coastguard Worker return ret > 0 && ret < namelen;
354*54e60f84SAndroid Build Coastguard Worker }
355*54e60f84SAndroid Build Coastguard Worker
va_getDriverPath(const char * driver_dir,const char * driver_name)356*54e60f84SAndroid Build Coastguard Worker static char *va_getDriverPath(const char *driver_dir, const char *driver_name)
357*54e60f84SAndroid Build Coastguard Worker {
358*54e60f84SAndroid Build Coastguard Worker int n = snprintf(0, 0, DRIVER_PATH_STRING, driver_dir, driver_name, DRIVER_EXTENSION);
359*54e60f84SAndroid Build Coastguard Worker if (n < 0)
360*54e60f84SAndroid Build Coastguard Worker return NULL;
361*54e60f84SAndroid Build Coastguard Worker char *driver_path = (char *) malloc(n + 1);
362*54e60f84SAndroid Build Coastguard Worker if (!driver_path)
363*54e60f84SAndroid Build Coastguard Worker return NULL;
364*54e60f84SAndroid Build Coastguard Worker n = snprintf(driver_path, n + 1, DRIVER_PATH_STRING,
365*54e60f84SAndroid Build Coastguard Worker driver_dir, driver_name, DRIVER_EXTENSION);
366*54e60f84SAndroid Build Coastguard Worker if (n < 0) {
367*54e60f84SAndroid Build Coastguard Worker free(driver_path);
368*54e60f84SAndroid Build Coastguard Worker return NULL;
369*54e60f84SAndroid Build Coastguard Worker }
370*54e60f84SAndroid Build Coastguard Worker return driver_path;
371*54e60f84SAndroid Build Coastguard Worker }
372*54e60f84SAndroid Build Coastguard Worker
va_openDriver(VADisplay dpy,char * driver_name)373*54e60f84SAndroid Build Coastguard Worker static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
374*54e60f84SAndroid Build Coastguard Worker {
375*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx = CTX(dpy);
376*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_ERROR_UNKNOWN;
377*54e60f84SAndroid Build Coastguard Worker char *search_path = NULL;
378*54e60f84SAndroid Build Coastguard Worker char *saveptr;
379*54e60f84SAndroid Build Coastguard Worker char *driver_dir;
380*54e60f84SAndroid Build Coastguard Worker
381*54e60f84SAndroid Build Coastguard Worker if (geteuid() == getuid())
382*54e60f84SAndroid Build Coastguard Worker /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
383*54e60f84SAndroid Build Coastguard Worker search_path = secure_getenv("LIBVA_DRIVERS_PATH");
384*54e60f84SAndroid Build Coastguard Worker if (!search_path)
385*54e60f84SAndroid Build Coastguard Worker search_path = VA_DRIVERS_PATH;
386*54e60f84SAndroid Build Coastguard Worker
387*54e60f84SAndroid Build Coastguard Worker search_path = strdup((const char *)search_path);
388*54e60f84SAndroid Build Coastguard Worker if (!search_path) {
389*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "%s L%d Out of memory\n",
390*54e60f84SAndroid Build Coastguard Worker __FUNCTION__, __LINE__);
391*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_ALLOCATION_FAILED;
392*54e60f84SAndroid Build Coastguard Worker }
393*54e60f84SAndroid Build Coastguard Worker driver_dir = strtok_r(search_path, ENV_VAR_SEPARATOR, &saveptr);
394*54e60f84SAndroid Build Coastguard Worker while (driver_dir) {
395*54e60f84SAndroid Build Coastguard Worker void *handle = NULL;
396*54e60f84SAndroid Build Coastguard Worker char *driver_path = va_getDriverPath(driver_dir, driver_name);
397*54e60f84SAndroid Build Coastguard Worker if (!driver_path) {
398*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "%s L%d Out of memory\n",
399*54e60f84SAndroid Build Coastguard Worker __FUNCTION__, __LINE__);
400*54e60f84SAndroid Build Coastguard Worker free(search_path);
401*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_ALLOCATION_FAILED;
402*54e60f84SAndroid Build Coastguard Worker }
403*54e60f84SAndroid Build Coastguard Worker
404*54e60f84SAndroid Build Coastguard Worker va_infoMessage(dpy, "Trying to open %s\n", driver_path);
405*54e60f84SAndroid Build Coastguard Worker #if defined(RTLD_NODELETE) && !defined(ANDROID)
406*54e60f84SAndroid Build Coastguard Worker handle = dlopen(driver_path, RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE);
407*54e60f84SAndroid Build Coastguard Worker #else
408*54e60f84SAndroid Build Coastguard Worker handle = dlopen(driver_path, RTLD_NOW | RTLD_GLOBAL);
409*54e60f84SAndroid Build Coastguard Worker #endif
410*54e60f84SAndroid Build Coastguard Worker if (!handle) {
411*54e60f84SAndroid Build Coastguard Worker /* Don't give errors for non-existing files */
412*54e60f84SAndroid Build Coastguard Worker if (0 == access(driver_path, F_OK))
413*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "dlopen of %s failed: %s\n", driver_path, dlerror());
414*54e60f84SAndroid Build Coastguard Worker } else {
415*54e60f84SAndroid Build Coastguard Worker VADriverInit init_func = NULL;
416*54e60f84SAndroid Build Coastguard Worker char init_func_s[256];
417*54e60f84SAndroid Build Coastguard Worker int i;
418*54e60f84SAndroid Build Coastguard Worker
419*54e60f84SAndroid Build Coastguard Worker struct {
420*54e60f84SAndroid Build Coastguard Worker int major;
421*54e60f84SAndroid Build Coastguard Worker int minor;
422*54e60f84SAndroid Build Coastguard Worker } compatible_versions[VA_MINOR_VERSION + 2];
423*54e60f84SAndroid Build Coastguard Worker for (i = 0; i <= VA_MINOR_VERSION; i ++) {
424*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].major = VA_MAJOR_VERSION;
425*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].minor = VA_MINOR_VERSION - i;
426*54e60f84SAndroid Build Coastguard Worker }
427*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].major = -1;
428*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].minor = -1;
429*54e60f84SAndroid Build Coastguard Worker
430*54e60f84SAndroid Build Coastguard Worker for (i = 0; compatible_versions[i].major >= 0; i++) {
431*54e60f84SAndroid Build Coastguard Worker if (va_getDriverInitName(init_func_s, sizeof(init_func_s),
432*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].major,
433*54e60f84SAndroid Build Coastguard Worker compatible_versions[i].minor)) {
434*54e60f84SAndroid Build Coastguard Worker init_func = (VADriverInit)dlsym(handle, init_func_s);
435*54e60f84SAndroid Build Coastguard Worker if (init_func) {
436*54e60f84SAndroid Build Coastguard Worker va_infoMessage(dpy, "Found init function %s\n", init_func_s);
437*54e60f84SAndroid Build Coastguard Worker break;
438*54e60f84SAndroid Build Coastguard Worker }
439*54e60f84SAndroid Build Coastguard Worker }
440*54e60f84SAndroid Build Coastguard Worker }
441*54e60f84SAndroid Build Coastguard Worker
442*54e60f84SAndroid Build Coastguard Worker if (compatible_versions[i].major < 0) {
443*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "%s has no function %s\n",
444*54e60f84SAndroid Build Coastguard Worker driver_path, init_func_s);
445*54e60f84SAndroid Build Coastguard Worker dlclose(handle);
446*54e60f84SAndroid Build Coastguard Worker } else {
447*54e60f84SAndroid Build Coastguard Worker struct VADriverVTable *vtable = ctx->vtable;
448*54e60f84SAndroid Build Coastguard Worker struct VADriverVTableVPP *vtable_vpp = ctx->vtable_vpp;
449*54e60f84SAndroid Build Coastguard Worker struct VADriverVTableProt *vtable_prot = ctx->vtable_prot;
450*54e60f84SAndroid Build Coastguard Worker
451*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_SUCCESS;
452*54e60f84SAndroid Build Coastguard Worker if (!vtable) {
453*54e60f84SAndroid Build Coastguard Worker vtable = calloc(1, sizeof(*vtable));
454*54e60f84SAndroid Build Coastguard Worker if (!vtable)
455*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
456*54e60f84SAndroid Build Coastguard Worker }
457*54e60f84SAndroid Build Coastguard Worker ctx->vtable = vtable;
458*54e60f84SAndroid Build Coastguard Worker
459*54e60f84SAndroid Build Coastguard Worker if (!vtable_vpp) {
460*54e60f84SAndroid Build Coastguard Worker vtable_vpp = calloc(1, sizeof(*vtable_vpp));
461*54e60f84SAndroid Build Coastguard Worker if (vtable_vpp)
462*54e60f84SAndroid Build Coastguard Worker vtable_vpp->version = VA_DRIVER_VTABLE_VPP_VERSION;
463*54e60f84SAndroid Build Coastguard Worker else
464*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
465*54e60f84SAndroid Build Coastguard Worker }
466*54e60f84SAndroid Build Coastguard Worker ctx->vtable_vpp = vtable_vpp;
467*54e60f84SAndroid Build Coastguard Worker
468*54e60f84SAndroid Build Coastguard Worker if (!vtable_prot) {
469*54e60f84SAndroid Build Coastguard Worker vtable_prot = calloc(1, sizeof(*vtable_prot));
470*54e60f84SAndroid Build Coastguard Worker if (vtable_prot)
471*54e60f84SAndroid Build Coastguard Worker vtable_prot->version = VA_DRIVER_VTABLE_PROT_VERSION;
472*54e60f84SAndroid Build Coastguard Worker else
473*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
474*54e60f84SAndroid Build Coastguard Worker }
475*54e60f84SAndroid Build Coastguard Worker ctx->vtable_prot = vtable_prot;
476*54e60f84SAndroid Build Coastguard Worker
477*54e60f84SAndroid Build Coastguard Worker if (init_func && VA_STATUS_SUCCESS == vaStatus)
478*54e60f84SAndroid Build Coastguard Worker vaStatus = (*init_func)(ctx);
479*54e60f84SAndroid Build Coastguard Worker
480*54e60f84SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS == vaStatus) {
481*54e60f84SAndroid Build Coastguard Worker CHECK_MAXIMUM(vaStatus, ctx, profiles);
482*54e60f84SAndroid Build Coastguard Worker CHECK_MAXIMUM(vaStatus, ctx, entrypoints);
483*54e60f84SAndroid Build Coastguard Worker CHECK_MAXIMUM(vaStatus, ctx, attributes);
484*54e60f84SAndroid Build Coastguard Worker CHECK_MAXIMUM(vaStatus, ctx, image_formats);
485*54e60f84SAndroid Build Coastguard Worker CHECK_MAXIMUM(vaStatus, ctx, subpic_formats);
486*54e60f84SAndroid Build Coastguard Worker CHECK_STRING(vaStatus, ctx, vendor);
487*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, Terminate);
488*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QueryConfigProfiles);
489*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QueryConfigEntrypoints);
490*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QueryConfigAttributes);
491*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateConfig);
492*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroyConfig);
493*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, GetConfigAttributes);
494*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateSurfaces);
495*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroySurfaces);
496*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateContext);
497*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroyContext);
498*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateBuffer);
499*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, BufferSetNumElements);
500*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, MapBuffer);
501*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, UnmapBuffer);
502*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroyBuffer);
503*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, BeginPicture);
504*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, RenderPicture);
505*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, EndPicture);
506*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SyncSurface);
507*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QuerySurfaceStatus);
508*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QueryImageFormats);
509*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateImage);
510*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DeriveImage);
511*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroyImage);
512*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SetImagePalette);
513*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, GetImage);
514*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, PutImage);
515*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QuerySubpictureFormats);
516*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, CreateSubpicture);
517*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DestroySubpicture);
518*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SetSubpictureImage);
519*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SetSubpictureChromakey);
520*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SetSubpictureGlobalAlpha);
521*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, AssociateSubpicture);
522*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, DeassociateSubpicture);
523*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, QueryDisplayAttributes);
524*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, GetDisplayAttributes);
525*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, SetDisplayAttributes);
526*54e60f84SAndroid Build Coastguard Worker }
527*54e60f84SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS != vaStatus) {
528*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "%s init failed\n", driver_path);
529*54e60f84SAndroid Build Coastguard Worker dlclose(handle);
530*54e60f84SAndroid Build Coastguard Worker }
531*54e60f84SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS == vaStatus)
532*54e60f84SAndroid Build Coastguard Worker ctx->handle = handle;
533*54e60f84SAndroid Build Coastguard Worker free(driver_path);
534*54e60f84SAndroid Build Coastguard Worker break;
535*54e60f84SAndroid Build Coastguard Worker }
536*54e60f84SAndroid Build Coastguard Worker }
537*54e60f84SAndroid Build Coastguard Worker free(driver_path);
538*54e60f84SAndroid Build Coastguard Worker
539*54e60f84SAndroid Build Coastguard Worker driver_dir = strtok_r(NULL, ENV_VAR_SEPARATOR, &saveptr);
540*54e60f84SAndroid Build Coastguard Worker }
541*54e60f84SAndroid Build Coastguard Worker
542*54e60f84SAndroid Build Coastguard Worker free(search_path);
543*54e60f84SAndroid Build Coastguard Worker
544*54e60f84SAndroid Build Coastguard Worker return vaStatus;
545*54e60f84SAndroid Build Coastguard Worker }
546*54e60f84SAndroid Build Coastguard Worker
vaGetLibFunc(VADisplay dpy,const char * func)547*54e60f84SAndroid Build Coastguard Worker VAPrivFunc vaGetLibFunc(VADisplay dpy, const char *func)
548*54e60f84SAndroid Build Coastguard Worker {
549*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
550*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
551*54e60f84SAndroid Build Coastguard Worker return NULL;
552*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
553*54e60f84SAndroid Build Coastguard Worker
554*54e60f84SAndroid Build Coastguard Worker if (NULL == ctx->handle)
555*54e60f84SAndroid Build Coastguard Worker return NULL;
556*54e60f84SAndroid Build Coastguard Worker
557*54e60f84SAndroid Build Coastguard Worker return (VAPrivFunc) dlsym(ctx->handle, func);
558*54e60f84SAndroid Build Coastguard Worker }
559*54e60f84SAndroid Build Coastguard Worker
560*54e60f84SAndroid Build Coastguard Worker
561*54e60f84SAndroid Build Coastguard Worker /*
562*54e60f84SAndroid Build Coastguard Worker * Returns a short english description of error_status
563*54e60f84SAndroid Build Coastguard Worker */
vaErrorStr(VAStatus error_status)564*54e60f84SAndroid Build Coastguard Worker const char *vaErrorStr(VAStatus error_status)
565*54e60f84SAndroid Build Coastguard Worker {
566*54e60f84SAndroid Build Coastguard Worker switch (error_status) {
567*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_SUCCESS:
568*54e60f84SAndroid Build Coastguard Worker return "success (no error)";
569*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_OPERATION_FAILED:
570*54e60f84SAndroid Build Coastguard Worker return "operation failed";
571*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_ALLOCATION_FAILED:
572*54e60f84SAndroid Build Coastguard Worker return "resource allocation failed";
573*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_DISPLAY:
574*54e60f84SAndroid Build Coastguard Worker return "invalid VADisplay";
575*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_CONFIG:
576*54e60f84SAndroid Build Coastguard Worker return "invalid VAConfigID";
577*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_CONTEXT:
578*54e60f84SAndroid Build Coastguard Worker return "invalid VAContextID";
579*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_SURFACE:
580*54e60f84SAndroid Build Coastguard Worker return "invalid VASurfaceID";
581*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_BUFFER:
582*54e60f84SAndroid Build Coastguard Worker return "invalid VABufferID";
583*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_IMAGE:
584*54e60f84SAndroid Build Coastguard Worker return "invalid VAImageID";
585*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_SUBPICTURE:
586*54e60f84SAndroid Build Coastguard Worker return "invalid VASubpictureID";
587*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_ATTR_NOT_SUPPORTED:
588*54e60f84SAndroid Build Coastguard Worker return "attribute not supported";
589*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_MAX_NUM_EXCEEDED:
590*54e60f84SAndroid Build Coastguard Worker return "list argument exceeds maximum number";
591*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_PROFILE:
592*54e60f84SAndroid Build Coastguard Worker return "the requested VAProfile is not supported";
593*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT:
594*54e60f84SAndroid Build Coastguard Worker return "the requested VAEntryPoint is not supported";
595*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT:
596*54e60f84SAndroid Build Coastguard Worker return "the requested RT Format is not supported";
597*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE:
598*54e60f84SAndroid Build Coastguard Worker return "the requested VABufferType is not supported";
599*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_SURFACE_BUSY:
600*54e60f84SAndroid Build Coastguard Worker return "surface is in use";
601*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_FLAG_NOT_SUPPORTED:
602*54e60f84SAndroid Build Coastguard Worker return "flag not supported";
603*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_PARAMETER:
604*54e60f84SAndroid Build Coastguard Worker return "invalid parameter";
605*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED:
606*54e60f84SAndroid Build Coastguard Worker return "resolution not supported";
607*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNIMPLEMENTED:
608*54e60f84SAndroid Build Coastguard Worker return "the requested function is not implemented";
609*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_SURFACE_IN_DISPLAYING:
610*54e60f84SAndroid Build Coastguard Worker return "surface is in displaying (may by overlay)" ;
611*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_IMAGE_FORMAT:
612*54e60f84SAndroid Build Coastguard Worker return "invalid VAImageFormat";
613*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_DECODING_ERROR:
614*54e60f84SAndroid Build Coastguard Worker return "internal decoding error";
615*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_ENCODING_ERROR:
616*54e60f84SAndroid Build Coastguard Worker return "internal encoding error";
617*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_VALUE:
618*54e60f84SAndroid Build Coastguard Worker return "an invalid/unsupported value was supplied";
619*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_FILTER:
620*54e60f84SAndroid Build Coastguard Worker return "the requested filter is not supported";
621*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_INVALID_FILTER_CHAIN:
622*54e60f84SAndroid Build Coastguard Worker return "an invalid filter chain was supplied";
623*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_HW_BUSY:
624*54e60f84SAndroid Build Coastguard Worker return "HW busy now";
625*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNSUPPORTED_MEMORY_TYPE:
626*54e60f84SAndroid Build Coastguard Worker return "an unsupported memory type was supplied";
627*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_NOT_ENOUGH_BUFFER:
628*54e60f84SAndroid Build Coastguard Worker return "allocated memory size is not enough for input or output";
629*54e60f84SAndroid Build Coastguard Worker case VA_STATUS_ERROR_UNKNOWN:
630*54e60f84SAndroid Build Coastguard Worker return "unknown libva error";
631*54e60f84SAndroid Build Coastguard Worker }
632*54e60f84SAndroid Build Coastguard Worker return "unknown libva error / description missing";
633*54e60f84SAndroid Build Coastguard Worker }
634*54e60f84SAndroid Build Coastguard Worker
vaSetDriverName(VADisplay dpy,char * driver_name)635*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetDriverName(
636*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
637*54e60f84SAndroid Build Coastguard Worker char *driver_name
638*54e60f84SAndroid Build Coastguard Worker )
639*54e60f84SAndroid Build Coastguard Worker {
640*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
641*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
642*54e60f84SAndroid Build Coastguard Worker char *override_driver_name = NULL;
643*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
644*54e60f84SAndroid Build Coastguard Worker
645*54e60f84SAndroid Build Coastguard Worker if (strlen(driver_name) == 0 || strlen(driver_name) >= 256) {
646*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
647*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "vaSetDriverName returns %s\n",
648*54e60f84SAndroid Build Coastguard Worker vaErrorStr(vaStatus));
649*54e60f84SAndroid Build Coastguard Worker return vaStatus;
650*54e60f84SAndroid Build Coastguard Worker }
651*54e60f84SAndroid Build Coastguard Worker
652*54e60f84SAndroid Build Coastguard Worker override_driver_name = strdup(driver_name);
653*54e60f84SAndroid Build Coastguard Worker if (!override_driver_name) {
654*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
655*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "vaSetDriverName returns %s. Out of Memory\n",
656*54e60f84SAndroid Build Coastguard Worker vaErrorStr(vaStatus));
657*54e60f84SAndroid Build Coastguard Worker return vaStatus;
658*54e60f84SAndroid Build Coastguard Worker }
659*54e60f84SAndroid Build Coastguard Worker
660*54e60f84SAndroid Build Coastguard Worker ctx->override_driver_name = override_driver_name;
661*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
662*54e60f84SAndroid Build Coastguard Worker }
663*54e60f84SAndroid Build Coastguard Worker
va_new_opendriver(VADisplay dpy)664*54e60f84SAndroid Build Coastguard Worker static VAStatus va_new_opendriver(VADisplay dpy)
665*54e60f84SAndroid Build Coastguard Worker {
666*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
667*54e60f84SAndroid Build Coastguard Worker /* In the extreme case we can get up-to 5ish names. Pad that out to be on
668*54e60f84SAndroid Build Coastguard Worker * the safe side. In the worst case, the DRIVER BUG below will print and
669*54e60f84SAndroid Build Coastguard Worker * we'll be capped to the current selection.
670*54e60f84SAndroid Build Coastguard Worker */
671*54e60f84SAndroid Build Coastguard Worker char *drivers[20] = { 0, };
672*54e60f84SAndroid Build Coastguard Worker unsigned int num_drivers = ARRAY_SIZE(drivers);
673*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
674*54e60f84SAndroid Build Coastguard Worker const char *driver_name_env;
675*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
676*54e60f84SAndroid Build Coastguard Worker
677*54e60f84SAndroid Build Coastguard Worker /* XXX: The order is bonkers - env var should take highest priority, then
678*54e60f84SAndroid Build Coastguard Worker * override (which ought to be nuked) than native. It's not possible atm,
679*54e60f84SAndroid Build Coastguard Worker * since the DPY connect/init happens during the GetDriverNames.
680*54e60f84SAndroid Build Coastguard Worker */
681*54e60f84SAndroid Build Coastguard Worker vaStatus = pDisplayContext->vaGetDriverNames(pDisplayContext, drivers, &num_drivers);
682*54e60f84SAndroid Build Coastguard Worker if (vaStatus != VA_STATUS_SUCCESS) {
683*54e60f84SAndroid Build Coastguard Worker /* Print and error yet continue, as per the above ordering note */
684*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "vaGetDriverNames() failed with %s\n", vaErrorStr(vaStatus));
685*54e60f84SAndroid Build Coastguard Worker num_drivers = 0;
686*54e60f84SAndroid Build Coastguard Worker }
687*54e60f84SAndroid Build Coastguard Worker
688*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
689*54e60f84SAndroid Build Coastguard Worker driver_name_env = secure_getenv("LIBVA_DRIVER_NAME");
690*54e60f84SAndroid Build Coastguard Worker
691*54e60f84SAndroid Build Coastguard Worker if ((ctx->override_driver_name) || (driver_name_env && (geteuid() == getuid()))) {
692*54e60f84SAndroid Build Coastguard Worker const char *driver = ctx->override_driver_name ?
693*54e60f84SAndroid Build Coastguard Worker ctx->override_driver_name : driver_name_env;
694*54e60f84SAndroid Build Coastguard Worker
695*54e60f84SAndroid Build Coastguard Worker for (unsigned int i = 0; i < num_drivers; i++)
696*54e60f84SAndroid Build Coastguard Worker free(drivers[i]);
697*54e60f84SAndroid Build Coastguard Worker
698*54e60f84SAndroid Build Coastguard Worker drivers[0] = strdup(driver);
699*54e60f84SAndroid Build Coastguard Worker num_drivers = 1;
700*54e60f84SAndroid Build Coastguard Worker
701*54e60f84SAndroid Build Coastguard Worker va_infoMessage(dpy, "User %srequested driver '%s'\n",
702*54e60f84SAndroid Build Coastguard Worker ctx->override_driver_name ? "" : "environment variable ",
703*54e60f84SAndroid Build Coastguard Worker driver);
704*54e60f84SAndroid Build Coastguard Worker }
705*54e60f84SAndroid Build Coastguard Worker
706*54e60f84SAndroid Build Coastguard Worker for (unsigned int i = 0; i < num_drivers; i++) {
707*54e60f84SAndroid Build Coastguard Worker /* The strdup() may have failed. Check here instead of a dozen+ places */
708*54e60f84SAndroid Build Coastguard Worker if (!drivers[i]) {
709*54e60f84SAndroid Build Coastguard Worker va_errorMessage(dpy, "%s:%d: Out of memory\n", __func__, __LINE__);
710*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
711*54e60f84SAndroid Build Coastguard Worker break;
712*54e60f84SAndroid Build Coastguard Worker }
713*54e60f84SAndroid Build Coastguard Worker
714*54e60f84SAndroid Build Coastguard Worker vaStatus = va_openDriver(dpy, drivers[i]);
715*54e60f84SAndroid Build Coastguard Worker va_infoMessage(dpy, "va_openDriver() returns %d\n", vaStatus);
716*54e60f84SAndroid Build Coastguard Worker
717*54e60f84SAndroid Build Coastguard Worker if (vaStatus == VA_STATUS_SUCCESS)
718*54e60f84SAndroid Build Coastguard Worker break;
719*54e60f84SAndroid Build Coastguard Worker }
720*54e60f84SAndroid Build Coastguard Worker
721*54e60f84SAndroid Build Coastguard Worker for (unsigned int i = 0; i < num_drivers; i++)
722*54e60f84SAndroid Build Coastguard Worker free(drivers[i]);
723*54e60f84SAndroid Build Coastguard Worker
724*54e60f84SAndroid Build Coastguard Worker return vaStatus;
725*54e60f84SAndroid Build Coastguard Worker }
726*54e60f84SAndroid Build Coastguard Worker
vaInitialize(VADisplay dpy,int * major_version,int * minor_version)727*54e60f84SAndroid Build Coastguard Worker VAStatus vaInitialize(
728*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
729*54e60f84SAndroid Build Coastguard Worker int *major_version, /* out */
730*54e60f84SAndroid Build Coastguard Worker int *minor_version /* out */
731*54e60f84SAndroid Build Coastguard Worker )
732*54e60f84SAndroid Build Coastguard Worker {
733*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
734*54e60f84SAndroid Build Coastguard Worker
735*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
736*54e60f84SAndroid Build Coastguard Worker
737*54e60f84SAndroid Build Coastguard Worker va_TraceInit(dpy);
738*54e60f84SAndroid Build Coastguard Worker
739*54e60f84SAndroid Build Coastguard Worker va_MessagingInit();
740*54e60f84SAndroid Build Coastguard Worker
741*54e60f84SAndroid Build Coastguard Worker va_infoMessage(dpy, "VA-API version %s\n", VA_VERSION_S);
742*54e60f84SAndroid Build Coastguard Worker
743*54e60f84SAndroid Build Coastguard Worker vaStatus = va_new_opendriver(dpy);
744*54e60f84SAndroid Build Coastguard Worker
745*54e60f84SAndroid Build Coastguard Worker *major_version = VA_MAJOR_VERSION;
746*54e60f84SAndroid Build Coastguard Worker *minor_version = VA_MINOR_VERSION;
747*54e60f84SAndroid Build Coastguard Worker
748*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceInitialize, dpy, major_version, minor_version);
749*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
750*54e60f84SAndroid Build Coastguard Worker return vaStatus;
751*54e60f84SAndroid Build Coastguard Worker }
752*54e60f84SAndroid Build Coastguard Worker
753*54e60f84SAndroid Build Coastguard Worker
754*54e60f84SAndroid Build Coastguard Worker /*
755*54e60f84SAndroid Build Coastguard Worker * After this call, all library internal resources will be cleaned up
756*54e60f84SAndroid Build Coastguard Worker */
vaTerminate(VADisplay dpy)757*54e60f84SAndroid Build Coastguard Worker VAStatus vaTerminate(
758*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
759*54e60f84SAndroid Build Coastguard Worker )
760*54e60f84SAndroid Build Coastguard Worker {
761*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
762*54e60f84SAndroid Build Coastguard Worker VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
763*54e60f84SAndroid Build Coastguard Worker VADriverContextP old_ctx;
764*54e60f84SAndroid Build Coastguard Worker
765*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
766*54e60f84SAndroid Build Coastguard Worker old_ctx = CTX(dpy);
767*54e60f84SAndroid Build Coastguard Worker
768*54e60f84SAndroid Build Coastguard Worker if (old_ctx->handle) {
769*54e60f84SAndroid Build Coastguard Worker vaStatus = old_ctx->vtable->vaTerminate(old_ctx);
770*54e60f84SAndroid Build Coastguard Worker dlclose(old_ctx->handle);
771*54e60f84SAndroid Build Coastguard Worker old_ctx->handle = NULL;
772*54e60f84SAndroid Build Coastguard Worker }
773*54e60f84SAndroid Build Coastguard Worker free(old_ctx->vtable);
774*54e60f84SAndroid Build Coastguard Worker old_ctx->vtable = NULL;
775*54e60f84SAndroid Build Coastguard Worker free(old_ctx->vtable_vpp);
776*54e60f84SAndroid Build Coastguard Worker old_ctx->vtable_vpp = NULL;
777*54e60f84SAndroid Build Coastguard Worker free(old_ctx->vtable_prot);
778*54e60f84SAndroid Build Coastguard Worker old_ctx->vtable_prot = NULL;
779*54e60f84SAndroid Build Coastguard Worker
780*54e60f84SAndroid Build Coastguard Worker if (old_ctx->override_driver_name) {
781*54e60f84SAndroid Build Coastguard Worker free(old_ctx->override_driver_name);
782*54e60f84SAndroid Build Coastguard Worker old_ctx->override_driver_name = NULL;
783*54e60f84SAndroid Build Coastguard Worker }
784*54e60f84SAndroid Build Coastguard Worker
785*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceTerminate, dpy);
786*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
787*54e60f84SAndroid Build Coastguard Worker
788*54e60f84SAndroid Build Coastguard Worker va_TraceEnd(dpy);
789*54e60f84SAndroid Build Coastguard Worker
790*54e60f84SAndroid Build Coastguard Worker if (VA_STATUS_SUCCESS == vaStatus)
791*54e60f84SAndroid Build Coastguard Worker pDisplayContext->vaDestroy(pDisplayContext);
792*54e60f84SAndroid Build Coastguard Worker
793*54e60f84SAndroid Build Coastguard Worker return vaStatus;
794*54e60f84SAndroid Build Coastguard Worker }
795*54e60f84SAndroid Build Coastguard Worker
796*54e60f84SAndroid Build Coastguard Worker /*
797*54e60f84SAndroid Build Coastguard Worker * vaQueryVendorString returns a pointer to a zero-terminated string
798*54e60f84SAndroid Build Coastguard Worker * describing some aspects of the VA implemenation on a specific
799*54e60f84SAndroid Build Coastguard Worker * hardware accelerator. The format of the returned string is:
800*54e60f84SAndroid Build Coastguard Worker * <vendorname>-<major_version>-<minor_version>-<addtional_info>
801*54e60f84SAndroid Build Coastguard Worker * e.g. for the Intel GMA500 implementation, an example would be:
802*54e60f84SAndroid Build Coastguard Worker * "IntelGMA500-1.0-0.2-patch3
803*54e60f84SAndroid Build Coastguard Worker */
vaQueryVendorString(VADisplay dpy)804*54e60f84SAndroid Build Coastguard Worker const char *vaQueryVendorString(
805*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
806*54e60f84SAndroid Build Coastguard Worker )
807*54e60f84SAndroid Build Coastguard Worker {
808*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
809*54e60f84SAndroid Build Coastguard Worker return NULL;
810*54e60f84SAndroid Build Coastguard Worker
811*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->str_vendor;
812*54e60f84SAndroid Build Coastguard Worker }
813*54e60f84SAndroid Build Coastguard Worker
814*54e60f84SAndroid Build Coastguard Worker
815*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of profiles supported by the implementation */
vaMaxNumProfiles(VADisplay dpy)816*54e60f84SAndroid Build Coastguard Worker int vaMaxNumProfiles(
817*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
818*54e60f84SAndroid Build Coastguard Worker )
819*54e60f84SAndroid Build Coastguard Worker {
820*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
821*54e60f84SAndroid Build Coastguard Worker return 0;
822*54e60f84SAndroid Build Coastguard Worker
823*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->max_profiles;
824*54e60f84SAndroid Build Coastguard Worker }
825*54e60f84SAndroid Build Coastguard Worker
826*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of entrypoints supported by the implementation */
vaMaxNumEntrypoints(VADisplay dpy)827*54e60f84SAndroid Build Coastguard Worker int vaMaxNumEntrypoints(
828*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
829*54e60f84SAndroid Build Coastguard Worker )
830*54e60f84SAndroid Build Coastguard Worker {
831*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
832*54e60f84SAndroid Build Coastguard Worker return 0;
833*54e60f84SAndroid Build Coastguard Worker
834*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->max_entrypoints;
835*54e60f84SAndroid Build Coastguard Worker }
836*54e60f84SAndroid Build Coastguard Worker
837*54e60f84SAndroid Build Coastguard Worker
838*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of attributs supported by the implementation */
vaMaxNumConfigAttributes(VADisplay dpy)839*54e60f84SAndroid Build Coastguard Worker int vaMaxNumConfigAttributes(
840*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
841*54e60f84SAndroid Build Coastguard Worker )
842*54e60f84SAndroid Build Coastguard Worker {
843*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
844*54e60f84SAndroid Build Coastguard Worker return 0;
845*54e60f84SAndroid Build Coastguard Worker
846*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->max_attributes;
847*54e60f84SAndroid Build Coastguard Worker }
848*54e60f84SAndroid Build Coastguard Worker
vaQueryConfigEntrypoints(VADisplay dpy,VAProfile profile,VAEntrypoint * entrypoints,int * num_entrypoints)849*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryConfigEntrypoints(
850*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
851*54e60f84SAndroid Build Coastguard Worker VAProfile profile,
852*54e60f84SAndroid Build Coastguard Worker VAEntrypoint *entrypoints, /* out */
853*54e60f84SAndroid Build Coastguard Worker int *num_entrypoints /* out */
854*54e60f84SAndroid Build Coastguard Worker )
855*54e60f84SAndroid Build Coastguard Worker {
856*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
857*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
858*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
859*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
860*54e60f84SAndroid Build Coastguard Worker
861*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaQueryConfigEntrypoints(ctx, profile, entrypoints, num_entrypoints);
862*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
863*54e60f84SAndroid Build Coastguard Worker return vaStatus;
864*54e60f84SAndroid Build Coastguard Worker }
865*54e60f84SAndroid Build Coastguard Worker
vaGetConfigAttributes(VADisplay dpy,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs)866*54e60f84SAndroid Build Coastguard Worker VAStatus vaGetConfigAttributes(
867*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
868*54e60f84SAndroid Build Coastguard Worker VAProfile profile,
869*54e60f84SAndroid Build Coastguard Worker VAEntrypoint entrypoint,
870*54e60f84SAndroid Build Coastguard Worker VAConfigAttrib *attrib_list, /* in/out */
871*54e60f84SAndroid Build Coastguard Worker int num_attribs
872*54e60f84SAndroid Build Coastguard Worker )
873*54e60f84SAndroid Build Coastguard Worker {
874*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
875*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
876*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
877*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
878*54e60f84SAndroid Build Coastguard Worker
879*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaGetConfigAttributes(ctx, profile, entrypoint, attrib_list, num_attribs);
880*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
881*54e60f84SAndroid Build Coastguard Worker return vaStatus;
882*54e60f84SAndroid Build Coastguard Worker }
883*54e60f84SAndroid Build Coastguard Worker
vaQueryConfigProfiles(VADisplay dpy,VAProfile * profile_list,int * num_profiles)884*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryConfigProfiles(
885*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
886*54e60f84SAndroid Build Coastguard Worker VAProfile *profile_list, /* out */
887*54e60f84SAndroid Build Coastguard Worker int *num_profiles /* out */
888*54e60f84SAndroid Build Coastguard Worker )
889*54e60f84SAndroid Build Coastguard Worker {
890*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
891*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
892*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
893*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
894*54e60f84SAndroid Build Coastguard Worker
895*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaQueryConfigProfiles(ctx, profile_list, num_profiles);
896*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
897*54e60f84SAndroid Build Coastguard Worker return vaStatus;
898*54e60f84SAndroid Build Coastguard Worker }
899*54e60f84SAndroid Build Coastguard Worker
vaCreateConfig(VADisplay dpy,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs,VAConfigID * config_id)900*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateConfig(
901*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
902*54e60f84SAndroid Build Coastguard Worker VAProfile profile,
903*54e60f84SAndroid Build Coastguard Worker VAEntrypoint entrypoint,
904*54e60f84SAndroid Build Coastguard Worker VAConfigAttrib *attrib_list,
905*54e60f84SAndroid Build Coastguard Worker int num_attribs,
906*54e60f84SAndroid Build Coastguard Worker VAConfigID *config_id /* out */
907*54e60f84SAndroid Build Coastguard Worker )
908*54e60f84SAndroid Build Coastguard Worker {
909*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
910*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
911*54e60f84SAndroid Build Coastguard Worker
912*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
913*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
914*54e60f84SAndroid Build Coastguard Worker
915*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVVA(dpy, CREATE_CONFIG, TRACE_BEGIN, profile, entrypoint, num_attribs, attrib_list);
916*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateConfig(ctx, profile, entrypoint, attrib_list, num_attribs, config_id);
917*54e60f84SAndroid Build Coastguard Worker
918*54e60f84SAndroid Build Coastguard Worker /* record the current entrypoint for further trace/fool determination */
919*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceCreateConfig, dpy, profile, entrypoint, attrib_list, num_attribs, config_id);
920*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
921*54e60f84SAndroid Build Coastguard Worker VA_TRACE_PV(dpy, CREATE_CONFIG, TRACE_END, config_id, vaStatus);
922*54e60f84SAndroid Build Coastguard Worker return vaStatus;
923*54e60f84SAndroid Build Coastguard Worker }
924*54e60f84SAndroid Build Coastguard Worker
vaDestroyConfig(VADisplay dpy,VAConfigID config_id)925*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroyConfig(
926*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
927*54e60f84SAndroid Build Coastguard Worker VAConfigID config_id
928*54e60f84SAndroid Build Coastguard Worker )
929*54e60f84SAndroid Build Coastguard Worker {
930*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
931*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
932*54e60f84SAndroid Build Coastguard Worker
933*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
934*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
935*54e60f84SAndroid Build Coastguard Worker
936*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_CONFIG, TRACE_BEGIN, config_id);
937*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaDestroyConfig(ctx, config_id);
938*54e60f84SAndroid Build Coastguard Worker
939*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceDestroyConfig, dpy, config_id);
940*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
941*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_CONFIG, TRACE_END, vaStatus);
942*54e60f84SAndroid Build Coastguard Worker
943*54e60f84SAndroid Build Coastguard Worker return vaStatus;
944*54e60f84SAndroid Build Coastguard Worker }
945*54e60f84SAndroid Build Coastguard Worker
vaQueryConfigAttributes(VADisplay dpy,VAConfigID config_id,VAProfile * profile,VAEntrypoint * entrypoint,VAConfigAttrib * attrib_list,int * num_attribs)946*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryConfigAttributes(
947*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
948*54e60f84SAndroid Build Coastguard Worker VAConfigID config_id,
949*54e60f84SAndroid Build Coastguard Worker VAProfile *profile, /* out */
950*54e60f84SAndroid Build Coastguard Worker VAEntrypoint *entrypoint, /* out */
951*54e60f84SAndroid Build Coastguard Worker VAConfigAttrib *attrib_list,/* out */
952*54e60f84SAndroid Build Coastguard Worker int *num_attribs /* out */
953*54e60f84SAndroid Build Coastguard Worker )
954*54e60f84SAndroid Build Coastguard Worker {
955*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
956*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
957*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
958*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
959*54e60f84SAndroid Build Coastguard Worker
960*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaQueryConfigAttributes(ctx, config_id, profile, entrypoint, attrib_list, num_attribs);
961*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
962*54e60f84SAndroid Build Coastguard Worker return vaStatus;
963*54e60f84SAndroid Build Coastguard Worker }
964*54e60f84SAndroid Build Coastguard Worker
vaQueryProcessingRate(VADisplay dpy,VAConfigID config_id,VAProcessingRateParameter * proc_buf,unsigned int * processing_rate)965*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryProcessingRate(
966*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
967*54e60f84SAndroid Build Coastguard Worker VAConfigID config_id,
968*54e60f84SAndroid Build Coastguard Worker VAProcessingRateParameter *proc_buf,
969*54e60f84SAndroid Build Coastguard Worker unsigned int *processing_rate /* out */
970*54e60f84SAndroid Build Coastguard Worker )
971*54e60f84SAndroid Build Coastguard Worker {
972*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
973*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
974*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
975*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
976*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaQueryProcessingRate)
977*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
978*54e60f84SAndroid Build Coastguard Worker else
979*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaQueryProcessingRate(ctx, config_id, proc_buf, processing_rate);
980*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
981*54e60f84SAndroid Build Coastguard Worker return vaStatus;
982*54e60f84SAndroid Build Coastguard Worker }
983*54e60f84SAndroid Build Coastguard Worker
984*54e60f84SAndroid Build Coastguard Worker /* XXX: this is a slow implementation that will be removed */
985*54e60f84SAndroid Build Coastguard Worker static VAStatus
va_impl_query_surface_attributes(VADriverContextP ctx,VAConfigID config,VASurfaceAttrib * out_attribs,unsigned int * out_num_attribs_ptr)986*54e60f84SAndroid Build Coastguard Worker va_impl_query_surface_attributes(
987*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx,
988*54e60f84SAndroid Build Coastguard Worker VAConfigID config,
989*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib *out_attribs,
990*54e60f84SAndroid Build Coastguard Worker unsigned int *out_num_attribs_ptr
991*54e60f84SAndroid Build Coastguard Worker )
992*54e60f84SAndroid Build Coastguard Worker {
993*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib *attribs = NULL;
994*54e60f84SAndroid Build Coastguard Worker unsigned int num_attribs, n;
995*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib *out_attrib;
996*54e60f84SAndroid Build Coastguard Worker unsigned int out_num_attribs;
997*54e60f84SAndroid Build Coastguard Worker VAImageFormat *image_formats = NULL;
998*54e60f84SAndroid Build Coastguard Worker int num_image_formats, i;
999*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1000*54e60f84SAndroid Build Coastguard Worker
1001*54e60f84SAndroid Build Coastguard Worker /* List of surface attributes to query */
1002*54e60f84SAndroid Build Coastguard Worker struct va_surface_attrib_map {
1003*54e60f84SAndroid Build Coastguard Worker VASurfaceAttribType type;
1004*54e60f84SAndroid Build Coastguard Worker VAGenericValueType value_type;
1005*54e60f84SAndroid Build Coastguard Worker };
1006*54e60f84SAndroid Build Coastguard Worker static const struct va_surface_attrib_map attribs_map[] = {
1007*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribMinWidth, VAGenericValueTypeInteger },
1008*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribMaxWidth, VAGenericValueTypeInteger },
1009*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribMinHeight, VAGenericValueTypeInteger },
1010*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribMaxHeight, VAGenericValueTypeInteger },
1011*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribMemoryType, VAGenericValueTypeInteger },
1012*54e60f84SAndroid Build Coastguard Worker { VASurfaceAttribNone, VAGenericValueTypeInteger }
1013*54e60f84SAndroid Build Coastguard Worker };
1014*54e60f84SAndroid Build Coastguard Worker
1015*54e60f84SAndroid Build Coastguard Worker if (!out_attribs || !out_num_attribs_ptr)
1016*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_PARAMETER;
1017*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaGetSurfaceAttributes)
1018*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED;
1019*54e60f84SAndroid Build Coastguard Worker
1020*54e60f84SAndroid Build Coastguard Worker num_image_formats = ctx->max_image_formats;
1021*54e60f84SAndroid Build Coastguard Worker image_formats = malloc(num_image_formats * sizeof(*image_formats));
1022*54e60f84SAndroid Build Coastguard Worker if (!image_formats) {
1023*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1024*54e60f84SAndroid Build Coastguard Worker goto end;
1025*54e60f84SAndroid Build Coastguard Worker }
1026*54e60f84SAndroid Build Coastguard Worker
1027*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaQueryImageFormats(
1028*54e60f84SAndroid Build Coastguard Worker ctx, image_formats, &num_image_formats);
1029*54e60f84SAndroid Build Coastguard Worker if (va_status != VA_STATUS_SUCCESS)
1030*54e60f84SAndroid Build Coastguard Worker goto end;
1031*54e60f84SAndroid Build Coastguard Worker
1032*54e60f84SAndroid Build Coastguard Worker num_attribs = VASurfaceAttribCount + num_image_formats;
1033*54e60f84SAndroid Build Coastguard Worker attribs = malloc(num_attribs * sizeof(*attribs));
1034*54e60f84SAndroid Build Coastguard Worker if (!attribs) {
1035*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1036*54e60f84SAndroid Build Coastguard Worker goto end;
1037*54e60f84SAndroid Build Coastguard Worker }
1038*54e60f84SAndroid Build Coastguard Worker
1039*54e60f84SAndroid Build Coastguard Worker /* Initialize with base surface attributes, except pixel-formats */
1040*54e60f84SAndroid Build Coastguard Worker for (n = 0; attribs_map[n].type != VASurfaceAttribNone; n++) {
1041*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib * const attrib = &attribs[n];
1042*54e60f84SAndroid Build Coastguard Worker attrib->type = attribs_map[n].type;
1043*54e60f84SAndroid Build Coastguard Worker attrib->flags = VA_SURFACE_ATTRIB_GETTABLE;
1044*54e60f84SAndroid Build Coastguard Worker attrib->value.type = attribs_map[n].value_type;
1045*54e60f84SAndroid Build Coastguard Worker }
1046*54e60f84SAndroid Build Coastguard Worker
1047*54e60f84SAndroid Build Coastguard Worker /* Append image formats */
1048*54e60f84SAndroid Build Coastguard Worker for (i = 0; i < num_image_formats; i++) {
1049*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib * const attrib = &attribs[n];
1050*54e60f84SAndroid Build Coastguard Worker attrib->type = VASurfaceAttribPixelFormat;
1051*54e60f84SAndroid Build Coastguard Worker attrib->flags = VA_SURFACE_ATTRIB_GETTABLE | VA_SURFACE_ATTRIB_SETTABLE;
1052*54e60f84SAndroid Build Coastguard Worker attrib->value.type = VAGenericValueTypeInteger;
1053*54e60f84SAndroid Build Coastguard Worker attrib->value.value.i = image_formats[i].fourcc;
1054*54e60f84SAndroid Build Coastguard Worker if (++n == num_attribs) {
1055*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_ALLOCATION_FAILED;
1056*54e60f84SAndroid Build Coastguard Worker goto end;
1057*54e60f84SAndroid Build Coastguard Worker }
1058*54e60f84SAndroid Build Coastguard Worker }
1059*54e60f84SAndroid Build Coastguard Worker num_attribs = n;
1060*54e60f84SAndroid Build Coastguard Worker
1061*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaGetSurfaceAttributes(
1062*54e60f84SAndroid Build Coastguard Worker ctx, config, attribs, num_attribs);
1063*54e60f84SAndroid Build Coastguard Worker if (va_status != VA_STATUS_SUCCESS)
1064*54e60f84SAndroid Build Coastguard Worker goto end;
1065*54e60f84SAndroid Build Coastguard Worker
1066*54e60f84SAndroid Build Coastguard Worker /* Remove invalid entries */
1067*54e60f84SAndroid Build Coastguard Worker out_num_attribs = 0;
1068*54e60f84SAndroid Build Coastguard Worker for (n = 0; n < num_attribs; n++) {
1069*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib * const attrib = &attribs[n];
1070*54e60f84SAndroid Build Coastguard Worker
1071*54e60f84SAndroid Build Coastguard Worker if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1072*54e60f84SAndroid Build Coastguard Worker continue;
1073*54e60f84SAndroid Build Coastguard Worker
1074*54e60f84SAndroid Build Coastguard Worker // Accept all surface attributes that are not pixel-formats
1075*54e60f84SAndroid Build Coastguard Worker if (attrib->type != VASurfaceAttribPixelFormat) {
1076*54e60f84SAndroid Build Coastguard Worker out_num_attribs++;
1077*54e60f84SAndroid Build Coastguard Worker continue;
1078*54e60f84SAndroid Build Coastguard Worker }
1079*54e60f84SAndroid Build Coastguard Worker
1080*54e60f84SAndroid Build Coastguard Worker // Drop invalid pixel-format attribute
1081*54e60f84SAndroid Build Coastguard Worker if (!attrib->value.value.i) {
1082*54e60f84SAndroid Build Coastguard Worker attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1083*54e60f84SAndroid Build Coastguard Worker continue;
1084*54e60f84SAndroid Build Coastguard Worker }
1085*54e60f84SAndroid Build Coastguard Worker
1086*54e60f84SAndroid Build Coastguard Worker // Check for duplicates
1087*54e60f84SAndroid Build Coastguard Worker int is_duplicate = 0;
1088*54e60f84SAndroid Build Coastguard Worker for (i = n - 1; i >= 0 && !is_duplicate; i--) {
1089*54e60f84SAndroid Build Coastguard Worker const VASurfaceAttrib * const prev_attrib = &attribs[i];
1090*54e60f84SAndroid Build Coastguard Worker if (prev_attrib->type != VASurfaceAttribPixelFormat)
1091*54e60f84SAndroid Build Coastguard Worker break;
1092*54e60f84SAndroid Build Coastguard Worker is_duplicate = prev_attrib->value.value.i == attrib->value.value.i;
1093*54e60f84SAndroid Build Coastguard Worker }
1094*54e60f84SAndroid Build Coastguard Worker if (is_duplicate)
1095*54e60f84SAndroid Build Coastguard Worker attrib->flags = VA_SURFACE_ATTRIB_NOT_SUPPORTED;
1096*54e60f84SAndroid Build Coastguard Worker else
1097*54e60f84SAndroid Build Coastguard Worker out_num_attribs++;
1098*54e60f84SAndroid Build Coastguard Worker }
1099*54e60f84SAndroid Build Coastguard Worker
1100*54e60f84SAndroid Build Coastguard Worker if (*out_num_attribs_ptr < out_num_attribs) {
1101*54e60f84SAndroid Build Coastguard Worker *out_num_attribs_ptr = out_num_attribs;
1102*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_MAX_NUM_EXCEEDED;
1103*54e60f84SAndroid Build Coastguard Worker goto end;
1104*54e60f84SAndroid Build Coastguard Worker }
1105*54e60f84SAndroid Build Coastguard Worker
1106*54e60f84SAndroid Build Coastguard Worker out_attrib = out_attribs;
1107*54e60f84SAndroid Build Coastguard Worker for (n = 0; n < num_attribs; n++) {
1108*54e60f84SAndroid Build Coastguard Worker const VASurfaceAttrib * const attrib = &attribs[n];
1109*54e60f84SAndroid Build Coastguard Worker if (attrib->flags == VA_SURFACE_ATTRIB_NOT_SUPPORTED)
1110*54e60f84SAndroid Build Coastguard Worker continue;
1111*54e60f84SAndroid Build Coastguard Worker *out_attrib++ = *attrib;
1112*54e60f84SAndroid Build Coastguard Worker }
1113*54e60f84SAndroid Build Coastguard Worker
1114*54e60f84SAndroid Build Coastguard Worker end:
1115*54e60f84SAndroid Build Coastguard Worker free(attribs);
1116*54e60f84SAndroid Build Coastguard Worker free(image_formats);
1117*54e60f84SAndroid Build Coastguard Worker return va_status;
1118*54e60f84SAndroid Build Coastguard Worker }
1119*54e60f84SAndroid Build Coastguard Worker
1120*54e60f84SAndroid Build Coastguard Worker VAStatus
vaQuerySurfaceAttributes(VADisplay dpy,VAConfigID config,VASurfaceAttrib * attrib_list,unsigned int * num_attribs)1121*54e60f84SAndroid Build Coastguard Worker vaQuerySurfaceAttributes(
1122*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1123*54e60f84SAndroid Build Coastguard Worker VAConfigID config,
1124*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib *attrib_list,
1125*54e60f84SAndroid Build Coastguard Worker unsigned int *num_attribs
1126*54e60f84SAndroid Build Coastguard Worker )
1127*54e60f84SAndroid Build Coastguard Worker {
1128*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1129*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1130*54e60f84SAndroid Build Coastguard Worker
1131*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1132*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1133*54e60f84SAndroid Build Coastguard Worker if (!ctx)
1134*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY;
1135*54e60f84SAndroid Build Coastguard Worker
1136*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, QUERY_SURFACE_ATTR, TRACE_BEGIN, config);
1137*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaQuerySurfaceAttributes)
1138*54e60f84SAndroid Build Coastguard Worker vaStatus = va_impl_query_surface_attributes(ctx, config,
1139*54e60f84SAndroid Build Coastguard Worker attrib_list, num_attribs);
1140*54e60f84SAndroid Build Coastguard Worker else
1141*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaQuerySurfaceAttributes(ctx, config,
1142*54e60f84SAndroid Build Coastguard Worker attrib_list, num_attribs);
1143*54e60f84SAndroid Build Coastguard Worker
1144*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceQuerySurfaceAttributes, dpy, config, attrib_list, num_attribs);
1145*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1146*54e60f84SAndroid Build Coastguard Worker VA_TRACE_PA(dpy, QUERY_SURFACE_ATTR, TRACE_END, num_attribs, attrib_list);
1147*54e60f84SAndroid Build Coastguard Worker
1148*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1149*54e60f84SAndroid Build Coastguard Worker }
1150*54e60f84SAndroid Build Coastguard Worker
1151*54e60f84SAndroid Build Coastguard Worker VAStatus
vaCreateSurfaces(VADisplay dpy,unsigned int format,unsigned int width,unsigned int height,VASurfaceID * surfaces,unsigned int num_surfaces,VASurfaceAttrib * attrib_list,unsigned int num_attribs)1152*54e60f84SAndroid Build Coastguard Worker vaCreateSurfaces(
1153*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1154*54e60f84SAndroid Build Coastguard Worker unsigned int format,
1155*54e60f84SAndroid Build Coastguard Worker unsigned int width,
1156*54e60f84SAndroid Build Coastguard Worker unsigned int height,
1157*54e60f84SAndroid Build Coastguard Worker VASurfaceID *surfaces,
1158*54e60f84SAndroid Build Coastguard Worker unsigned int num_surfaces,
1159*54e60f84SAndroid Build Coastguard Worker VASurfaceAttrib *attrib_list,
1160*54e60f84SAndroid Build Coastguard Worker unsigned int num_attribs
1161*54e60f84SAndroid Build Coastguard Worker )
1162*54e60f84SAndroid Build Coastguard Worker {
1163*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1164*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1165*54e60f84SAndroid Build Coastguard Worker
1166*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1167*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1168*54e60f84SAndroid Build Coastguard Worker if (!ctx)
1169*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY;
1170*54e60f84SAndroid Build Coastguard Worker
1171*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVVVA(dpy, CREATE_SURFACE, TRACE_BEGIN, width, height, format, num_attribs, attrib_list);
1172*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaCreateSurfaces2)
1173*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateSurfaces2(ctx, format, width, height,
1174*54e60f84SAndroid Build Coastguard Worker surfaces, num_surfaces,
1175*54e60f84SAndroid Build Coastguard Worker attrib_list, num_attribs);
1176*54e60f84SAndroid Build Coastguard Worker else if (attrib_list && num_attribs > 0)
1177*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_ATTR_NOT_SUPPORTED;
1178*54e60f84SAndroid Build Coastguard Worker else
1179*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateSurfaces(ctx, width, height, format,
1180*54e60f84SAndroid Build Coastguard Worker num_surfaces, surfaces);
1181*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceCreateSurfaces,
1182*54e60f84SAndroid Build Coastguard Worker dpy, width, height, format, num_surfaces, surfaces,
1183*54e60f84SAndroid Build Coastguard Worker attrib_list, num_attribs);
1184*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1185*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVA(dpy, CREATE_SURFACE, TRACE_END, vaStatus, num_surfaces, surfaces);
1186*54e60f84SAndroid Build Coastguard Worker
1187*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1188*54e60f84SAndroid Build Coastguard Worker }
1189*54e60f84SAndroid Build Coastguard Worker
1190*54e60f84SAndroid Build Coastguard Worker
vaDestroySurfaces(VADisplay dpy,VASurfaceID * surface_list,int num_surfaces)1191*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroySurfaces(
1192*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1193*54e60f84SAndroid Build Coastguard Worker VASurfaceID *surface_list,
1194*54e60f84SAndroid Build Coastguard Worker int num_surfaces
1195*54e60f84SAndroid Build Coastguard Worker )
1196*54e60f84SAndroid Build Coastguard Worker {
1197*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1198*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1199*54e60f84SAndroid Build Coastguard Worker
1200*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1201*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1202*54e60f84SAndroid Build Coastguard Worker
1203*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VA(dpy, DESTROY_SURFACE, TRACE_BEGIN, num_surfaces, surface_list);
1204*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceDestroySurfaces,
1205*54e60f84SAndroid Build Coastguard Worker dpy, surface_list, num_surfaces);
1206*54e60f84SAndroid Build Coastguard Worker
1207*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaDestroySurfaces(ctx, surface_list, num_surfaces);
1208*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1209*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_SURFACE, TRACE_END, vaStatus);
1210*54e60f84SAndroid Build Coastguard Worker
1211*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1212*54e60f84SAndroid Build Coastguard Worker }
1213*54e60f84SAndroid Build Coastguard Worker
vaCreateContext(VADisplay dpy,VAConfigID config_id,int picture_width,int picture_height,int flag,VASurfaceID * render_targets,int num_render_targets,VAContextID * context)1214*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateContext(
1215*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1216*54e60f84SAndroid Build Coastguard Worker VAConfigID config_id,
1217*54e60f84SAndroid Build Coastguard Worker int picture_width,
1218*54e60f84SAndroid Build Coastguard Worker int picture_height,
1219*54e60f84SAndroid Build Coastguard Worker int flag,
1220*54e60f84SAndroid Build Coastguard Worker VASurfaceID *render_targets,
1221*54e60f84SAndroid Build Coastguard Worker int num_render_targets,
1222*54e60f84SAndroid Build Coastguard Worker VAContextID *context /* out */
1223*54e60f84SAndroid Build Coastguard Worker )
1224*54e60f84SAndroid Build Coastguard Worker {
1225*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1226*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1227*54e60f84SAndroid Build Coastguard Worker
1228*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1229*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1230*54e60f84SAndroid Build Coastguard Worker
1231*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVVVVA(dpy, CREATE_CONTEXT, TRACE_BEGIN, config_id, picture_width, picture_height, flag, num_render_targets, render_targets);
1232*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateContext(ctx, config_id, picture_width, picture_height,
1233*54e60f84SAndroid Build Coastguard Worker flag, render_targets, num_render_targets, context);
1234*54e60f84SAndroid Build Coastguard Worker
1235*54e60f84SAndroid Build Coastguard Worker /* keep current encode/decode resoluton */
1236*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceCreateContext, dpy, config_id, picture_width, picture_height, flag, render_targets, num_render_targets, context);
1237*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1238*54e60f84SAndroid Build Coastguard Worker VA_TRACE_PV(dpy, CREATE_CONTEXT, TRACE_END, context, vaStatus);
1239*54e60f84SAndroid Build Coastguard Worker
1240*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1241*54e60f84SAndroid Build Coastguard Worker }
1242*54e60f84SAndroid Build Coastguard Worker
vaDestroyContext(VADisplay dpy,VAContextID context)1243*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroyContext(
1244*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1245*54e60f84SAndroid Build Coastguard Worker VAContextID context
1246*54e60f84SAndroid Build Coastguard Worker )
1247*54e60f84SAndroid Build Coastguard Worker {
1248*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1249*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1250*54e60f84SAndroid Build Coastguard Worker
1251*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1252*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1253*54e60f84SAndroid Build Coastguard Worker
1254*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_CONTEXT, TRACE_BEGIN, context);
1255*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaDestroyContext(ctx, context);
1256*54e60f84SAndroid Build Coastguard Worker
1257*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceDestroyContext, dpy, context);
1258*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1259*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_CONTEXT, TRACE_END, vaStatus);
1260*54e60f84SAndroid Build Coastguard Worker
1261*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1262*54e60f84SAndroid Build Coastguard Worker }
1263*54e60f84SAndroid Build Coastguard Worker
vaCreateMFContext(VADisplay dpy,VAMFContextID * mf_context)1264*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateMFContext(
1265*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1266*54e60f84SAndroid Build Coastguard Worker VAMFContextID *mf_context /* out */
1267*54e60f84SAndroid Build Coastguard Worker )
1268*54e60f84SAndroid Build Coastguard Worker {
1269*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1270*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1271*54e60f84SAndroid Build Coastguard Worker
1272*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1273*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1274*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaCreateMFContext == NULL)
1275*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1276*54e60f84SAndroid Build Coastguard Worker else {
1277*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateMFContext(ctx, mf_context);
1278*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceCreateMFContext, dpy, mf_context);
1279*54e60f84SAndroid Build Coastguard Worker }
1280*54e60f84SAndroid Build Coastguard Worker
1281*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1282*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1283*54e60f84SAndroid Build Coastguard Worker }
1284*54e60f84SAndroid Build Coastguard Worker
vaMFAddContext(VADisplay dpy,VAMFContextID mf_context,VAContextID context)1285*54e60f84SAndroid Build Coastguard Worker VAStatus vaMFAddContext(
1286*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1287*54e60f84SAndroid Build Coastguard Worker VAMFContextID mf_context,
1288*54e60f84SAndroid Build Coastguard Worker VAContextID context
1289*54e60f84SAndroid Build Coastguard Worker )
1290*54e60f84SAndroid Build Coastguard Worker {
1291*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1292*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1293*54e60f84SAndroid Build Coastguard Worker
1294*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1295*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1296*54e60f84SAndroid Build Coastguard Worker
1297*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaMFAddContext == NULL)
1298*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1299*54e60f84SAndroid Build Coastguard Worker else {
1300*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaMFAddContext(ctx, context, mf_context);
1301*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceMFAddContext, dpy, context, mf_context);
1302*54e60f84SAndroid Build Coastguard Worker }
1303*54e60f84SAndroid Build Coastguard Worker
1304*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1305*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1306*54e60f84SAndroid Build Coastguard Worker }
1307*54e60f84SAndroid Build Coastguard Worker
vaMFReleaseContext(VADisplay dpy,VAMFContextID mf_context,VAContextID context)1308*54e60f84SAndroid Build Coastguard Worker VAStatus vaMFReleaseContext(
1309*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1310*54e60f84SAndroid Build Coastguard Worker VAMFContextID mf_context,
1311*54e60f84SAndroid Build Coastguard Worker VAContextID context
1312*54e60f84SAndroid Build Coastguard Worker )
1313*54e60f84SAndroid Build Coastguard Worker {
1314*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1315*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1316*54e60f84SAndroid Build Coastguard Worker
1317*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1318*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1319*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaMFReleaseContext == NULL)
1320*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1321*54e60f84SAndroid Build Coastguard Worker else {
1322*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaMFReleaseContext(ctx, context, mf_context);
1323*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceMFReleaseContext, dpy, context, mf_context);
1324*54e60f84SAndroid Build Coastguard Worker }
1325*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1326*54e60f84SAndroid Build Coastguard Worker
1327*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1328*54e60f84SAndroid Build Coastguard Worker }
1329*54e60f84SAndroid Build Coastguard Worker
vaMFSubmit(VADisplay dpy,VAMFContextID mf_context,VAContextID * contexts,int num_contexts)1330*54e60f84SAndroid Build Coastguard Worker VAStatus vaMFSubmit(
1331*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1332*54e60f84SAndroid Build Coastguard Worker VAMFContextID mf_context,
1333*54e60f84SAndroid Build Coastguard Worker VAContextID *contexts,
1334*54e60f84SAndroid Build Coastguard Worker int num_contexts
1335*54e60f84SAndroid Build Coastguard Worker )
1336*54e60f84SAndroid Build Coastguard Worker {
1337*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1338*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1339*54e60f84SAndroid Build Coastguard Worker
1340*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1341*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1342*54e60f84SAndroid Build Coastguard Worker CHECK_VTABLE(vaStatus, ctx, MFSubmit);
1343*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaMFSubmit == NULL)
1344*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1345*54e60f84SAndroid Build Coastguard Worker else {
1346*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaMFSubmit(ctx, mf_context, contexts, num_contexts);
1347*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceMFSubmit, dpy, mf_context, contexts, num_contexts);
1348*54e60f84SAndroid Build Coastguard Worker }
1349*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1350*54e60f84SAndroid Build Coastguard Worker
1351*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1352*54e60f84SAndroid Build Coastguard Worker }
1353*54e60f84SAndroid Build Coastguard Worker
vaCreateBuffer(VADisplay dpy,VAContextID context,VABufferType type,unsigned int size,unsigned int num_elements,void * data,VABufferID * buf_id)1354*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateBuffer(
1355*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1356*54e60f84SAndroid Build Coastguard Worker VAContextID context, /* in */
1357*54e60f84SAndroid Build Coastguard Worker VABufferType type, /* in */
1358*54e60f84SAndroid Build Coastguard Worker unsigned int size, /* in */
1359*54e60f84SAndroid Build Coastguard Worker unsigned int num_elements, /* in */
1360*54e60f84SAndroid Build Coastguard Worker void *data, /* in */
1361*54e60f84SAndroid Build Coastguard Worker VABufferID *buf_id /* out */
1362*54e60f84SAndroid Build Coastguard Worker )
1363*54e60f84SAndroid Build Coastguard Worker {
1364*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1365*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1366*54e60f84SAndroid Build Coastguard Worker
1367*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1368*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1369*54e60f84SAndroid Build Coastguard Worker
1370*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVVV(dpy, CREATE_BUFFER, TRACE_BEGIN, context, type, size, num_elements);
1371*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateBuffer(ctx, context, type, size, num_elements, data, buf_id);
1372*54e60f84SAndroid Build Coastguard Worker
1373*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceCreateBuffer,
1374*54e60f84SAndroid Build Coastguard Worker dpy, context, type, size, num_elements, data, buf_id);
1375*54e60f84SAndroid Build Coastguard Worker
1376*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1377*54e60f84SAndroid Build Coastguard Worker VA_TRACE_PV(dpy, CREATE_BUFFER, TRACE_END, buf_id, vaStatus);
1378*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1379*54e60f84SAndroid Build Coastguard Worker }
1380*54e60f84SAndroid Build Coastguard Worker
vaCreateBuffer2(VADisplay dpy,VAContextID context,VABufferType type,unsigned int width,unsigned int height,unsigned int * unit_size,unsigned int * pitch,VABufferID * buf_id)1381*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateBuffer2(
1382*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1383*54e60f84SAndroid Build Coastguard Worker VAContextID context,
1384*54e60f84SAndroid Build Coastguard Worker VABufferType type,
1385*54e60f84SAndroid Build Coastguard Worker unsigned int width,
1386*54e60f84SAndroid Build Coastguard Worker unsigned int height,
1387*54e60f84SAndroid Build Coastguard Worker unsigned int *unit_size,
1388*54e60f84SAndroid Build Coastguard Worker unsigned int *pitch,
1389*54e60f84SAndroid Build Coastguard Worker VABufferID *buf_id
1390*54e60f84SAndroid Build Coastguard Worker )
1391*54e60f84SAndroid Build Coastguard Worker {
1392*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1393*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus;
1394*54e60f84SAndroid Build Coastguard Worker
1395*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1396*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1397*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaCreateBuffer2)
1398*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED;
1399*54e60f84SAndroid Build Coastguard Worker
1400*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaCreateBuffer2(ctx, context, type, width, height, unit_size, pitch, buf_id);
1401*54e60f84SAndroid Build Coastguard Worker
1402*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceCreateBuffer,
1403*54e60f84SAndroid Build Coastguard Worker dpy, context, type, *pitch, height, NULL, buf_id);
1404*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1405*54e60f84SAndroid Build Coastguard Worker
1406*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1407*54e60f84SAndroid Build Coastguard Worker }
1408*54e60f84SAndroid Build Coastguard Worker
vaBufferSetNumElements(VADisplay dpy,VABufferID buf_id,unsigned int num_elements)1409*54e60f84SAndroid Build Coastguard Worker VAStatus vaBufferSetNumElements(
1410*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1411*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id, /* in */
1412*54e60f84SAndroid Build Coastguard Worker unsigned int num_elements /* in */
1413*54e60f84SAndroid Build Coastguard Worker )
1414*54e60f84SAndroid Build Coastguard Worker {
1415*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1416*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1417*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1418*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1419*54e60f84SAndroid Build Coastguard Worker
1420*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaBufferSetNumElements(ctx, buf_id, num_elements);
1421*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1422*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1423*54e60f84SAndroid Build Coastguard Worker }
1424*54e60f84SAndroid Build Coastguard Worker
1425*54e60f84SAndroid Build Coastguard Worker
vaMapBuffer(VADisplay dpy,VABufferID buf_id,void ** pbuf)1426*54e60f84SAndroid Build Coastguard Worker VAStatus vaMapBuffer(
1427*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1428*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id, /* in */
1429*54e60f84SAndroid Build Coastguard Worker void **pbuf /* out */
1430*54e60f84SAndroid Build Coastguard Worker )
1431*54e60f84SAndroid Build Coastguard Worker {
1432*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1433*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1434*54e60f84SAndroid Build Coastguard Worker
1435*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1436*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1437*54e60f84SAndroid Build Coastguard Worker
1438*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaMapBuffer2) {
1439*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaMapBuffer2(ctx, buf_id, pbuf, VA_MAPBUFFER_FLAG_DEFAULT);
1440*54e60f84SAndroid Build Coastguard Worker } else if (ctx->vtable->vaMapBuffer) {
1441*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaMapBuffer(ctx, buf_id, pbuf);
1442*54e60f84SAndroid Build Coastguard Worker }
1443*54e60f84SAndroid Build Coastguard Worker
1444*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf, VA_MAPBUFFER_FLAG_DEFAULT);
1445*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1446*54e60f84SAndroid Build Coastguard Worker
1447*54e60f84SAndroid Build Coastguard Worker return va_status;
1448*54e60f84SAndroid Build Coastguard Worker }
1449*54e60f84SAndroid Build Coastguard Worker
vaMapBuffer2(VADisplay dpy,VABufferID buf_id,void ** pbuf,uint32_t flags)1450*54e60f84SAndroid Build Coastguard Worker VAStatus vaMapBuffer2(
1451*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1452*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id, /* in */
1453*54e60f84SAndroid Build Coastguard Worker void **pbuf, /* out */
1454*54e60f84SAndroid Build Coastguard Worker uint32_t flags /*in */
1455*54e60f84SAndroid Build Coastguard Worker )
1456*54e60f84SAndroid Build Coastguard Worker {
1457*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1458*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1459*54e60f84SAndroid Build Coastguard Worker
1460*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1461*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1462*54e60f84SAndroid Build Coastguard Worker
1463*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaMapBuffer2) {
1464*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaMapBuffer2(ctx, buf_id, pbuf, flags);
1465*54e60f84SAndroid Build Coastguard Worker } else if (ctx->vtable->vaMapBuffer) {
1466*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaMapBuffer(ctx, buf_id, pbuf);
1467*54e60f84SAndroid Build Coastguard Worker }
1468*54e60f84SAndroid Build Coastguard Worker
1469*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceMapBuffer, dpy, buf_id, pbuf, flags);
1470*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1471*54e60f84SAndroid Build Coastguard Worker
1472*54e60f84SAndroid Build Coastguard Worker return va_status;
1473*54e60f84SAndroid Build Coastguard Worker }
1474*54e60f84SAndroid Build Coastguard Worker
vaUnmapBuffer(VADisplay dpy,VABufferID buf_id)1475*54e60f84SAndroid Build Coastguard Worker VAStatus vaUnmapBuffer(
1476*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1477*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id /* in */
1478*54e60f84SAndroid Build Coastguard Worker )
1479*54e60f84SAndroid Build Coastguard Worker {
1480*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1481*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1482*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1483*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1484*54e60f84SAndroid Build Coastguard Worker
1485*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaUnmapBuffer(ctx, buf_id);
1486*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1487*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1488*54e60f84SAndroid Build Coastguard Worker }
1489*54e60f84SAndroid Build Coastguard Worker
vaDestroyBuffer(VADisplay dpy,VABufferID buffer_id)1490*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroyBuffer(
1491*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1492*54e60f84SAndroid Build Coastguard Worker VABufferID buffer_id
1493*54e60f84SAndroid Build Coastguard Worker )
1494*54e60f84SAndroid Build Coastguard Worker {
1495*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1496*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1497*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1498*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1499*54e60f84SAndroid Build Coastguard Worker
1500*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_BUFFER, TRACE_BEGIN, buffer_id);
1501*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceDestroyBuffer,
1502*54e60f84SAndroid Build Coastguard Worker dpy, buffer_id);
1503*54e60f84SAndroid Build Coastguard Worker
1504*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaDestroyBuffer(ctx, buffer_id);
1505*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1506*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, DESTROY_BUFFER, TRACE_END, vaStatus);
1507*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1508*54e60f84SAndroid Build Coastguard Worker }
1509*54e60f84SAndroid Build Coastguard Worker
vaBufferInfo(VADisplay dpy,VAContextID context,VABufferID buf_id,VABufferType * type,unsigned int * size,unsigned int * num_elements)1510*54e60f84SAndroid Build Coastguard Worker VAStatus vaBufferInfo(
1511*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1512*54e60f84SAndroid Build Coastguard Worker VAContextID context, /* in */
1513*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id, /* in */
1514*54e60f84SAndroid Build Coastguard Worker VABufferType *type, /* out */
1515*54e60f84SAndroid Build Coastguard Worker unsigned int *size, /* out */
1516*54e60f84SAndroid Build Coastguard Worker unsigned int *num_elements /* out */
1517*54e60f84SAndroid Build Coastguard Worker )
1518*54e60f84SAndroid Build Coastguard Worker {
1519*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1520*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1521*54e60f84SAndroid Build Coastguard Worker
1522*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1523*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1524*54e60f84SAndroid Build Coastguard Worker
1525*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaBufferInfo(ctx, buf_id, type, size, num_elements);
1526*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1527*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1528*54e60f84SAndroid Build Coastguard Worker }
1529*54e60f84SAndroid Build Coastguard Worker
1530*54e60f84SAndroid Build Coastguard Worker /* Locks buffer for external API usage */
1531*54e60f84SAndroid Build Coastguard Worker VAStatus
vaAcquireBufferHandle(VADisplay dpy,VABufferID buf_id,VABufferInfo * buf_info)1532*54e60f84SAndroid Build Coastguard Worker vaAcquireBufferHandle(VADisplay dpy, VABufferID buf_id, VABufferInfo *buf_info)
1533*54e60f84SAndroid Build Coastguard Worker {
1534*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1535*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1536*54e60f84SAndroid Build Coastguard Worker
1537*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1538*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1539*54e60f84SAndroid Build Coastguard Worker
1540*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaAcquireBufferHandle)
1541*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1542*54e60f84SAndroid Build Coastguard Worker else
1543*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaAcquireBufferHandle(ctx, buf_id, buf_info);
1544*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1545*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1546*54e60f84SAndroid Build Coastguard Worker }
1547*54e60f84SAndroid Build Coastguard Worker
1548*54e60f84SAndroid Build Coastguard Worker /* Unlocks buffer after usage from external API */
1549*54e60f84SAndroid Build Coastguard Worker VAStatus
vaReleaseBufferHandle(VADisplay dpy,VABufferID buf_id)1550*54e60f84SAndroid Build Coastguard Worker vaReleaseBufferHandle(VADisplay dpy, VABufferID buf_id)
1551*54e60f84SAndroid Build Coastguard Worker {
1552*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1553*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1554*54e60f84SAndroid Build Coastguard Worker
1555*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1556*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1557*54e60f84SAndroid Build Coastguard Worker
1558*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaReleaseBufferHandle)
1559*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1560*54e60f84SAndroid Build Coastguard Worker else
1561*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaReleaseBufferHandle(ctx, buf_id);
1562*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1563*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1564*54e60f84SAndroid Build Coastguard Worker }
1565*54e60f84SAndroid Build Coastguard Worker
1566*54e60f84SAndroid Build Coastguard Worker VAStatus
vaExportSurfaceHandle(VADisplay dpy,VASurfaceID surface_id,uint32_t mem_type,uint32_t flags,void * descriptor)1567*54e60f84SAndroid Build Coastguard Worker vaExportSurfaceHandle(VADisplay dpy, VASurfaceID surface_id,
1568*54e60f84SAndroid Build Coastguard Worker uint32_t mem_type, uint32_t flags,
1569*54e60f84SAndroid Build Coastguard Worker void *descriptor)
1570*54e60f84SAndroid Build Coastguard Worker {
1571*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1572*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1573*54e60f84SAndroid Build Coastguard Worker
1574*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1575*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1576*54e60f84SAndroid Build Coastguard Worker
1577*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable->vaExportSurfaceHandle)
1578*54e60f84SAndroid Build Coastguard Worker vaStatus = VA_STATUS_ERROR_UNIMPLEMENTED;
1579*54e60f84SAndroid Build Coastguard Worker else
1580*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaExportSurfaceHandle(ctx, surface_id,
1581*54e60f84SAndroid Build Coastguard Worker mem_type, flags,
1582*54e60f84SAndroid Build Coastguard Worker descriptor);
1583*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceExportSurfaceHandle, dpy, surface_id, mem_type, flags, descriptor);
1584*54e60f84SAndroid Build Coastguard Worker
1585*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1586*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1587*54e60f84SAndroid Build Coastguard Worker }
1588*54e60f84SAndroid Build Coastguard Worker
vaBeginPicture(VADisplay dpy,VAContextID context,VASurfaceID render_target)1589*54e60f84SAndroid Build Coastguard Worker VAStatus vaBeginPicture(
1590*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1591*54e60f84SAndroid Build Coastguard Worker VAContextID context,
1592*54e60f84SAndroid Build Coastguard Worker VASurfaceID render_target
1593*54e60f84SAndroid Build Coastguard Worker )
1594*54e60f84SAndroid Build Coastguard Worker {
1595*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1596*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1597*54e60f84SAndroid Build Coastguard Worker
1598*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1599*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1600*54e60f84SAndroid Build Coastguard Worker
1601*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VV(dpy, BEGIN_PICTURE, TRACE_BEGIN, context, render_target);
1602*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceBeginPicture, dpy, context, render_target);
1603*54e60f84SAndroid Build Coastguard Worker
1604*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaBeginPicture(ctx, context, render_target);
1605*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1606*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, BEGIN_PICTURE, TRACE_END, va_status);
1607*54e60f84SAndroid Build Coastguard Worker
1608*54e60f84SAndroid Build Coastguard Worker return va_status;
1609*54e60f84SAndroid Build Coastguard Worker }
1610*54e60f84SAndroid Build Coastguard Worker
vaRenderPicture(VADisplay dpy,VAContextID context,VABufferID * buffers,int num_buffers)1611*54e60f84SAndroid Build Coastguard Worker VAStatus vaRenderPicture(
1612*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1613*54e60f84SAndroid Build Coastguard Worker VAContextID context,
1614*54e60f84SAndroid Build Coastguard Worker VABufferID *buffers,
1615*54e60f84SAndroid Build Coastguard Worker int num_buffers
1616*54e60f84SAndroid Build Coastguard Worker )
1617*54e60f84SAndroid Build Coastguard Worker {
1618*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1619*54e60f84SAndroid Build Coastguard Worker VAStatus vaStatus = VA_STATUS_SUCCESS;
1620*54e60f84SAndroid Build Coastguard Worker
1621*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1622*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1623*54e60f84SAndroid Build Coastguard Worker
1624*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VVA(dpy, RENDER_PICTURE, TRACE_BEGIN, context, num_buffers, buffers);
1625*54e60f84SAndroid Build Coastguard Worker VA_TRACE_BUFFERS(dpy, context, num_buffers, buffers);
1626*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceRenderPicture, dpy, context, buffers, num_buffers);
1627*54e60f84SAndroid Build Coastguard Worker
1628*54e60f84SAndroid Build Coastguard Worker vaStatus = ctx->vtable->vaRenderPicture(ctx, context, buffers, num_buffers);
1629*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, vaStatus);
1630*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, RENDER_PICTURE, TRACE_END, vaStatus);
1631*54e60f84SAndroid Build Coastguard Worker return vaStatus;
1632*54e60f84SAndroid Build Coastguard Worker }
1633*54e60f84SAndroid Build Coastguard Worker
vaEndPicture(VADisplay dpy,VAContextID context)1634*54e60f84SAndroid Build Coastguard Worker VAStatus vaEndPicture(
1635*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1636*54e60f84SAndroid Build Coastguard Worker VAContextID context
1637*54e60f84SAndroid Build Coastguard Worker )
1638*54e60f84SAndroid Build Coastguard Worker {
1639*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1640*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1641*54e60f84SAndroid Build Coastguard Worker
1642*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1643*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1644*54e60f84SAndroid Build Coastguard Worker
1645*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, END_PICTURE, TRACE_BEGIN, context);
1646*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceEndPicture, dpy, context, 0);
1647*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaEndPicture(ctx, context);
1648*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1649*54e60f84SAndroid Build Coastguard Worker /* dump surface content */
1650*54e60f84SAndroid Build Coastguard Worker VA_TRACE_ALL(va_TraceEndPictureExt, dpy, context, 1);
1651*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, END_PICTURE, TRACE_END, va_status);
1652*54e60f84SAndroid Build Coastguard Worker
1653*54e60f84SAndroid Build Coastguard Worker return va_status;
1654*54e60f84SAndroid Build Coastguard Worker }
1655*54e60f84SAndroid Build Coastguard Worker
vaSyncSurface(VADisplay dpy,VASurfaceID render_target)1656*54e60f84SAndroid Build Coastguard Worker VAStatus vaSyncSurface(
1657*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1658*54e60f84SAndroid Build Coastguard Worker VASurfaceID render_target
1659*54e60f84SAndroid Build Coastguard Worker )
1660*54e60f84SAndroid Build Coastguard Worker {
1661*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1662*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1663*54e60f84SAndroid Build Coastguard Worker
1664*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1665*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1666*54e60f84SAndroid Build Coastguard Worker
1667*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, SYNC_SURFACE, TRACE_BEGIN, render_target);
1668*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaSyncSurface(ctx, render_target);
1669*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceSyncSurface, dpy, render_target);
1670*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1671*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, SYNC_SURFACE, TRACE_END, va_status);
1672*54e60f84SAndroid Build Coastguard Worker
1673*54e60f84SAndroid Build Coastguard Worker return va_status;
1674*54e60f84SAndroid Build Coastguard Worker }
1675*54e60f84SAndroid Build Coastguard Worker
vaSyncSurface2(VADisplay dpy,VASurfaceID surface,uint64_t timeout_ns)1676*54e60f84SAndroid Build Coastguard Worker VAStatus vaSyncSurface2(
1677*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1678*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
1679*54e60f84SAndroid Build Coastguard Worker uint64_t timeout_ns
1680*54e60f84SAndroid Build Coastguard Worker )
1681*54e60f84SAndroid Build Coastguard Worker {
1682*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1683*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1684*54e60f84SAndroid Build Coastguard Worker
1685*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1686*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1687*54e60f84SAndroid Build Coastguard Worker
1688*54e60f84SAndroid Build Coastguard Worker VA_TRACE_VV(dpy, SYNC_SURFACE2, TRACE_BEGIN, surface, timeout_ns);
1689*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaSyncSurface2)
1690*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaSyncSurface2(ctx, surface, timeout_ns);
1691*54e60f84SAndroid Build Coastguard Worker else
1692*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
1693*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceSyncSurface2, dpy, surface, timeout_ns);
1694*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1695*54e60f84SAndroid Build Coastguard Worker VA_TRACE_V(dpy, SYNC_SURFACE2, TRACE_END, va_status);
1696*54e60f84SAndroid Build Coastguard Worker
1697*54e60f84SAndroid Build Coastguard Worker return va_status;
1698*54e60f84SAndroid Build Coastguard Worker }
1699*54e60f84SAndroid Build Coastguard Worker
vaQuerySurfaceStatus(VADisplay dpy,VASurfaceID render_target,VASurfaceStatus * status)1700*54e60f84SAndroid Build Coastguard Worker VAStatus vaQuerySurfaceStatus(
1701*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1702*54e60f84SAndroid Build Coastguard Worker VASurfaceID render_target,
1703*54e60f84SAndroid Build Coastguard Worker VASurfaceStatus *status /* out */
1704*54e60f84SAndroid Build Coastguard Worker )
1705*54e60f84SAndroid Build Coastguard Worker {
1706*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1707*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1708*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1709*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1710*54e60f84SAndroid Build Coastguard Worker
1711*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaQuerySurfaceStatus(ctx, render_target, status);
1712*54e60f84SAndroid Build Coastguard Worker
1713*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceQuerySurfaceStatus, dpy, render_target, status);
1714*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1715*54e60f84SAndroid Build Coastguard Worker
1716*54e60f84SAndroid Build Coastguard Worker return va_status;
1717*54e60f84SAndroid Build Coastguard Worker }
1718*54e60f84SAndroid Build Coastguard Worker
vaQuerySurfaceError(VADisplay dpy,VASurfaceID surface,VAStatus error_status,void ** error_info)1719*54e60f84SAndroid Build Coastguard Worker VAStatus vaQuerySurfaceError(
1720*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1721*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
1722*54e60f84SAndroid Build Coastguard Worker VAStatus error_status,
1723*54e60f84SAndroid Build Coastguard Worker void **error_info /*out*/
1724*54e60f84SAndroid Build Coastguard Worker )
1725*54e60f84SAndroid Build Coastguard Worker {
1726*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1727*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1728*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1729*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1730*54e60f84SAndroid Build Coastguard Worker
1731*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaQuerySurfaceError(ctx, surface, error_status, error_info);
1732*54e60f84SAndroid Build Coastguard Worker
1733*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceQuerySurfaceError, dpy, surface, error_status, error_info);
1734*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1735*54e60f84SAndroid Build Coastguard Worker
1736*54e60f84SAndroid Build Coastguard Worker return va_status;
1737*54e60f84SAndroid Build Coastguard Worker }
1738*54e60f84SAndroid Build Coastguard Worker
vaSyncBuffer(VADisplay dpy,VABufferID buf_id,uint64_t timeout_ns)1739*54e60f84SAndroid Build Coastguard Worker VAStatus vaSyncBuffer(
1740*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1741*54e60f84SAndroid Build Coastguard Worker VABufferID buf_id,
1742*54e60f84SAndroid Build Coastguard Worker uint64_t timeout_ns
1743*54e60f84SAndroid Build Coastguard Worker )
1744*54e60f84SAndroid Build Coastguard Worker {
1745*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
1746*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1747*54e60f84SAndroid Build Coastguard Worker
1748*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1749*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1750*54e60f84SAndroid Build Coastguard Worker
1751*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceSyncBuffer, dpy, buf_id, timeout_ns);
1752*54e60f84SAndroid Build Coastguard Worker
1753*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaSyncBuffer)
1754*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaSyncBuffer(ctx, buf_id, timeout_ns);
1755*54e60f84SAndroid Build Coastguard Worker else
1756*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
1757*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1758*54e60f84SAndroid Build Coastguard Worker
1759*54e60f84SAndroid Build Coastguard Worker return va_status;
1760*54e60f84SAndroid Build Coastguard Worker }
1761*54e60f84SAndroid Build Coastguard Worker
1762*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of image formats supported by the implementation */
vaMaxNumImageFormats(VADisplay dpy)1763*54e60f84SAndroid Build Coastguard Worker int vaMaxNumImageFormats(
1764*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
1765*54e60f84SAndroid Build Coastguard Worker )
1766*54e60f84SAndroid Build Coastguard Worker {
1767*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
1768*54e60f84SAndroid Build Coastguard Worker return 0;
1769*54e60f84SAndroid Build Coastguard Worker
1770*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->max_image_formats;
1771*54e60f84SAndroid Build Coastguard Worker }
1772*54e60f84SAndroid Build Coastguard Worker
vaQueryImageFormats(VADisplay dpy,VAImageFormat * format_list,int * num_formats)1773*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryImageFormats(
1774*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1775*54e60f84SAndroid Build Coastguard Worker VAImageFormat *format_list, /* out */
1776*54e60f84SAndroid Build Coastguard Worker int *num_formats /* out */
1777*54e60f84SAndroid Build Coastguard Worker )
1778*54e60f84SAndroid Build Coastguard Worker {
1779*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1780*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1781*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1782*54e60f84SAndroid Build Coastguard Worker
1783*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaQueryImageFormats(ctx, format_list, num_formats);
1784*54e60f84SAndroid Build Coastguard Worker }
1785*54e60f84SAndroid Build Coastguard Worker
1786*54e60f84SAndroid Build Coastguard Worker /*
1787*54e60f84SAndroid Build Coastguard Worker * The width and height fields returned in the VAImage structure may get
1788*54e60f84SAndroid Build Coastguard Worker * enlarged for some YUV formats. The size of the data buffer that needs
1789*54e60f84SAndroid Build Coastguard Worker * to be allocated will be given in the "data_size" field in VAImage.
1790*54e60f84SAndroid Build Coastguard Worker * Image data is not allocated by this function. The client should
1791*54e60f84SAndroid Build Coastguard Worker * allocate the memory and fill in the VAImage structure's data field
1792*54e60f84SAndroid Build Coastguard Worker * after looking at "data_size" returned from the library.
1793*54e60f84SAndroid Build Coastguard Worker */
vaCreateImage(VADisplay dpy,VAImageFormat * format,int width,int height,VAImage * image)1794*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateImage(
1795*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1796*54e60f84SAndroid Build Coastguard Worker VAImageFormat *format,
1797*54e60f84SAndroid Build Coastguard Worker int width,
1798*54e60f84SAndroid Build Coastguard Worker int height,
1799*54e60f84SAndroid Build Coastguard Worker VAImage *image /* out */
1800*54e60f84SAndroid Build Coastguard Worker )
1801*54e60f84SAndroid Build Coastguard Worker {
1802*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1803*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1804*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1805*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1806*54e60f84SAndroid Build Coastguard Worker
1807*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaCreateImage(ctx, format, width, height, image);
1808*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1809*54e60f84SAndroid Build Coastguard Worker return va_status;
1810*54e60f84SAndroid Build Coastguard Worker }
1811*54e60f84SAndroid Build Coastguard Worker
1812*54e60f84SAndroid Build Coastguard Worker /*
1813*54e60f84SAndroid Build Coastguard Worker * Should call DestroyImage before destroying the surface it is bound to
1814*54e60f84SAndroid Build Coastguard Worker */
vaDestroyImage(VADisplay dpy,VAImageID image)1815*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroyImage(
1816*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1817*54e60f84SAndroid Build Coastguard Worker VAImageID image
1818*54e60f84SAndroid Build Coastguard Worker )
1819*54e60f84SAndroid Build Coastguard Worker {
1820*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1821*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1822*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1823*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1824*54e60f84SAndroid Build Coastguard Worker
1825*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaDestroyImage(ctx, image);
1826*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1827*54e60f84SAndroid Build Coastguard Worker return va_status;
1828*54e60f84SAndroid Build Coastguard Worker }
1829*54e60f84SAndroid Build Coastguard Worker
vaSetImagePalette(VADisplay dpy,VAImageID image,unsigned char * palette)1830*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetImagePalette(
1831*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1832*54e60f84SAndroid Build Coastguard Worker VAImageID image,
1833*54e60f84SAndroid Build Coastguard Worker unsigned char *palette
1834*54e60f84SAndroid Build Coastguard Worker )
1835*54e60f84SAndroid Build Coastguard Worker {
1836*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1837*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1838*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1839*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1840*54e60f84SAndroid Build Coastguard Worker
1841*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaSetImagePalette(ctx, image, palette);
1842*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1843*54e60f84SAndroid Build Coastguard Worker return va_status;
1844*54e60f84SAndroid Build Coastguard Worker }
1845*54e60f84SAndroid Build Coastguard Worker
1846*54e60f84SAndroid Build Coastguard Worker /*
1847*54e60f84SAndroid Build Coastguard Worker * Retrieve surface data into a VAImage
1848*54e60f84SAndroid Build Coastguard Worker * Image must be in a format supported by the implementation
1849*54e60f84SAndroid Build Coastguard Worker */
vaGetImage(VADisplay dpy,VASurfaceID surface,int x,int y,unsigned int width,unsigned int height,VAImageID image)1850*54e60f84SAndroid Build Coastguard Worker VAStatus vaGetImage(
1851*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1852*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
1853*54e60f84SAndroid Build Coastguard Worker int x, /* coordinates of the upper left source pixel */
1854*54e60f84SAndroid Build Coastguard Worker int y,
1855*54e60f84SAndroid Build Coastguard Worker unsigned int width, /* width and height of the region */
1856*54e60f84SAndroid Build Coastguard Worker unsigned int height,
1857*54e60f84SAndroid Build Coastguard Worker VAImageID image
1858*54e60f84SAndroid Build Coastguard Worker )
1859*54e60f84SAndroid Build Coastguard Worker {
1860*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1861*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1862*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1863*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1864*54e60f84SAndroid Build Coastguard Worker
1865*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaGetImage(ctx, surface, x, y, width, height, image);
1866*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1867*54e60f84SAndroid Build Coastguard Worker return va_status;
1868*54e60f84SAndroid Build Coastguard Worker }
1869*54e60f84SAndroid Build Coastguard Worker
1870*54e60f84SAndroid Build Coastguard Worker /*
1871*54e60f84SAndroid Build Coastguard Worker * Copy data from a VAImage to a surface
1872*54e60f84SAndroid Build Coastguard Worker * Image must be in a format supported by the implementation
1873*54e60f84SAndroid Build Coastguard Worker */
vaPutImage(VADisplay dpy,VASurfaceID surface,VAImageID image,int src_x,int src_y,unsigned int src_width,unsigned int src_height,int dest_x,int dest_y,unsigned int dest_width,unsigned int dest_height)1874*54e60f84SAndroid Build Coastguard Worker VAStatus vaPutImage(
1875*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1876*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
1877*54e60f84SAndroid Build Coastguard Worker VAImageID image,
1878*54e60f84SAndroid Build Coastguard Worker int src_x,
1879*54e60f84SAndroid Build Coastguard Worker int src_y,
1880*54e60f84SAndroid Build Coastguard Worker unsigned int src_width,
1881*54e60f84SAndroid Build Coastguard Worker unsigned int src_height,
1882*54e60f84SAndroid Build Coastguard Worker int dest_x,
1883*54e60f84SAndroid Build Coastguard Worker int dest_y,
1884*54e60f84SAndroid Build Coastguard Worker unsigned int dest_width,
1885*54e60f84SAndroid Build Coastguard Worker unsigned int dest_height
1886*54e60f84SAndroid Build Coastguard Worker )
1887*54e60f84SAndroid Build Coastguard Worker {
1888*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1889*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1890*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1891*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1892*54e60f84SAndroid Build Coastguard Worker
1893*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaPutImage(ctx, surface, image, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height);
1894*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1895*54e60f84SAndroid Build Coastguard Worker return va_status;
1896*54e60f84SAndroid Build Coastguard Worker }
1897*54e60f84SAndroid Build Coastguard Worker
1898*54e60f84SAndroid Build Coastguard Worker /*
1899*54e60f84SAndroid Build Coastguard Worker * Derive an VAImage from an existing surface.
1900*54e60f84SAndroid Build Coastguard Worker * This interface will derive a VAImage and corresponding image buffer from
1901*54e60f84SAndroid Build Coastguard Worker * an existing VA Surface. The image buffer can then be mapped/unmapped for
1902*54e60f84SAndroid Build Coastguard Worker * direct CPU access. This operation is only possible on implementations with
1903*54e60f84SAndroid Build Coastguard Worker * direct rendering capabilities and internal surface formats that can be
1904*54e60f84SAndroid Build Coastguard Worker * represented with a VAImage. When the operation is not possible this interface
1905*54e60f84SAndroid Build Coastguard Worker * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1906*54e60f84SAndroid Build Coastguard Worker * to using vaCreateImage + vaPutImage to accomplish the same task in an
1907*54e60f84SAndroid Build Coastguard Worker * indirect manner.
1908*54e60f84SAndroid Build Coastguard Worker *
1909*54e60f84SAndroid Build Coastguard Worker * Implementations should only return success when the resulting image buffer
1910*54e60f84SAndroid Build Coastguard Worker * would be useable with vaMap/Unmap.
1911*54e60f84SAndroid Build Coastguard Worker *
1912*54e60f84SAndroid Build Coastguard Worker * When directly accessing a surface special care must be taken to insure
1913*54e60f84SAndroid Build Coastguard Worker * proper synchronization with the graphics hardware. Clients should call
1914*54e60f84SAndroid Build Coastguard Worker * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1915*54e60f84SAndroid Build Coastguard Worker * rendering or currently being displayed by an overlay.
1916*54e60f84SAndroid Build Coastguard Worker *
1917*54e60f84SAndroid Build Coastguard Worker * Additionally nothing about the contents of a surface should be assumed
1918*54e60f84SAndroid Build Coastguard Worker * following a vaPutSurface. Implementations are free to modify the surface for
1919*54e60f84SAndroid Build Coastguard Worker * scaling or subpicture blending within a call to vaPutImage.
1920*54e60f84SAndroid Build Coastguard Worker *
1921*54e60f84SAndroid Build Coastguard Worker * Calls to vaPutImage or vaGetImage using the same surface from which the image
1922*54e60f84SAndroid Build Coastguard Worker * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1923*54e60f84SAndroid Build Coastguard Worker * vaGetImage with other surfaces is supported.
1924*54e60f84SAndroid Build Coastguard Worker *
1925*54e60f84SAndroid Build Coastguard Worker * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1926*54e60f84SAndroid Build Coastguard Worker * image and image buffer structures will be destroyed; however, the underlying
1927*54e60f84SAndroid Build Coastguard Worker * surface will remain unchanged until freed with vaDestroySurfaces.
1928*54e60f84SAndroid Build Coastguard Worker */
vaDeriveImage(VADisplay dpy,VASurfaceID surface,VAImage * image)1929*54e60f84SAndroid Build Coastguard Worker VAStatus vaDeriveImage(
1930*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1931*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
1932*54e60f84SAndroid Build Coastguard Worker VAImage *image /* out */
1933*54e60f84SAndroid Build Coastguard Worker )
1934*54e60f84SAndroid Build Coastguard Worker {
1935*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1936*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
1937*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1938*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1939*54e60f84SAndroid Build Coastguard Worker
1940*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaDeriveImage(ctx, surface, image);
1941*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
1942*54e60f84SAndroid Build Coastguard Worker return va_status;
1943*54e60f84SAndroid Build Coastguard Worker }
1944*54e60f84SAndroid Build Coastguard Worker
1945*54e60f84SAndroid Build Coastguard Worker
1946*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of subpicture formats supported by the implementation */
vaMaxNumSubpictureFormats(VADisplay dpy)1947*54e60f84SAndroid Build Coastguard Worker int vaMaxNumSubpictureFormats(
1948*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
1949*54e60f84SAndroid Build Coastguard Worker )
1950*54e60f84SAndroid Build Coastguard Worker {
1951*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
1952*54e60f84SAndroid Build Coastguard Worker return 0;
1953*54e60f84SAndroid Build Coastguard Worker
1954*54e60f84SAndroid Build Coastguard Worker return CTX(dpy)->max_subpic_formats;
1955*54e60f84SAndroid Build Coastguard Worker }
1956*54e60f84SAndroid Build Coastguard Worker
1957*54e60f84SAndroid Build Coastguard Worker /*
1958*54e60f84SAndroid Build Coastguard Worker * Query supported subpicture formats
1959*54e60f84SAndroid Build Coastguard Worker * The caller must provide a "format_list" array that can hold at
1960*54e60f84SAndroid Build Coastguard Worker * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
1961*54e60f84SAndroid Build Coastguard Worker * for each format to indicate additional capabilities for that format. The actual
1962*54e60f84SAndroid Build Coastguard Worker * number of formats returned in "format_list" is returned in "num_formats".
1963*54e60f84SAndroid Build Coastguard Worker */
vaQuerySubpictureFormats(VADisplay dpy,VAImageFormat * format_list,unsigned int * flags,unsigned int * num_formats)1964*54e60f84SAndroid Build Coastguard Worker VAStatus vaQuerySubpictureFormats(
1965*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1966*54e60f84SAndroid Build Coastguard Worker VAImageFormat *format_list, /* out */
1967*54e60f84SAndroid Build Coastguard Worker unsigned int *flags, /* out */
1968*54e60f84SAndroid Build Coastguard Worker unsigned int *num_formats /* out */
1969*54e60f84SAndroid Build Coastguard Worker )
1970*54e60f84SAndroid Build Coastguard Worker {
1971*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1972*54e60f84SAndroid Build Coastguard Worker
1973*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1974*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1975*54e60f84SAndroid Build Coastguard Worker
1976*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaQuerySubpictureFormats(ctx, format_list, flags, num_formats);
1977*54e60f84SAndroid Build Coastguard Worker }
1978*54e60f84SAndroid Build Coastguard Worker
1979*54e60f84SAndroid Build Coastguard Worker /*
1980*54e60f84SAndroid Build Coastguard Worker * Subpictures are created with an image associated.
1981*54e60f84SAndroid Build Coastguard Worker */
vaCreateSubpicture(VADisplay dpy,VAImageID image,VASubpictureID * subpicture)1982*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateSubpicture(
1983*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
1984*54e60f84SAndroid Build Coastguard Worker VAImageID image,
1985*54e60f84SAndroid Build Coastguard Worker VASubpictureID *subpicture /* out */
1986*54e60f84SAndroid Build Coastguard Worker )
1987*54e60f84SAndroid Build Coastguard Worker {
1988*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
1989*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
1990*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
1991*54e60f84SAndroid Build Coastguard Worker
1992*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaCreateSubpicture(ctx, image, subpicture);
1993*54e60f84SAndroid Build Coastguard Worker }
1994*54e60f84SAndroid Build Coastguard Worker
1995*54e60f84SAndroid Build Coastguard Worker /*
1996*54e60f84SAndroid Build Coastguard Worker * Destroy the subpicture before destroying the image it is assocated to
1997*54e60f84SAndroid Build Coastguard Worker */
vaDestroySubpicture(VADisplay dpy,VASubpictureID subpicture)1998*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroySubpicture(
1999*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2000*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture
2001*54e60f84SAndroid Build Coastguard Worker )
2002*54e60f84SAndroid Build Coastguard Worker {
2003*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2004*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2005*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2006*54e60f84SAndroid Build Coastguard Worker
2007*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaDestroySubpicture(ctx, subpicture);
2008*54e60f84SAndroid Build Coastguard Worker }
2009*54e60f84SAndroid Build Coastguard Worker
vaSetSubpictureImage(VADisplay dpy,VASubpictureID subpicture,VAImageID image)2010*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetSubpictureImage(
2011*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2012*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture,
2013*54e60f84SAndroid Build Coastguard Worker VAImageID image
2014*54e60f84SAndroid Build Coastguard Worker )
2015*54e60f84SAndroid Build Coastguard Worker {
2016*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2017*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2018*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2019*54e60f84SAndroid Build Coastguard Worker
2020*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaSetSubpictureImage(ctx, subpicture, image);
2021*54e60f84SAndroid Build Coastguard Worker }
2022*54e60f84SAndroid Build Coastguard Worker
2023*54e60f84SAndroid Build Coastguard Worker
2024*54e60f84SAndroid Build Coastguard Worker /*
2025*54e60f84SAndroid Build Coastguard Worker * If chromakey is enabled, then the area where the source value falls within
2026*54e60f84SAndroid Build Coastguard Worker * the chromakey [min, max] range is transparent
2027*54e60f84SAndroid Build Coastguard Worker */
vaSetSubpictureChromakey(VADisplay dpy,VASubpictureID subpicture,unsigned int chromakey_min,unsigned int chromakey_max,unsigned int chromakey_mask)2028*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetSubpictureChromakey(
2029*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2030*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture,
2031*54e60f84SAndroid Build Coastguard Worker unsigned int chromakey_min,
2032*54e60f84SAndroid Build Coastguard Worker unsigned int chromakey_max,
2033*54e60f84SAndroid Build Coastguard Worker unsigned int chromakey_mask
2034*54e60f84SAndroid Build Coastguard Worker )
2035*54e60f84SAndroid Build Coastguard Worker {
2036*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2037*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2038*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2039*54e60f84SAndroid Build Coastguard Worker
2040*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaSetSubpictureChromakey(ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask);
2041*54e60f84SAndroid Build Coastguard Worker }
2042*54e60f84SAndroid Build Coastguard Worker
2043*54e60f84SAndroid Build Coastguard Worker
2044*54e60f84SAndroid Build Coastguard Worker /*
2045*54e60f84SAndroid Build Coastguard Worker * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
2046*54e60f84SAndroid Build Coastguard Worker * a value of 0 means fully transparent. If per-pixel alpha is also specified then
2047*54e60f84SAndroid Build Coastguard Worker * the overall alpha is per-pixel alpha multiplied by the global alpha
2048*54e60f84SAndroid Build Coastguard Worker */
vaSetSubpictureGlobalAlpha(VADisplay dpy,VASubpictureID subpicture,float global_alpha)2049*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetSubpictureGlobalAlpha(
2050*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2051*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture,
2052*54e60f84SAndroid Build Coastguard Worker float global_alpha
2053*54e60f84SAndroid Build Coastguard Worker )
2054*54e60f84SAndroid Build Coastguard Worker {
2055*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2056*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2057*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2058*54e60f84SAndroid Build Coastguard Worker
2059*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaSetSubpictureGlobalAlpha(ctx, subpicture, global_alpha);
2060*54e60f84SAndroid Build Coastguard Worker }
2061*54e60f84SAndroid Build Coastguard Worker
2062*54e60f84SAndroid Build Coastguard Worker /*
2063*54e60f84SAndroid Build Coastguard Worker vaAssociateSubpicture associates the subpicture with the target_surface.
2064*54e60f84SAndroid Build Coastguard Worker It defines the region mapping between the subpicture and the target
2065*54e60f84SAndroid Build Coastguard Worker surface through source and destination rectangles (with the same width and height).
2066*54e60f84SAndroid Build Coastguard Worker Both will be displayed at the next call to vaPutSurface. Additional
2067*54e60f84SAndroid Build Coastguard Worker associations before the call to vaPutSurface simply overrides the association.
2068*54e60f84SAndroid Build Coastguard Worker */
vaAssociateSubpicture(VADisplay dpy,VASubpictureID subpicture,VASurfaceID * target_surfaces,int num_surfaces,short src_x,short src_y,unsigned short src_width,unsigned short src_height,short dest_x,short dest_y,unsigned short dest_width,unsigned short dest_height,unsigned int flags)2069*54e60f84SAndroid Build Coastguard Worker VAStatus vaAssociateSubpicture(
2070*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2071*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture,
2072*54e60f84SAndroid Build Coastguard Worker VASurfaceID *target_surfaces,
2073*54e60f84SAndroid Build Coastguard Worker int num_surfaces,
2074*54e60f84SAndroid Build Coastguard Worker short src_x, /* upper left offset in subpicture */
2075*54e60f84SAndroid Build Coastguard Worker short src_y,
2076*54e60f84SAndroid Build Coastguard Worker unsigned short src_width,
2077*54e60f84SAndroid Build Coastguard Worker unsigned short src_height,
2078*54e60f84SAndroid Build Coastguard Worker short dest_x, /* upper left offset in surface */
2079*54e60f84SAndroid Build Coastguard Worker short dest_y,
2080*54e60f84SAndroid Build Coastguard Worker unsigned short dest_width,
2081*54e60f84SAndroid Build Coastguard Worker unsigned short dest_height,
2082*54e60f84SAndroid Build Coastguard Worker /*
2083*54e60f84SAndroid Build Coastguard Worker * whether to enable chroma-keying or global-alpha
2084*54e60f84SAndroid Build Coastguard Worker * see VA_SUBPICTURE_XXX values
2085*54e60f84SAndroid Build Coastguard Worker */
2086*54e60f84SAndroid Build Coastguard Worker unsigned int flags
2087*54e60f84SAndroid Build Coastguard Worker )
2088*54e60f84SAndroid Build Coastguard Worker {
2089*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2090*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2091*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2092*54e60f84SAndroid Build Coastguard Worker
2093*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaAssociateSubpicture(ctx, subpicture, target_surfaces, num_surfaces, src_x, src_y, src_width, src_height, dest_x, dest_y, dest_width, dest_height, flags);
2094*54e60f84SAndroid Build Coastguard Worker }
2095*54e60f84SAndroid Build Coastguard Worker
2096*54e60f84SAndroid Build Coastguard Worker /*
2097*54e60f84SAndroid Build Coastguard Worker * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
2098*54e60f84SAndroid Build Coastguard Worker */
vaDeassociateSubpicture(VADisplay dpy,VASubpictureID subpicture,VASurfaceID * target_surfaces,int num_surfaces)2099*54e60f84SAndroid Build Coastguard Worker VAStatus vaDeassociateSubpicture(
2100*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2101*54e60f84SAndroid Build Coastguard Worker VASubpictureID subpicture,
2102*54e60f84SAndroid Build Coastguard Worker VASurfaceID *target_surfaces,
2103*54e60f84SAndroid Build Coastguard Worker int num_surfaces
2104*54e60f84SAndroid Build Coastguard Worker )
2105*54e60f84SAndroid Build Coastguard Worker {
2106*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2107*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2108*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2109*54e60f84SAndroid Build Coastguard Worker
2110*54e60f84SAndroid Build Coastguard Worker return ctx->vtable->vaDeassociateSubpicture(ctx, subpicture, target_surfaces, num_surfaces);
2111*54e60f84SAndroid Build Coastguard Worker }
2112*54e60f84SAndroid Build Coastguard Worker
2113*54e60f84SAndroid Build Coastguard Worker
2114*54e60f84SAndroid Build Coastguard Worker /* Get maximum number of display attributes supported by the implementation */
vaMaxNumDisplayAttributes(VADisplay dpy)2115*54e60f84SAndroid Build Coastguard Worker int vaMaxNumDisplayAttributes(
2116*54e60f84SAndroid Build Coastguard Worker VADisplay dpy
2117*54e60f84SAndroid Build Coastguard Worker )
2118*54e60f84SAndroid Build Coastguard Worker {
2119*54e60f84SAndroid Build Coastguard Worker int tmp;
2120*54e60f84SAndroid Build Coastguard Worker
2121*54e60f84SAndroid Build Coastguard Worker if (!vaDisplayIsValid(dpy))
2122*54e60f84SAndroid Build Coastguard Worker return 0;
2123*54e60f84SAndroid Build Coastguard Worker
2124*54e60f84SAndroid Build Coastguard Worker tmp = CTX(dpy)->max_display_attributes;
2125*54e60f84SAndroid Build Coastguard Worker
2126*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceMaxNumDisplayAttributes, dpy, tmp);
2127*54e60f84SAndroid Build Coastguard Worker
2128*54e60f84SAndroid Build Coastguard Worker return tmp;
2129*54e60f84SAndroid Build Coastguard Worker }
2130*54e60f84SAndroid Build Coastguard Worker
2131*54e60f84SAndroid Build Coastguard Worker /*
2132*54e60f84SAndroid Build Coastguard Worker * Query display attributes
2133*54e60f84SAndroid Build Coastguard Worker * The caller must provide a "attr_list" array that can hold at
2134*54e60f84SAndroid Build Coastguard Worker * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
2135*54e60f84SAndroid Build Coastguard Worker * returned in "attr_list" is returned in "num_attributes".
2136*54e60f84SAndroid Build Coastguard Worker */
vaQueryDisplayAttributes(VADisplay dpy,VADisplayAttribute * attr_list,int * num_attributes)2137*54e60f84SAndroid Build Coastguard Worker VAStatus vaQueryDisplayAttributes(
2138*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2139*54e60f84SAndroid Build Coastguard Worker VADisplayAttribute *attr_list, /* out */
2140*54e60f84SAndroid Build Coastguard Worker int *num_attributes /* out */
2141*54e60f84SAndroid Build Coastguard Worker )
2142*54e60f84SAndroid Build Coastguard Worker {
2143*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2144*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
2145*54e60f84SAndroid Build Coastguard Worker
2146*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2147*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2148*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaQueryDisplayAttributes(ctx, attr_list, num_attributes);
2149*54e60f84SAndroid Build Coastguard Worker
2150*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceQueryDisplayAttributes, dpy, attr_list, num_attributes);
2151*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
2152*54e60f84SAndroid Build Coastguard Worker
2153*54e60f84SAndroid Build Coastguard Worker return va_status;
2154*54e60f84SAndroid Build Coastguard Worker
2155*54e60f84SAndroid Build Coastguard Worker }
2156*54e60f84SAndroid Build Coastguard Worker
2157*54e60f84SAndroid Build Coastguard Worker /*
2158*54e60f84SAndroid Build Coastguard Worker * Get display attributes
2159*54e60f84SAndroid Build Coastguard Worker * This function returns the current attribute values in "attr_list".
2160*54e60f84SAndroid Build Coastguard Worker * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
2161*54e60f84SAndroid Build Coastguard Worker * from vaQueryDisplayAttributes() can have their values retrieved.
2162*54e60f84SAndroid Build Coastguard Worker */
vaGetDisplayAttributes(VADisplay dpy,VADisplayAttribute * attr_list,int num_attributes)2163*54e60f84SAndroid Build Coastguard Worker VAStatus vaGetDisplayAttributes(
2164*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2165*54e60f84SAndroid Build Coastguard Worker VADisplayAttribute *attr_list, /* in/out */
2166*54e60f84SAndroid Build Coastguard Worker int num_attributes
2167*54e60f84SAndroid Build Coastguard Worker )
2168*54e60f84SAndroid Build Coastguard Worker {
2169*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2170*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
2171*54e60f84SAndroid Build Coastguard Worker
2172*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2173*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2174*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaGetDisplayAttributes(ctx, attr_list, num_attributes);
2175*54e60f84SAndroid Build Coastguard Worker
2176*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceGetDisplayAttributes, dpy, attr_list, num_attributes);
2177*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
2178*54e60f84SAndroid Build Coastguard Worker
2179*54e60f84SAndroid Build Coastguard Worker return va_status;
2180*54e60f84SAndroid Build Coastguard Worker }
2181*54e60f84SAndroid Build Coastguard Worker
2182*54e60f84SAndroid Build Coastguard Worker /*
2183*54e60f84SAndroid Build Coastguard Worker * Set display attributes
2184*54e60f84SAndroid Build Coastguard Worker * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
2185*54e60f84SAndroid Build Coastguard Worker * from vaQueryDisplayAttributes() can be set. If the attribute is not settable or
2186*54e60f84SAndroid Build Coastguard Worker * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
2187*54e60f84SAndroid Build Coastguard Worker */
vaSetDisplayAttributes(VADisplay dpy,VADisplayAttribute * attr_list,int num_attributes)2188*54e60f84SAndroid Build Coastguard Worker VAStatus vaSetDisplayAttributes(
2189*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2190*54e60f84SAndroid Build Coastguard Worker VADisplayAttribute *attr_list,
2191*54e60f84SAndroid Build Coastguard Worker int num_attributes
2192*54e60f84SAndroid Build Coastguard Worker )
2193*54e60f84SAndroid Build Coastguard Worker {
2194*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2195*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
2196*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2197*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2198*54e60f84SAndroid Build Coastguard Worker
2199*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaSetDisplayAttributes(ctx, attr_list, num_attributes);
2200*54e60f84SAndroid Build Coastguard Worker VA_TRACE_LOG(va_TraceSetDisplayAttributes, dpy, attr_list, num_attributes);
2201*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
2202*54e60f84SAndroid Build Coastguard Worker
2203*54e60f84SAndroid Build Coastguard Worker return va_status;
2204*54e60f84SAndroid Build Coastguard Worker }
2205*54e60f84SAndroid Build Coastguard Worker
vaLockSurface(VADisplay dpy,VASurfaceID surface,unsigned int * fourcc,unsigned int * luma_stride,unsigned int * chroma_u_stride,unsigned int * chroma_v_stride,unsigned int * luma_offset,unsigned int * chroma_u_offset,unsigned int * chroma_v_offset,unsigned int * buffer_name,void ** buffer)2206*54e60f84SAndroid Build Coastguard Worker VAStatus vaLockSurface(VADisplay dpy,
2207*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface,
2208*54e60f84SAndroid Build Coastguard Worker unsigned int *fourcc, /* following are output argument */
2209*54e60f84SAndroid Build Coastguard Worker unsigned int *luma_stride,
2210*54e60f84SAndroid Build Coastguard Worker unsigned int *chroma_u_stride,
2211*54e60f84SAndroid Build Coastguard Worker unsigned int *chroma_v_stride,
2212*54e60f84SAndroid Build Coastguard Worker unsigned int *luma_offset,
2213*54e60f84SAndroid Build Coastguard Worker unsigned int *chroma_u_offset,
2214*54e60f84SAndroid Build Coastguard Worker unsigned int *chroma_v_offset,
2215*54e60f84SAndroid Build Coastguard Worker unsigned int *buffer_name,
2216*54e60f84SAndroid Build Coastguard Worker void **buffer
2217*54e60f84SAndroid Build Coastguard Worker )
2218*54e60f84SAndroid Build Coastguard Worker {
2219*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2220*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
2221*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2222*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2223*54e60f84SAndroid Build Coastguard Worker
2224*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaLockSurface(ctx, surface, fourcc, luma_stride, chroma_u_stride, chroma_v_stride, luma_offset, chroma_u_offset, chroma_v_offset, buffer_name, buffer);
2225*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
2226*54e60f84SAndroid Build Coastguard Worker
2227*54e60f84SAndroid Build Coastguard Worker return va_status;
2228*54e60f84SAndroid Build Coastguard Worker }
2229*54e60f84SAndroid Build Coastguard Worker
2230*54e60f84SAndroid Build Coastguard Worker
vaUnlockSurface(VADisplay dpy,VASurfaceID surface)2231*54e60f84SAndroid Build Coastguard Worker VAStatus vaUnlockSurface(VADisplay dpy,
2232*54e60f84SAndroid Build Coastguard Worker VASurfaceID surface
2233*54e60f84SAndroid Build Coastguard Worker )
2234*54e60f84SAndroid Build Coastguard Worker {
2235*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2236*54e60f84SAndroid Build Coastguard Worker VAStatus va_status = VA_STATUS_SUCCESS;
2237*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2238*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2239*54e60f84SAndroid Build Coastguard Worker
2240*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaUnlockSurface(ctx, surface);
2241*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, va_status);
2242*54e60f84SAndroid Build Coastguard Worker
2243*54e60f84SAndroid Build Coastguard Worker return va_status;
2244*54e60f84SAndroid Build Coastguard Worker }
2245*54e60f84SAndroid Build Coastguard Worker
2246*54e60f84SAndroid Build Coastguard Worker /* Video Processing */
2247*54e60f84SAndroid Build Coastguard Worker #define VA_VPP_INIT_CONTEXT(ctx, dpy) do { \
2248*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy); \
2249*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy); \
2250*54e60f84SAndroid Build Coastguard Worker if (!ctx) \
2251*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY; \
2252*54e60f84SAndroid Build Coastguard Worker } while (0)
2253*54e60f84SAndroid Build Coastguard Worker
2254*54e60f84SAndroid Build Coastguard Worker #define VA_VPP_INVOKE(dpy, func, args) do { \
2255*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable_vpp->va##func) \
2256*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED; \
2257*54e60f84SAndroid Build Coastguard Worker status = ctx->vtable_vpp->va##func args; \
2258*54e60f84SAndroid Build Coastguard Worker } while (0)
2259*54e60f84SAndroid Build Coastguard Worker
2260*54e60f84SAndroid Build Coastguard Worker VAStatus
vaQueryVideoProcFilters(VADisplay dpy,VAContextID context,VAProcFilterType * filters,unsigned int * num_filters)2261*54e60f84SAndroid Build Coastguard Worker vaQueryVideoProcFilters(
2262*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2263*54e60f84SAndroid Build Coastguard Worker VAContextID context,
2264*54e60f84SAndroid Build Coastguard Worker VAProcFilterType *filters,
2265*54e60f84SAndroid Build Coastguard Worker unsigned int *num_filters
2266*54e60f84SAndroid Build Coastguard Worker )
2267*54e60f84SAndroid Build Coastguard Worker {
2268*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2269*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2270*54e60f84SAndroid Build Coastguard Worker
2271*54e60f84SAndroid Build Coastguard Worker VA_VPP_INIT_CONTEXT(ctx, dpy);
2272*54e60f84SAndroid Build Coastguard Worker VA_VPP_INVOKE(
2273*54e60f84SAndroid Build Coastguard Worker ctx,
2274*54e60f84SAndroid Build Coastguard Worker QueryVideoProcFilters,
2275*54e60f84SAndroid Build Coastguard Worker (ctx, context, filters, num_filters)
2276*54e60f84SAndroid Build Coastguard Worker );
2277*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2278*54e60f84SAndroid Build Coastguard Worker
2279*54e60f84SAndroid Build Coastguard Worker return status;
2280*54e60f84SAndroid Build Coastguard Worker }
2281*54e60f84SAndroid Build Coastguard Worker
2282*54e60f84SAndroid Build Coastguard Worker VAStatus
vaQueryVideoProcFilterCaps(VADisplay dpy,VAContextID context,VAProcFilterType type,void * filter_caps,unsigned int * num_filter_caps)2283*54e60f84SAndroid Build Coastguard Worker vaQueryVideoProcFilterCaps(
2284*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2285*54e60f84SAndroid Build Coastguard Worker VAContextID context,
2286*54e60f84SAndroid Build Coastguard Worker VAProcFilterType type,
2287*54e60f84SAndroid Build Coastguard Worker void *filter_caps,
2288*54e60f84SAndroid Build Coastguard Worker unsigned int *num_filter_caps
2289*54e60f84SAndroid Build Coastguard Worker )
2290*54e60f84SAndroid Build Coastguard Worker {
2291*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2292*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2293*54e60f84SAndroid Build Coastguard Worker
2294*54e60f84SAndroid Build Coastguard Worker VA_VPP_INIT_CONTEXT(ctx, dpy);
2295*54e60f84SAndroid Build Coastguard Worker VA_VPP_INVOKE(
2296*54e60f84SAndroid Build Coastguard Worker ctx,
2297*54e60f84SAndroid Build Coastguard Worker QueryVideoProcFilterCaps,
2298*54e60f84SAndroid Build Coastguard Worker (ctx, context, type, filter_caps, num_filter_caps)
2299*54e60f84SAndroid Build Coastguard Worker );
2300*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2301*54e60f84SAndroid Build Coastguard Worker return status;
2302*54e60f84SAndroid Build Coastguard Worker }
2303*54e60f84SAndroid Build Coastguard Worker
2304*54e60f84SAndroid Build Coastguard Worker VAStatus
vaQueryVideoProcPipelineCaps(VADisplay dpy,VAContextID context,VABufferID * filters,unsigned int num_filters,VAProcPipelineCaps * pipeline_caps)2305*54e60f84SAndroid Build Coastguard Worker vaQueryVideoProcPipelineCaps(
2306*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2307*54e60f84SAndroid Build Coastguard Worker VAContextID context,
2308*54e60f84SAndroid Build Coastguard Worker VABufferID *filters,
2309*54e60f84SAndroid Build Coastguard Worker unsigned int num_filters,
2310*54e60f84SAndroid Build Coastguard Worker VAProcPipelineCaps *pipeline_caps
2311*54e60f84SAndroid Build Coastguard Worker )
2312*54e60f84SAndroid Build Coastguard Worker {
2313*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2314*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2315*54e60f84SAndroid Build Coastguard Worker
2316*54e60f84SAndroid Build Coastguard Worker VA_VPP_INIT_CONTEXT(ctx, dpy);
2317*54e60f84SAndroid Build Coastguard Worker VA_VPP_INVOKE(
2318*54e60f84SAndroid Build Coastguard Worker ctx,
2319*54e60f84SAndroid Build Coastguard Worker QueryVideoProcPipelineCaps,
2320*54e60f84SAndroid Build Coastguard Worker (ctx, context, filters, num_filters, pipeline_caps)
2321*54e60f84SAndroid Build Coastguard Worker );
2322*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2323*54e60f84SAndroid Build Coastguard Worker return status;
2324*54e60f84SAndroid Build Coastguard Worker }
2325*54e60f84SAndroid Build Coastguard Worker
2326*54e60f84SAndroid Build Coastguard Worker VAStatus
vaCopy(VADisplay dpy,VACopyObject * dst,VACopyObject * src,VACopyOption option)2327*54e60f84SAndroid Build Coastguard Worker vaCopy(
2328*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2329*54e60f84SAndroid Build Coastguard Worker VACopyObject *dst,
2330*54e60f84SAndroid Build Coastguard Worker VACopyObject *src,
2331*54e60f84SAndroid Build Coastguard Worker VACopyOption option
2332*54e60f84SAndroid Build Coastguard Worker )
2333*54e60f84SAndroid Build Coastguard Worker {
2334*54e60f84SAndroid Build Coastguard Worker VAStatus va_status;
2335*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2336*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy);
2337*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy);
2338*54e60f84SAndroid Build Coastguard Worker
2339*54e60f84SAndroid Build Coastguard Worker if (ctx->vtable->vaCopy == NULL)
2340*54e60f84SAndroid Build Coastguard Worker va_status = VA_STATUS_ERROR_UNIMPLEMENTED;
2341*54e60f84SAndroid Build Coastguard Worker else
2342*54e60f84SAndroid Build Coastguard Worker va_status = ctx->vtable->vaCopy(ctx, dst, src, option);
2343*54e60f84SAndroid Build Coastguard Worker return va_status;
2344*54e60f84SAndroid Build Coastguard Worker }
2345*54e60f84SAndroid Build Coastguard Worker
2346*54e60f84SAndroid Build Coastguard Worker /* Protected content */
2347*54e60f84SAndroid Build Coastguard Worker #define VA_PROT_INIT_CONTEXT(ctx, dpy) do { \
2348*54e60f84SAndroid Build Coastguard Worker CHECK_DISPLAY(dpy); \
2349*54e60f84SAndroid Build Coastguard Worker ctx = CTX(dpy); \
2350*54e60f84SAndroid Build Coastguard Worker if (!ctx) \
2351*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_DISPLAY; \
2352*54e60f84SAndroid Build Coastguard Worker } while (0)
2353*54e60f84SAndroid Build Coastguard Worker
2354*54e60f84SAndroid Build Coastguard Worker #define VA_PROT_INVOKE(dpy, func, args) do { \
2355*54e60f84SAndroid Build Coastguard Worker if (!ctx->vtable_prot->va##func) \
2356*54e60f84SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNIMPLEMENTED; \
2357*54e60f84SAndroid Build Coastguard Worker status = ctx->vtable_prot->va##func args; \
2358*54e60f84SAndroid Build Coastguard Worker } while (0)
2359*54e60f84SAndroid Build Coastguard Worker
vaCreateProtectedSession(VADisplay dpy,VAConfigID config_id,VAProtectedSessionID * protected_session)2360*54e60f84SAndroid Build Coastguard Worker VAStatus vaCreateProtectedSession(
2361*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2362*54e60f84SAndroid Build Coastguard Worker VAConfigID config_id,
2363*54e60f84SAndroid Build Coastguard Worker VAProtectedSessionID *protected_session
2364*54e60f84SAndroid Build Coastguard Worker )
2365*54e60f84SAndroid Build Coastguard Worker {
2366*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2367*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2368*54e60f84SAndroid Build Coastguard Worker
2369*54e60f84SAndroid Build Coastguard Worker VA_PROT_INIT_CONTEXT(ctx, dpy);
2370*54e60f84SAndroid Build Coastguard Worker VA_PROT_INVOKE(
2371*54e60f84SAndroid Build Coastguard Worker ctx,
2372*54e60f84SAndroid Build Coastguard Worker CreateProtectedSession,
2373*54e60f84SAndroid Build Coastguard Worker (ctx, config_id, protected_session)
2374*54e60f84SAndroid Build Coastguard Worker );
2375*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2376*54e60f84SAndroid Build Coastguard Worker
2377*54e60f84SAndroid Build Coastguard Worker return status;
2378*54e60f84SAndroid Build Coastguard Worker }
2379*54e60f84SAndroid Build Coastguard Worker
vaDestroyProtectedSession(VADisplay dpy,VAProtectedSessionID protected_session)2380*54e60f84SAndroid Build Coastguard Worker VAStatus vaDestroyProtectedSession(
2381*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2382*54e60f84SAndroid Build Coastguard Worker VAProtectedSessionID protected_session
2383*54e60f84SAndroid Build Coastguard Worker )
2384*54e60f84SAndroid Build Coastguard Worker {
2385*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2386*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2387*54e60f84SAndroid Build Coastguard Worker
2388*54e60f84SAndroid Build Coastguard Worker VA_PROT_INIT_CONTEXT(ctx, dpy);
2389*54e60f84SAndroid Build Coastguard Worker VA_PROT_INVOKE(
2390*54e60f84SAndroid Build Coastguard Worker ctx,
2391*54e60f84SAndroid Build Coastguard Worker DestroyProtectedSession,
2392*54e60f84SAndroid Build Coastguard Worker (ctx, protected_session)
2393*54e60f84SAndroid Build Coastguard Worker );
2394*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2395*54e60f84SAndroid Build Coastguard Worker
2396*54e60f84SAndroid Build Coastguard Worker return status;
2397*54e60f84SAndroid Build Coastguard Worker }
2398*54e60f84SAndroid Build Coastguard Worker
vaAttachProtectedSession(VADisplay dpy,VAContextID context,VAProtectedSessionID protected_session)2399*54e60f84SAndroid Build Coastguard Worker VAStatus vaAttachProtectedSession(
2400*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2401*54e60f84SAndroid Build Coastguard Worker VAContextID context,
2402*54e60f84SAndroid Build Coastguard Worker VAProtectedSessionID protected_session
2403*54e60f84SAndroid Build Coastguard Worker )
2404*54e60f84SAndroid Build Coastguard Worker {
2405*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2406*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2407*54e60f84SAndroid Build Coastguard Worker
2408*54e60f84SAndroid Build Coastguard Worker VA_PROT_INIT_CONTEXT(ctx, dpy);
2409*54e60f84SAndroid Build Coastguard Worker VA_PROT_INVOKE(
2410*54e60f84SAndroid Build Coastguard Worker ctx,
2411*54e60f84SAndroid Build Coastguard Worker AttachProtectedSession,
2412*54e60f84SAndroid Build Coastguard Worker (ctx, context, protected_session)
2413*54e60f84SAndroid Build Coastguard Worker );
2414*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2415*54e60f84SAndroid Build Coastguard Worker
2416*54e60f84SAndroid Build Coastguard Worker return status;
2417*54e60f84SAndroid Build Coastguard Worker }
2418*54e60f84SAndroid Build Coastguard Worker
vaDetachProtectedSession(VADisplay dpy,VAContextID context)2419*54e60f84SAndroid Build Coastguard Worker VAStatus vaDetachProtectedSession(
2420*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2421*54e60f84SAndroid Build Coastguard Worker VAContextID context
2422*54e60f84SAndroid Build Coastguard Worker )
2423*54e60f84SAndroid Build Coastguard Worker {
2424*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2425*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2426*54e60f84SAndroid Build Coastguard Worker
2427*54e60f84SAndroid Build Coastguard Worker VA_PROT_INIT_CONTEXT(ctx, dpy);
2428*54e60f84SAndroid Build Coastguard Worker VA_PROT_INVOKE(
2429*54e60f84SAndroid Build Coastguard Worker ctx,
2430*54e60f84SAndroid Build Coastguard Worker DetachProtectedSession,
2431*54e60f84SAndroid Build Coastguard Worker (ctx, context)
2432*54e60f84SAndroid Build Coastguard Worker );
2433*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2434*54e60f84SAndroid Build Coastguard Worker
2435*54e60f84SAndroid Build Coastguard Worker return status;
2436*54e60f84SAndroid Build Coastguard Worker }
2437*54e60f84SAndroid Build Coastguard Worker
vaProtectedSessionExecute(VADisplay dpy,VAProtectedSessionID protected_session,VABufferID data)2438*54e60f84SAndroid Build Coastguard Worker VAStatus vaProtectedSessionExecute(
2439*54e60f84SAndroid Build Coastguard Worker VADisplay dpy,
2440*54e60f84SAndroid Build Coastguard Worker VAProtectedSessionID protected_session,
2441*54e60f84SAndroid Build Coastguard Worker VABufferID data
2442*54e60f84SAndroid Build Coastguard Worker )
2443*54e60f84SAndroid Build Coastguard Worker {
2444*54e60f84SAndroid Build Coastguard Worker VADriverContextP ctx;
2445*54e60f84SAndroid Build Coastguard Worker VAStatus status;
2446*54e60f84SAndroid Build Coastguard Worker
2447*54e60f84SAndroid Build Coastguard Worker VA_PROT_INIT_CONTEXT(ctx, dpy);
2448*54e60f84SAndroid Build Coastguard Worker VA_PROT_INVOKE(
2449*54e60f84SAndroid Build Coastguard Worker ctx,
2450*54e60f84SAndroid Build Coastguard Worker ProtectedSessionExecute,
2451*54e60f84SAndroid Build Coastguard Worker (ctx, protected_session, data)
2452*54e60f84SAndroid Build Coastguard Worker );
2453*54e60f84SAndroid Build Coastguard Worker VA_TRACE_RET(dpy, status);
2454*54e60f84SAndroid Build Coastguard Worker
2455*54e60f84SAndroid Build Coastguard Worker return status;
2456*54e60f84SAndroid Build Coastguard Worker }
2457*54e60f84SAndroid Build Coastguard Worker
2458