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 34 typedef struct VADriverContext *VADriverContextP; 35 typedef struct VADisplayContext *VADisplayContextP; 36 37 /** \brief VA display types. */ 38 enum { 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 54 struct 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 424 struct 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 */ 515 struct 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 540 typedef VAStatus (*VADriverInit) ( 541 VADriverContextP driver_context 542 ); 543 544 #endif /* _VA_BACKEND_H_ */ 545