OSDN Git Service

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