1/*
2 * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25/*
26 * Video Decode Acceleration -Backend API
27 */
28
29#ifndef _VA_BACKEND_H_
30#define _VA_BACKEND_H_
31
32#include <va/va.h>
33
34typedef struct VADriverContext *VADriverContextP;
35typedef struct VADisplayContext *VADisplayContextP;
36
37/** \brief VA display types. */
38enum {
39    /** \brief Mask to major identifier for VA display type. */
40    VA_DISPLAY_MAJOR_MASK = 0xf0,
41
42    /** \brief VA/X11 API is used, through vaGetDisplay() entry-point. */
43    VA_DISPLAY_X11      = 0x10,
44    /** \brief VA/GLX API is used, through vaGetDisplayGLX() entry-point. */
45    VA_DISPLAY_GLX      = (VA_DISPLAY_X11 | (1 << 0)),
46    /** \brief VA/Android API is used, through vaGetDisplay() entry-point. */
47    VA_DISPLAY_ANDROID  = 0x20,
48    /** \brief VA/DRM API is used, through vaGetDisplayDRM() entry-point. */
49    VA_DISPLAY_DRM      = 0x30,
50    /** \brief VA/Wayland API is used, through vaGetDisplayWl() entry-point. */
51    VA_DISPLAY_WAYLAND  = 0x40,
52};
53
54struct VADriverVTable
55{
56	VAStatus (*vaTerminate) ( VADriverContextP ctx );
57
58	VAStatus (*vaQueryConfigProfiles) (
59		VADriverContextP ctx,
60		VAProfile *profile_list,	/* out */
61		int *num_profiles			/* out */
62	);
63
64	VAStatus (*vaQueryConfigEntrypoints) (
65		VADriverContextP ctx,
66		VAProfile profile,
67		VAEntrypoint  *entrypoint_list,	/* out */
68		int *num_entrypoints			/* out */
69	);
70
71	VAStatus (*vaGetConfigAttributes) (
72		VADriverContextP ctx,
73		VAProfile profile,
74		VAEntrypoint entrypoint,
75		VAConfigAttrib *attrib_list,	/* in/out */
76		int num_attribs
77	);
78
79	VAStatus (*vaCreateConfig) (
80		VADriverContextP ctx,
81		VAProfile profile,
82		VAEntrypoint entrypoint,
83		VAConfigAttrib *attrib_list,
84		int num_attribs,
85		VAConfigID *config_id		/* out */
86	);
87
88	VAStatus (*vaDestroyConfig) (
89		VADriverContextP ctx,
90		VAConfigID config_id
91	);
92
93	VAStatus (*vaQueryConfigAttributes) (
94		VADriverContextP ctx,
95		VAConfigID config_id,
96		VAProfile *profile,		/* out */
97		VAEntrypoint *entrypoint, 	/* out */
98		VAConfigAttrib *attrib_list,	/* out */
99		int *num_attribs		/* out */
100	);
101
102	VAStatus (*vaCreateSurfaces) (
103		VADriverContextP ctx,
104		int width,
105		int height,
106		int format,
107		int num_surfaces,
108		VASurfaceID *surfaces		/* out */
109	);
110
111	VAStatus (*vaDestroySurfaces) (
112		VADriverContextP ctx,
113		VASurfaceID *surface_list,
114		int num_surfaces
115	);
116
117	VAStatus (*vaCreateContext) (
118		VADriverContextP ctx,
119		VAConfigID config_id,
120		int picture_width,
121		int picture_height,
122		int flag,
123		VASurfaceID *render_targets,
124		int num_render_targets,
125		VAContextID *context		/* out */
126	);
127
128	VAStatus (*vaDestroyContext) (
129		VADriverContextP ctx,
130		VAContextID context
131	);
132
133	VAStatus (*vaCreateBuffer) (
134		VADriverContextP ctx,
135		VAContextID context,		/* in */
136		VABufferType type,		/* in */
137		unsigned int size,		/* in */
138		unsigned int num_elements,	/* in */
139		void *data,			/* in */
140		VABufferID *buf_id		/* out */
141	);
142
143	VAStatus (*vaBufferSetNumElements) (
144		VADriverContextP ctx,
145		VABufferID buf_id,	/* in */
146		unsigned int num_elements	/* in */
147	);
148
149	VAStatus (*vaMapBuffer) (
150		VADriverContextP ctx,
151		VABufferID buf_id,	/* in */
152		void **pbuf         /* out */
153	);
154
155	VAStatus (*vaUnmapBuffer) (
156		VADriverContextP ctx,
157		VABufferID buf_id	/* in */
158	);
159
160	VAStatus (*vaDestroyBuffer) (
161		VADriverContextP ctx,
162		VABufferID buffer_id
163	);
164
165	VAStatus (*vaBeginPicture) (
166		VADriverContextP ctx,
167		VAContextID context,
168		VASurfaceID render_target
169	);
170
171	VAStatus (*vaRenderPicture) (
172		VADriverContextP ctx,
173		VAContextID context,
174		VABufferID *buffers,
175		int num_buffers
176	);
177
178	VAStatus (*vaEndPicture) (
179		VADriverContextP ctx,
180		VAContextID context
181	);
182
183	VAStatus (*vaSyncSurface) (
184		VADriverContextP ctx,
185		VASurfaceID render_target
186	);
187
188	VAStatus (*vaQuerySurfaceStatus) (
189		VADriverContextP ctx,
190		VASurfaceID render_target,
191		VASurfaceStatus *status	/* out */
192	);
193
194	VAStatus (*vaQuerySurfaceError) (
195		VADriverContextP ctx,
196		VASurfaceID render_target,
197                VAStatus error_status,
198                void **error_info /*out*/
199	);
200
201	VAStatus (*vaPutSurface) (
202    		VADriverContextP ctx,
203		VASurfaceID surface,
204		void* draw, /* Drawable of window system */
205		short srcx,
206		short srcy,
207		unsigned short srcw,
208		unsigned short srch,
209		short destx,
210		short desty,
211		unsigned short destw,
212		unsigned short desth,
213		VARectangle *cliprects, /* client supplied clip list */
214		unsigned int number_cliprects, /* number of clip rects in the clip list */
215		unsigned int flags /* de-interlacing flags */
216	);
217
218	VAStatus (*vaQueryImageFormats) (
219		VADriverContextP ctx,
220		VAImageFormat *format_list,        /* out */
221		int *num_formats           /* out */
222	);
223
224	VAStatus (*vaCreateImage) (
225		VADriverContextP ctx,
226		VAImageFormat *format,
227		int width,
228		int height,
229		VAImage *image     /* out */
230	);
231
232	VAStatus (*vaDeriveImage) (
233		VADriverContextP ctx,
234		VASurfaceID surface,
235		VAImage *image     /* out */
236	);
237
238	VAStatus (*vaDestroyImage) (
239		VADriverContextP ctx,
240		VAImageID image
241	);
242
243	VAStatus (*vaSetImagePalette) (
244	        VADriverContextP ctx,
245	        VAImageID image,
246	        /*
247                 * pointer to an array holding the palette data.  The size of the array is
248                 * num_palette_entries * entry_bytes in size.  The order of the components
249                 * in the palette is described by the component_order in VAImage struct
250                 */
251                unsigned char *palette
252	);
253
254	VAStatus (*vaGetImage) (
255		VADriverContextP ctx,
256		VASurfaceID surface,
257		int x,     /* coordinates of the upper left source pixel */
258		int y,
259		unsigned int width, /* width and height of the region */
260		unsigned int height,
261		VAImageID image
262	);
263
264	VAStatus (*vaPutImage) (
265		VADriverContextP ctx,
266		VASurfaceID surface,
267		VAImageID image,
268		int src_x,
269		int src_y,
270		unsigned int src_width,
271		unsigned int src_height,
272		int dest_x,
273		int dest_y,
274		unsigned int dest_width,
275		unsigned int dest_height
276	);
277
278	VAStatus (*vaQuerySubpictureFormats) (
279		VADriverContextP ctx,
280		VAImageFormat *format_list,        /* out */
281		unsigned int *flags,       /* out */
282		unsigned int *num_formats  /* out */
283	);
284
285	VAStatus (*vaCreateSubpicture) (
286		VADriverContextP ctx,
287		VAImageID image,
288		VASubpictureID *subpicture   /* out */
289	);
290
291	VAStatus (*vaDestroySubpicture) (
292		VADriverContextP ctx,
293		VASubpictureID subpicture
294	);
295
296        VAStatus (*vaSetSubpictureImage) (
297                VADriverContextP ctx,
298                VASubpictureID subpicture,
299                VAImageID image
300        );
301
302	VAStatus (*vaSetSubpictureChromakey) (
303		VADriverContextP ctx,
304		VASubpictureID subpicture,
305		unsigned int chromakey_min,
306		unsigned int chromakey_max,
307		unsigned int chromakey_mask
308	);
309
310	VAStatus (*vaSetSubpictureGlobalAlpha) (
311		VADriverContextP ctx,
312		VASubpictureID subpicture,
313		float global_alpha
314	);
315
316	VAStatus (*vaAssociateSubpicture) (
317		VADriverContextP ctx,
318		VASubpictureID subpicture,
319		VASurfaceID *target_surfaces,
320		int num_surfaces,
321		short src_x, /* upper left offset in subpicture */
322		short src_y,
323		unsigned short src_width,
324		unsigned short src_height,
325		short dest_x, /* upper left offset in surface */
326		short dest_y,
327		unsigned short dest_width,
328		unsigned short dest_height,
329		/*
330		 * whether to enable chroma-keying or global-alpha
331		 * see VA_SUBPICTURE_XXX values
332		 */
333		unsigned int flags
334	);
335
336	VAStatus (*vaDeassociateSubpicture) (
337		VADriverContextP ctx,
338		VASubpictureID subpicture,
339		VASurfaceID *target_surfaces,
340		int num_surfaces
341	);
342
343	VAStatus (*vaQueryDisplayAttributes) (
344		VADriverContextP ctx,
345		VADisplayAttribute *attr_list,	/* out */
346		int *num_attributes		/* out */
347        );
348
349	VAStatus (*vaGetDisplayAttributes) (
350		VADriverContextP ctx,
351		VADisplayAttribute *attr_list,	/* in/out */
352		int num_attributes
353        );
354
355        VAStatus (*vaSetDisplayAttributes) (
356		VADriverContextP ctx,
357                VADisplayAttribute *attr_list,
358                int num_attributes
359        );
360
361        /* used by va trace */
362        VAStatus (*vaBufferInfo) (
363                   VADriverContextP ctx,      /* in */
364                   VABufferID buf_id,         /* in */
365                   VABufferType *type,        /* out */
366                   unsigned int *size,        /* out */
367                   unsigned int *num_elements /* out */
368        );
369
370        /* lock/unlock surface for external access */
371        VAStatus (*vaLockSurface) (
372		VADriverContextP ctx,
373                VASurfaceID surface,
374                unsigned int *fourcc, /* out  for follow argument */
375                unsigned int *luma_stride,
376                unsigned int *chroma_u_stride,
377                unsigned int *chroma_v_stride,
378                unsigned int *luma_offset,
379                unsigned int *chroma_u_offset,
380                unsigned int *chroma_v_offset,
381                unsigned int *buffer_name, /* if it is not NULL, assign the low lever
382                                            * surface buffer name
383                                            */
384                void **buffer /* if it is not NULL, map the surface buffer for
385                                * CPU access
386                                */
387        );
388
389        VAStatus (*vaUnlockSurface) (
390		VADriverContextP ctx,
391                VASurfaceID surface
392        );
393
394        /* DEPRECATED */
395        VAStatus
396        (*vaGetSurfaceAttributes)(
397            VADriverContextP    ctx,
398            VAConfigID          config,
399            VASurfaceAttrib    *attrib_list,
400            unsigned int        num_attribs
401        );
402
403        VAStatus
404        (*vaCreateSurfaces2)(
405            VADriverContextP    ctx,
406            unsigned int        format,
407            unsigned int        width,
408            unsigned int        height,
409            VASurfaceID        *surfaces,
410            unsigned int        num_surfaces,
411            VASurfaceAttrib    *attrib_list,
412            unsigned int        num_attribs
413        );
414
415        VAStatus
416        (*vaQuerySurfaceAttributes)(
417            VADriverContextP    dpy,
418            VAConfigID          config,
419            VASurfaceAttrib    *attrib_list,
420            unsigned int       *num_attribs
421        );
422};
423
424struct VADriverContext
425{
426    void *pDriverData;
427
428    /**
429     * The core VA implementation hooks.
430     *
431     * This structure is allocated from libva with calloc().
432     */
433    struct VADriverVTable *vtable;
434
435    /**
436     * The VA/GLX implementation hooks.
437     *
438     * This structure is intended for drivers that implement the
439     * VA/GLX API. The driver implementation is responsible for the
440     * allocation and deallocation of this structure.
441     */
442    struct VADriverVTableGLX *vtable_glx;
443
444    /**
445     * The VA/EGL implementation hooks.
446     *
447     * This structure is intended for drivers that implement the
448     * VA/EGL API. The driver implementation is responsible for the
449     * allocation and deallocation of this structure.
450     */
451    struct VADriverVTableEGL *vtable_egl;
452
453    /**
454     * The third-party/private implementation hooks.
455     *
456     * This structure is intended for drivers that implement the
457     * private API. The driver implementation is responsible for the
458     * allocation and deallocation of this structure.
459     */
460    void *vtable_tpi;
461
462    void *native_dpy;
463    int x11_screen;
464    int version_major;
465    int version_minor;
466    int max_profiles;
467    int max_entrypoints;
468    int max_attributes;
469    int max_image_formats;
470    int max_subpic_formats;
471    int max_display_attributes;
472    const char *str_vendor;
473
474    void *handle;			/* dlopen handle */
475
476    /**
477     * \brief DRM state.
478     *
479     * This field holds driver specific data for DRM-based
480     * drivers. This structure is allocated from libva with
481     * calloc(). Do not deallocate from within VA driver
482     * implementations.
483     *
484     * All structures shall be derived from struct drm_state. So, for
485     * instance, this field holds a dri_state structure for VA/X11
486     * drivers that use the DRM protocol.
487     */
488    void *drm_state;
489
490    void *glx;				/* opaque for GLX code */
491
492    /**
493     * \brief The VA/VPP implementation hooks.
494     *
495     * This structure is allocated from libva with calloc().
496     */
497    struct VADriverVTableVPP *vtable_vpp;
498
499    /** \brief VA display type. */
500    unsigned long display_type;
501
502    /**
503     * The VA/Wayland implementation hooks.
504     *
505     * This structure is intended for drivers that implement the
506     * VA/Wayland API. libVA allocates this structure with calloc()
507     * and owns the resulting memory.
508     */
509    struct VADriverVTableWayland *vtable_wayland;
510
511    unsigned long reserved[42];         /* reserve for future add-ins, decrease the subscript accordingly */
512};
513
514#define VA_DISPLAY_MAGIC 0x56414430 /* VAD0 */
515struct VADisplayContext
516{
517    int vadpy_magic;
518
519    VADisplayContextP pNext;
520    VADriverContextP pDriverContext;
521
522    int (*vaIsValid) (
523	VADisplayContextP ctx
524    );
525
526    void (*vaDestroy) (
527	VADisplayContextP ctx
528    );
529
530    VAStatus (*vaGetDriverName) (
531	VADisplayContextP ctx,
532	char **driver_name
533    );
534
535    void *opaque; /* opaque for display extensions (e.g. GLX) */
536    void *vatrace; /* opaque for VA trace context */
537    void *vafool; /* opaque for VA fool context */
538};
539
540typedef VAStatus (*VADriverInit) (
541    VADriverContextP driver_context
542);
543
544#endif /* _VA_BACKEND_H_ */
545