summaryrefslogtreecommitdiffstats
path: root/meta-emenlow/recipes-graphics/libva
diff options
context:
space:
mode:
authorNitin A Kamble <nitin.a.kamble@intel.com>2012-09-18 12:16:07 -0700
committerTom Zanussi <tom.zanussi@intel.com>2012-12-03 14:20:44 -0600
commit6eed0090597bfe82603be5ffa9c9f1fd141306f0 (patch)
treee4e16247f8ae3b3ad3a1426f59af2dcf5668e533 /meta-emenlow/recipes-graphics/libva
parentb4141a6404fa7d3445d660860b6bf68acec9f114 (diff)
downloadmeta-intel-6eed0090597bfe82603be5ffa9c9f1fd141306f0.tar.gz
emenlow: use emgd instead of psb for graphics driver
Remove all the Poulsbo graphics driver specific meta data files. And configure the BSP to use EMGD instead of psb for graphics stack. Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com> Signed-off-by: Tom Zanussi <tom.zanussi@intel.com>
Diffstat (limited to 'meta-emenlow/recipes-graphics/libva')
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/033_g45_add_rgba_subpic.patch111
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/034_g45_fix_return_for_unimpl.patch83
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/035_g45_add_yv12_image_format.patch102
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/036_g45_add_vaGetImage.patch71
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/037_g45_add_vaPutImage.patch111
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/038_g45_vaPutSurface_cliprects.patch531
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/102_attribute_visibility.patch47
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/103_fix_vainfo_deps.patch24
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/104_fix_libva_pkgconfig_deps.patch18
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/105_dont_search_LIBGL_DRIVERS_PATH.patch21
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/108_drivers_path.patch25
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/203_fix_fglrx_detection.patch542
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/204_check_ATIFGLEXTENSION.patch312
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/300_sds_version.patch87
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/301_vdpau_mpeg4.patch26
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/320_move_vaPutSurface_flags_def.patch60
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/321_libva_glx.base.patch212
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/322_libva_glx.patch2024
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/390_compat.base.patch135
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch3273
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/392_compat.dso.patch183
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva-0.31.0/libdrm-poulsbo.patch26
-rw-r--r--meta-emenlow/recipes-graphics/libva/libva_0.31.0.bb43
23 files changed, 0 insertions, 8067 deletions
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/033_g45_add_rgba_subpic.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/033_g45_add_rgba_subpic.patch
deleted file mode 100644
index 1b928b4c..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/033_g45_add_rgba_subpic.patch
+++ /dev/null
@@ -1,111 +0,0 @@
1From 6622e8eba85cea476f8ef5b8c3620c4a0f024dcd Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 10:56:54 +0000
4Subject: [PATCH] [G45] Add RGBA subpictures.
5
6---
7 i965_drv_video/i965_drv_video.c | 18 ++++++++++++++++++
8 i965_drv_video/i965_drv_video.h | 3 ++-
9 i965_drv_video/i965_render.c | 8 ++++----
10 3 files changed, 24 insertions(+), 5 deletions(-)
11
12diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
13index 8f4bfc1..92c4785 100644
14--- a/i965_drv_video/i965_drv_video.c
15+++ b/i965_drv_video/i965_drv_video.c
16@@ -70,6 +70,14 @@ i965_subpic_formats_map[I965_MAX_SUBPIC_FORMATS + 1] = {
17 { I965_SURFACETYPE_INDEXED, I965_SURFACEFORMAT_A4P4_UNORM,
18 { VA_FOURCC('A','I','4','4'), VA_MSB_FIRST, 8, },
19 0 },
20+ { I965_SURFACETYPE_RGBA, I965_SURFACEFORMAT_B8G8R8A8_UNORM,
21+ { VA_FOURCC('B','G','R','A'), VA_LSB_FIRST, 32,
22+ 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 },
23+ 0 },
24+ { I965_SURFACETYPE_RGBA, I965_SURFACEFORMAT_R8G8B8A8_UNORM,
25+ { VA_FOURCC('R','G','B','A'), VA_LSB_FIRST, 32,
26+ 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 },
27+ 0 },
28 };
29
30 static const i965_subpic_format_map_t *
31@@ -467,6 +475,7 @@ i965_CreateSubpicture(VADriverContextP ctx,
32 obj_subpic->format = m->format;
33 obj_subpic->width = obj_image->image.width;
34 obj_subpic->height = obj_image->image.height;
35+ obj_subpic->pitch = obj_image->image.pitches[0];
36 obj_subpic->bo = obj_image->bo;
37 return VA_STATUS_SUCCESS;
38 }
39@@ -1218,6 +1227,15 @@ i965_CreateImage(VADriverContextP ctx,
40 image->component_order[1] = 'G';
41 image->component_order[2] = 'B';
42 break;
43+ case VA_FOURCC('A','R','G','B'):
44+ case VA_FOURCC('A','B','G','R'):
45+ case VA_FOURCC('B','G','R','A'):
46+ case VA_FOURCC('R','G','B','A'):
47+ image->num_planes = 1;
48+ image->pitches[0] = width * 4;
49+ image->offsets[0] = 0;
50+ image->data_size = image->offsets[0] + image->pitches[0] * height;
51+ break;
52 default:
53 goto error;
54 }
55diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h
56index c95c799..4d775da 100644
57--- a/i965_drv_video/i965_drv_video.h
58+++ b/i965_drv_video/i965_drv_video.h
59@@ -42,7 +42,7 @@
60 #define I965_MAX_ENTRYPOINTS 5
61 #define I965_MAX_CONFIG_ATTRIBUTES 10
62 #define I965_MAX_IMAGE_FORMATS 10
63-#define I965_MAX_SUBPIC_FORMATS 2
64+#define I965_MAX_SUBPIC_FORMATS 4
65 #define I965_MAX_DISPLAY_ATTRIBUTES 4
66 #define I965_STR_VENDOR "i965 Driver 0.1"
67
68@@ -124,6 +124,7 @@ struct object_subpic
69 unsigned int format;
70 int width;
71 int height;
72+ int pitch;
73 dri_bo *bo;
74 };
75
76diff --git a/i965_drv_video/i965_render.c b/i965_drv_video/i965_render.c
77index f105e90..0476087 100644
78--- a/i965_drv_video/i965_render.c
79+++ b/i965_drv_video/i965_render.c
80@@ -586,7 +586,7 @@ i965_subpic_render_src_surface_state(VADriverContextP ctx,
81 int index,
82 dri_bo *region,
83 unsigned long offset,
84- int w, int h, int format)
85+ int w, int h, int p, int format)
86 {
87 struct i965_driver_data *i965 = i965_driver_data(ctx);
88 struct i965_render_state *render_state = &i965->render_state;
89@@ -620,7 +620,7 @@ i965_subpic_render_src_surface_state(VADriverContextP ctx,
90 ss->ss2.mip_count = 0;
91 ss->ss2.render_target_rotation = 0;
92
93- ss->ss3.pitch = w - 1;
94+ ss->ss3.pitch = p - 1;
95
96 dri_bo_emit_reloc(ss_bo,
97 I915_GEM_DOMAIN_SAMPLER, 0,
98@@ -678,8 +678,8 @@ i965_subpic_render_src_surfaces_state(VADriverContextP ctx,
99 region = obj_surface->bo;
100 subpic_region = obj_image->bo;
101 /*subpicture surface*/
102- i965_subpic_render_src_surface_state(ctx, 1, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->format);
103- i965_subpic_render_src_surface_state(ctx, 2, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->format);
104+ i965_subpic_render_src_surface_state(ctx, 1, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->pitch, obj_subpic->format);
105+ i965_subpic_render_src_surface_state(ctx, 2, subpic_region, 0, obj_subpic->width, obj_subpic->height, obj_subpic->pitch, obj_subpic->format);
106 }
107
108 static void
109--
1101.5.4.3
111
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/034_g45_fix_return_for_unimpl.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/034_g45_fix_return_for_unimpl.patch
deleted file mode 100644
index a4612133..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/034_g45_fix_return_for_unimpl.patch
+++ /dev/null
@@ -1,83 +0,0 @@
1From 3935c6a836b8f90947f0af658a76b97a08a03c67 Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 13:23:40 +0000
4Subject: [PATCH] [G45] Don't return VA_STATUS_SUCCESS for unimplemented functions.
5
6---
7 i965_drv_video/i965_drv_video.c | 18 +++++++++++-------
8 1 files changed, 11 insertions(+), 7 deletions(-)
9
10diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
11index 10baffb..d8a7bd1 100644
12--- a/i965_drv_video/i965_drv_video.c
13+++ b/i965_drv_video/i965_drv_video.c
14@@ -534,7 +534,8 @@ i965_SetSubpictureImage(VADriverContextP ctx,
15 VASubpictureID subpicture,
16 VAImageID image)
17 {
18- return VA_STATUS_SUCCESS;
19+ /* TODO */
20+ return VA_STATUS_ERROR_UNIMPLEMENTED;
21 }
22
23 VAStatus
24@@ -544,7 +545,8 @@ i965_SetSubpictureChromakey(VADriverContextP ctx,
25 unsigned int chromakey_max,
26 unsigned int chromakey_mask)
27 {
28- return VA_STATUS_SUCCESS;
29+ /* TODO */
30+ return VA_STATUS_ERROR_UNIMPLEMENTED;
31 }
32
33 VAStatus
34@@ -552,7 +554,8 @@ i965_SetSubpictureGlobalAlpha(VADriverContextP ctx,
35 VASubpictureID subpicture,
36 float global_alpha)
37 {
38- return VA_STATUS_SUCCESS;
39+ /* TODO */
40+ return VA_STATUS_ERROR_UNIMPLEMENTED;
41 }
42
43 VAStatus
44@@ -1141,7 +1144,7 @@ i965_GetDisplayAttributes(VADriverContextP ctx,
45 int num_attributes)
46 {
47 /* TODO */
48- return VA_STATUS_ERROR_UNKNOWN;
49+ return VA_STATUS_ERROR_UNIMPLEMENTED;
50 }
51
52 /*
53@@ -1156,7 +1159,7 @@ i965_SetDisplayAttributes(VADriverContextP ctx,
54 int num_attributes)
55 {
56 /* TODO */
57- return VA_STATUS_ERROR_UNKNOWN;
58+ return VA_STATUS_ERROR_UNIMPLEMENTED;
59 }
60
61 VAStatus
62@@ -1166,7 +1169,7 @@ i965_DbgCopySurfaceToBuffer(VADriverContextP ctx,
63 unsigned int *stride) /* out */
64 {
65 /* TODO */
66- return VA_STATUS_ERROR_UNKNOWN;
67+ return VA_STATUS_ERROR_UNIMPLEMENTED;
68 }
69
70 static VAStatus
71@@ -1318,7 +1321,8 @@ VAStatus i965_DeriveImage(VADriverContextP ctx,
72 VASurfaceID surface,
73 VAImage *image) /* out */
74 {
75- return VA_STATUS_SUCCESS;
76+ /* TODO */
77+ return VA_STATUS_ERROR_OPERATION_FAILED;
78 }
79
80 static void
81--
821.5.4.3
83
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/035_g45_add_yv12_image_format.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/035_g45_add_yv12_image_format.patch
deleted file mode 100644
index 92d814c1..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/035_g45_add_yv12_image_format.patch
+++ /dev/null
@@ -1,102 +0,0 @@
1From 23b23e8d65551779f10aedddee7882c2e71ac162 Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 13:01:44 +0000
4Subject: [PATCH] [G45] Add YV12 image format.
5
6---
7 i965_drv_video/i965_drv_video.c | 50 ++++++++++++++++++++++++++++++++++++++-
8 i965_drv_video/i965_drv_video.h | 2 +-
9 2 files changed, 50 insertions(+), 2 deletions(-)
10
11diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
12index 1f026bc..8558d0e 100644
13--- a/i965_drv_video/i965_drv_video.c
14+++ b/i965_drv_video/i965_drv_video.c
15@@ -54,6 +54,36 @@ enum {
16 I965_SURFACETYPE_INDEXED
17 };
18
19+/* List of supported image formats */
20+typedef struct {
21+ unsigned int type;
22+ VAImageFormat va_format;
23+} i965_image_format_map_t;
24+
25+static const i965_image_format_map_t
26+i965_image_formats_map[I965_MAX_IMAGE_FORMATS + 1] = {
27+ { I965_SURFACETYPE_YUV,
28+ { VA_FOURCC('Y','V','1','2'), VA_LSB_FIRST, 12, } },
29+};
30+
31+static const i965_image_format_map_t *
32+get_image_format(const VAImageFormat *va_format)
33+{
34+ unsigned int i;
35+ for (i = 0; i965_image_formats_map[i].type != 0; i++) {
36+ const i965_image_format_map_t * const m = &i965_image_formats_map[i];
37+ if (m->va_format.fourcc == va_format->fourcc &&
38+ (m->type == I965_SURFACETYPE_RGBA ?
39+ (m->va_format.byte_order == va_format->byte_order &&
40+ m->va_format.red_mask == va_format->red_mask &&
41+ m->va_format.green_mask == va_format->green_mask &&
42+ m->va_format.blue_mask == va_format->blue_mask &&
43+ m->va_format.alpha_mask == va_format->alpha_mask) : 1))
44+ return m;
45+ }
46+ return NULL;
47+}
48+
49 /* List of supported subpicture formats */
50 typedef struct {
51 unsigned int type;
52@@ -398,8 +428,16 @@ i965_QueryImageFormats(VADriverContextP ctx,
53 VAImageFormat *format_list, /* out */
54 int *num_formats) /* out */
55 {
56+ int n;
57+
58+ for (n = 0; i965_image_formats_map[n].va_format.fourcc != 0; n++) {
59+ const i965_image_format_map_t * const m = &i965_image_formats_map[n];
60+ if (format_list)
61+ format_list[n] = m->va_format;
62+ }
63+
64 if (num_formats)
65- *num_formats = 0;
66+ *num_formats = n;
67
68 return VA_STATUS_SUCCESS;
69 }
70@@ -1236,6 +1274,16 @@ i965_CreateImage(VADriverContextP ctx,
71 image->offsets[0] = 0;
72 image->data_size = image->offsets[0] + image->pitches[0] * height;
73 break;
74+ case VA_FOURCC('Y','V','1','2'):
75+ image->num_planes = 3;
76+ image->pitches[0] = width;
77+ image->offsets[0] = 0;
78+ image->pitches[1] = width2;
79+ image->offsets[1] = size;
80+ image->pitches[2] = width2;
81+ image->offsets[2] = size + size2;
82+ image->data_size = size + 2 * size2;
83+ break;
84 default:
85 goto error;
86 }
87diff --git a/i965_drv_video/i965_drv_video.h b/i965_drv_video/i965_drv_video.h
88index 4d775da..f512793 100644
89--- a/i965_drv_video/i965_drv_video.h
90+++ b/i965_drv_video/i965_drv_video.h
91@@ -41,7 +41,7 @@
92 #define I965_MAX_PROFILES 11
93 #define I965_MAX_ENTRYPOINTS 5
94 #define I965_MAX_CONFIG_ATTRIBUTES 10
95-#define I965_MAX_IMAGE_FORMATS 10
96+#define I965_MAX_IMAGE_FORMATS 1
97 #define I965_MAX_SUBPIC_FORMATS 4
98 #define I965_MAX_DISPLAY_ATTRIBUTES 4
99 #define I965_STR_VENDOR "i965 Driver 0.1"
100--
1011.5.4.3
102
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/036_g45_add_vaGetImage.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/036_g45_add_vaGetImage.patch
deleted file mode 100644
index dc25d9f9..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/036_g45_add_vaGetImage.patch
+++ /dev/null
@@ -1,71 +0,0 @@
1From 37f40c0cdc9667907dfb784874b42fb16c2c9bde Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 13:16:34 +0000
4Subject: [PATCH] =?utf-8?q?[G45]=C2=A0Implement=20vaGetImage()=20for=20full-sized=20surface=20readback.?=
5MIME-Version: 1.0
6Content-Type: text/plain; charset=utf-8
7Content-Transfer-Encoding: 8bit
8
9---
10 i965_drv_video/i965_drv_video.c | 45 ++++++++++++++++++++++++++++++++++++++-
11 1 files changed, 44 insertions(+), 1 deletions(-)
12
13diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
14index 8558d0e..10baffb 100644
15--- a/i965_drv_video/i965_drv_video.c
16+++ b/i965_drv_video/i965_drv_video.c
17@@ -1388,7 +1388,50 @@ i965_GetImage(VADriverContextP ctx,
18 unsigned int height,
19 VAImageID image)
20 {
21- return VA_STATUS_SUCCESS;
22+ struct i965_driver_data *i965 = i965_driver_data(ctx);
23+
24+ struct object_surface *obj_surface = SURFACE(surface);
25+ if (!obj_surface)
26+ return VA_STATUS_ERROR_INVALID_SURFACE;
27+
28+ struct object_image *obj_image = IMAGE(image);
29+ if (!obj_image)
30+ return VA_STATUS_ERROR_INVALID_IMAGE;
31+
32+ /* XXX: we only support full-size surface readback */
33+ if (x != 0 ||
34+ y != 0 ||
35+ width != obj_surface->width ||
36+ height != obj_surface->height)
37+ return VA_STATUS_ERROR_INVALID_PARAMETER;
38+
39+ /* XXX: we only support 1:1 image copies */
40+ if (width != obj_image->image.width ||
41+ height != obj_image->image.height)
42+ return VA_STATUS_ERROR_INVALID_PARAMETER;
43+
44+ VAStatus va_status;
45+ void *image_data = NULL;
46+
47+ va_status = i965_MapBuffer(ctx, obj_image->image.buf, &image_data);
48+ if (va_status != VA_STATUS_SUCCESS)
49+ return va_status;
50+
51+ dri_bo_map(obj_surface->bo, 0);
52+
53+ switch (obj_image->image.format.fourcc) {
54+ case VA_FOURCC('Y','V','1','2'): /* YV12 is native format here */
55+ memcpy(image_data, obj_surface->bo->virtual, obj_surface->bo->size);
56+ break;
57+ default:
58+ va_status = VA_STATUS_ERROR_OPERATION_FAILED;
59+ break;
60+ }
61+
62+ dri_bo_unmap(obj_surface->bo);
63+
64+ i965_UnmapBuffer(ctx, obj_image->image.buf);
65+ return va_status;
66 }
67
68 VAStatus
69--
701.5.4.3
71
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/037_g45_add_vaPutImage.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/037_g45_add_vaPutImage.patch
deleted file mode 100644
index ce638cce..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/037_g45_add_vaPutImage.patch
+++ /dev/null
@@ -1,111 +0,0 @@
1From 000807cfbd8bcbc9cd4bf28a066087fee43396b4 Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 13:36:39 +0000
4Subject: [PATCH] =?utf-8?q?[G45]=C2=A0Implement=20vaPutImage()=20for=20full-sized=20surface=20uploads.?=
5MIME-Version: 1.0
6Content-Type: text/plain; charset=utf-8
7Content-Transfer-Encoding: 8bit
8
9---
10 i965_drv_video/i965_drv_video.c | 78 +++++++++++++++++++++++++++++++--------
11 1 files changed, 62 insertions(+), 16 deletions(-)
12
13diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
14index d8a7bd1..e8f638c 100644
15--- a/i965_drv_video/i965_drv_video.c
16+++ b/i965_drv_video/i965_drv_video.c
17@@ -443,22 +443,6 @@ i965_QueryImageFormats(VADriverContextP ctx,
18 }
19
20 VAStatus
21-i965_PutImage(VADriverContextP ctx,
22- VASurfaceID surface,
23- VAImageID image,
24- int src_x,
25- int src_y,
26- unsigned int src_width,
27- unsigned int src_height,
28- int dest_x,
29- int dest_y,
30- unsigned int dest_width,
31- unsigned int dest_height)
32-{
33- return VA_STATUS_SUCCESS;
34-}
35-
36-VAStatus
37 i965_QuerySubpictureFormats(VADriverContextP ctx,
38 VAImageFormat *format_list, /* out */
39 unsigned int *flags, /* out */
40@@ -1439,6 +1423,68 @@ i965_GetImage(VADriverContextP ctx,
41 }
42
43 VAStatus
44+i965_PutImage(VADriverContextP ctx,
45+ VASurfaceID surface,
46+ VAImageID image,
47+ int src_x,
48+ int src_y,
49+ unsigned int src_width,
50+ unsigned int src_height,
51+ int dest_x,
52+ int dest_y,
53+ unsigned int dest_width,
54+ unsigned int dest_height)
55+{
56+ struct i965_driver_data *i965 = i965_driver_data(ctx);
57+
58+ struct object_surface *obj_surface = SURFACE(surface);
59+ if (!obj_surface)
60+ return VA_STATUS_ERROR_INVALID_SURFACE;
61+
62+ struct object_image *obj_image = IMAGE(image);
63+ if (!obj_image)
64+ return VA_STATUS_ERROR_INVALID_IMAGE;
65+
66+ /* XXX: we don't support partial video surface updates */
67+ if (src_x != 0 ||
68+ src_y != 0 ||
69+ src_width != obj_image->image.width ||
70+ src_height != obj_image->image.height)
71+ return VA_STATUS_ERROR_OPERATION_FAILED;
72+ if (dest_x != 0 ||
73+ dest_y != 0 ||
74+ dest_width != obj_surface->width ||
75+ dest_height != obj_surface->height)
76+ return VA_STATUS_ERROR_OPERATION_FAILED;
77+ if (src_width != dest_width ||
78+ src_height != dest_height)
79+ return VA_STATUS_ERROR_OPERATION_FAILED;
80+
81+ VAStatus va_status;
82+ void *image_data = NULL;
83+
84+ va_status = i965_MapBuffer(ctx, obj_image->image.buf, &image_data);
85+ if (va_status != VA_STATUS_SUCCESS)
86+ return va_status;
87+
88+ dri_bo_map(obj_surface->bo, 1);
89+
90+ switch (obj_image->image.format.fourcc) {
91+ case VA_FOURCC('Y','V','1','2'): /* YV12 is native format here */
92+ memcpy(obj_surface->bo->virtual, image_data, obj_surface->bo->size);
93+ break;
94+ default:
95+ va_status = VA_STATUS_ERROR_OPERATION_FAILED;
96+ break;
97+ }
98+
99+ dri_bo_unmap(obj_surface->bo);
100+
101+ i965_UnmapBuffer(ctx, obj_image->image.buf);
102+ return va_status;
103+}
104+
105+VAStatus
106 i965_PutSurface(VADriverContextP ctx,
107 VASurfaceID surface,
108 Drawable draw, /* X Drawable */
109--
1101.5.4.3
111
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/038_g45_vaPutSurface_cliprects.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/038_g45_vaPutSurface_cliprects.patch
deleted file mode 100644
index ca2e1bd4..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/038_g45_vaPutSurface_cliprects.patch
+++ /dev/null
@@ -1,531 +0,0 @@
1From 90de12a47e26ccc0b4cc8189c76991609481870d Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 4 Nov 2009 17:34:53 +0000
4Subject: [PATCH] [G45] Handle cliprects in vaPutSurface().
5
6---
7 i965_drv_video/i965_drv_video.c | 39 ++++--
8 i965_drv_video/i965_render.c | 284 +++++++++++++++++++--------------------
9 i965_drv_video/i965_render.h | 30 ++---
10 3 files changed, 176 insertions(+), 177 deletions(-)
11
12diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
13index e8f638c..20d6bab 100644
14--- a/i965_drv_video/i965_drv_video.c
15+++ b/i965_drv_video/i965_drv_video.c
16@@ -1507,13 +1507,23 @@ i965_PutSurface(VADriverContextP ctx,
17 union dri_buffer *buffer;
18 struct intel_region *dest_region;
19 struct object_surface *obj_surface;
20- int ret;
21+ int ret;
22 uint32_t name;
23+ VARectangle src_rect, dst_rect;
24 Bool new_region = False;
25+
26 /* Currently don't support DRI1 */
27 if (dri_state->driConnectedFlag != VA_DRI2)
28 return VA_STATUS_ERROR_UNKNOWN;
29
30+ /* XXX: we currently only support up to 64 cliprects */
31+ if (number_cliprects > MAX_CLIP_RECTS)
32+ return VA_STATUS_ERROR_OPERATION_FAILED;
33+
34+ obj_surface = SURFACE(surface);
35+ if (!obj_surface)
36+ return VA_STATUS_ERROR_INVALID_SURFACE;
37+
38 dri_drawable = dri_get_drawable(ctx, draw);
39 assert(dri_drawable);
40
41@@ -1552,17 +1562,24 @@ i965_PutSurface(VADriverContextP ctx,
42 assert(ret == 0);
43 }
44
45- i965_render_put_surface(ctx, surface,
46- srcx, srcy, srcw, srch,
47- destx, desty, destw, desth);
48- obj_surface = SURFACE(surface);
49- if(obj_surface->subpic != VA_INVALID_ID) {
50- i965_render_put_subpic(ctx, surface,
51- srcx, srcy, srcw, srch,
52- destx, desty, destw, desth);
53- }
54- dri_swap_buffer(ctx, dri_drawable);
55+ src_rect.x = srcx;
56+ src_rect.y = srcy;
57+ src_rect.width = srcw;
58+ src_rect.height = srch;
59+
60+ dst_rect.x = destx;
61+ dst_rect.y = desty;
62+ dst_rect.width = destw;
63+ dst_rect.height = desth;
64
65+ i965_render_put_surface(ctx, surface, &src_rect, &dst_rect,
66+ cliprects, number_cliprects);
67+
68+ if (obj_surface->subpic != VA_INVALID_ID)
69+ i965_render_put_subpic(ctx, surface, &src_rect, &dst_rect,
70+ cliprects, number_cliprects);
71+
72+ dri_swap_buffer(ctx, dri_drawable);
73 return VA_STATUS_SUCCESS;
74 }
75
76diff --git a/i965_drv_video/i965_render.c b/i965_drv_video/i965_render.c
77index 0476087..d7cd8fe 100644
78--- a/i965_drv_video/i965_render.c
79+++ b/i965_drv_video/i965_render.c
80@@ -787,13 +787,81 @@ i965_render_binding_table(VADriverContextP ctx)
81 dri_bo_unmap(render_state->wm.binding_table);
82 }
83
84-static void
85+static unsigned int
86+i965_render_do_upload_vertex(VADriverContextP ctx,
87+ unsigned int width,
88+ unsigned int height,
89+ const VARectangle *src_rect,
90+ const VARectangle *dst_rect,
91+ const VARectangle *cliprects,
92+ unsigned int num_cliprects)
93+{
94+ struct i965_driver_data *i965 = i965_driver_data(ctx);
95+ struct i965_render_state *render_state = &i965->render_state;
96+ struct intel_region *dest_region = render_state->draw_region;
97+ float *vb, tx1, tx2, ty1, ty2;
98+ int x1, x2, y1, y2;
99+ unsigned int i, n;
100+
101+ if (!cliprects || num_cliprects == 0) {
102+ cliprects = dst_rect;
103+ num_cliprects = 1;
104+ }
105+
106+ dri_bo_map(render_state->vb.vertex_buffer, 1);
107+ assert(render_state->vb.vertex_buffer->virtual);
108+ vb = render_state->vb.vertex_buffer->virtual;
109+
110+ for (n = 0, i = 0; i < num_cliprects; i++) {
111+ x1 = dest_region->x + cliprects[i].x;
112+ y1 = dest_region->y + cliprects[i].y;
113+ x2 = x1 + cliprects[i].width;
114+ y2 = y1 + cliprects[i].height;
115+ x1 = MAX(x1, dst_rect->x);
116+ y1 = MAX(y1, dst_rect->y);
117+ x2 = MIN(x2, dst_rect->x + dst_rect->width);
118+ y2 = MIN(y2, dst_rect->y + dst_rect->height);
119+
120+ if (x2 <= x1 || y2 <= y1)
121+ continue;
122+
123+ const float sx1 = (float)(x1 - dst_rect->x) / (float)dst_rect->width;
124+ const float sy1 = (float)(y1 - dst_rect->y) / (float)dst_rect->height;
125+ const float sx2 = (float)(x2 - dst_rect->x) / (float)dst_rect->width;
126+ const float sy2 = (float)(y2 - dst_rect->y) / (float)dst_rect->height;
127+ tx1 = ((float)src_rect->x + sx1 * (float)src_rect->width) / width;
128+ ty1 = ((float)src_rect->y + sy1 * (float)src_rect->height) / height;
129+ tx2 = ((float)src_rect->x + sx2 * (float)src_rect->width) / width;
130+ ty2 = ((float)src_rect->y + sy2 * (float)src_rect->height) / height;
131+
132+ vb[n++] = tx2;
133+ vb[n++] = ty2;
134+ vb[n++] = x2;
135+ vb[n++] = y2;
136+
137+ vb[n++] = tx1;
138+ vb[n++] = ty2;
139+ vb[n++] = x1;
140+ vb[n++] = y2;
141+
142+ vb[n++] = tx1;
143+ vb[n++] = ty1;
144+ vb[n++] = x1;
145+ vb[n++] = y1;
146+ }
147+
148+ dri_bo_unmap(render_state->vb.vertex_buffer);
149+ return n / 12;
150+}
151+
152+static unsigned int
153 i965_subpic_render_upload_vertex(VADriverContextP ctx,
154 VASurfaceID surface,
155- const VARectangle *output_rect)
156-{
157+ const VARectangle *output_rect,
158+ const VARectangle *cliprects,
159+ unsigned int num_cliprects)
160+{
161 struct i965_driver_data *i965 = i965_driver_data(ctx);
162- struct i965_render_state *render_state = &i965->render_state;
163 struct object_surface *obj_surface = SURFACE(surface);
164 struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic);
165
166@@ -803,8 +871,6 @@ i965_subpic_render_upload_vertex(VADriverContextP ctx,
167 const float ssy = (float)output_rect->height / (float)obj_surface->height;
168 const float sx = psx * ssx;
169 const float sy = psy * ssy;
170- float *vb, tx1, tx2, ty1, ty2, x1, x2, y1, y2;
171- int i = 0;
172
173 VARectangle dst_rect;
174 dst_rect.x = output_rect->x + sx * (float)obj_subpic->dst_rect.x;
175@@ -812,106 +878,38 @@ i965_subpic_render_upload_vertex(VADriverContextP ctx,
176 dst_rect.width = sx * (float)obj_subpic->dst_rect.width;
177 dst_rect.height = sy * (float)obj_subpic->dst_rect.height;
178
179- dri_bo_map(render_state->vb.vertex_buffer, 1);
180- assert(render_state->vb.vertex_buffer->virtual);
181- vb = render_state->vb.vertex_buffer->virtual;
182-
183- tx1 = (float)obj_subpic->src_rect.x / (float)obj_subpic->width;
184- ty1 = (float)obj_subpic->src_rect.y / (float)obj_subpic->height;
185- tx2 = (float)(obj_subpic->src_rect.x + obj_subpic->src_rect.width) / (float)obj_subpic->width;
186- ty2 = (float)(obj_subpic->src_rect.y + obj_subpic->src_rect.height) / (float)obj_subpic->height;
187-
188- x1 = (float)dst_rect.x;
189- y1 = (float)dst_rect.y;
190- x2 = (float)(dst_rect.x + dst_rect.width);
191- y2 = (float)(dst_rect.y + dst_rect.height);
192-
193- vb[i++] = tx2;
194- vb[i++] = ty2;
195- vb[i++] = x2;
196- vb[i++] = y2;
197-
198- vb[i++] = tx1;
199- vb[i++] = ty2;
200- vb[i++] = x1;
201- vb[i++] = y2;
202-
203- vb[i++] = tx1;
204- vb[i++] = ty1;
205- vb[i++] = x1;
206- vb[i++] = y1;
207- dri_bo_unmap(render_state->vb.vertex_buffer);
208+ return i965_render_do_upload_vertex(ctx,
209+ obj_subpic->width, obj_subpic->height,
210+ &obj_subpic->src_rect, &dst_rect,
211+ cliprects, num_cliprects);
212 }
213
214-static void
215+static unsigned int
216 i965_render_upload_vertex(VADriverContextP ctx,
217 VASurfaceID surface,
218- short srcx,
219- short srcy,
220- unsigned short srcw,
221- unsigned short srch,
222- short destx,
223- short desty,
224- unsigned short destw,
225- unsigned short desth)
226+ const VARectangle *src_rect,
227+ const VARectangle *dst_rect,
228+ const VARectangle *cliprects,
229+ unsigned int num_cliprects)
230 {
231 struct i965_driver_data *i965 = i965_driver_data(ctx);
232- struct i965_render_state *render_state = &i965->render_state;
233- struct intel_region *dest_region = render_state->draw_region;
234- struct object_surface *obj_surface;
235- float *vb;
236-
237- float u1, v1, u2, v2;
238- int i, width, height;
239- int box_x1 = dest_region->x + destx;
240- int box_y1 = dest_region->y + desty;
241- int box_x2 = box_x1 + destw;
242- int box_y2 = box_y1 + desth;
243-
244- obj_surface = SURFACE(surface);
245- assert(surface);
246- width = obj_surface->width;
247- height = obj_surface->height;
248-
249- u1 = (float)srcx / width;
250- v1 = (float)srcy / height;
251- u2 = (float)(srcx + srcw) / width;
252- v2 = (float)(srcy + srch) / height;
253-
254- dri_bo_map(render_state->vb.vertex_buffer, 1);
255- assert(render_state->vb.vertex_buffer->virtual);
256- vb = render_state->vb.vertex_buffer->virtual;
257-
258- i = 0;
259- vb[i++] = u2;
260- vb[i++] = v2;
261- vb[i++] = (float)box_x2;
262- vb[i++] = (float)box_y2;
263-
264- vb[i++] = u1;
265- vb[i++] = v2;
266- vb[i++] = (float)box_x1;
267- vb[i++] = (float)box_y2;
268-
269- vb[i++] = u1;
270- vb[i++] = v1;
271- vb[i++] = (float)box_x1;
272- vb[i++] = (float)box_y1;
273+ struct object_surface *obj_surface = SURFACE(surface);
274+ assert(obj_surface);
275
276- dri_bo_unmap(render_state->vb.vertex_buffer);
277+ return i965_render_do_upload_vertex(ctx,
278+ obj_surface->width, obj_surface->height,
279+ src_rect,
280+ dst_rect,
281+ cliprects, num_cliprects);
282 }
283
284-static void
285+static unsigned int
286 i965_surface_render_state_setup(VADriverContextP ctx,
287- VASurfaceID surface,
288- short srcx,
289- short srcy,
290- unsigned short srcw,
291- unsigned short srch,
292- short destx,
293- short desty,
294- unsigned short destw,
295- unsigned short desth)
296+ VASurfaceID surface,
297+ const VARectangle *src_rect,
298+ const VARectangle *dst_rect,
299+ const VARectangle *cliprects,
300+ unsigned int num_cliprects)
301 {
302 i965_render_vs_unit(ctx);
303 i965_render_sf_unit(ctx);
304@@ -922,21 +920,17 @@ i965_surface_render_state_setup(VADriverContextP ctx,
305 i965_render_cc_viewport(ctx);
306 i965_render_cc_unit(ctx);
307 i965_render_binding_table(ctx);
308- i965_render_upload_vertex(ctx, surface,
309- srcx, srcy, srcw, srch,
310- destx, desty, destw, desth);
311+ return i965_render_upload_vertex(ctx, surface, src_rect, dst_rect,
312+ cliprects, num_cliprects);
313 }
314-static void
315+
316+static unsigned int
317 i965_subpic_render_state_setup(VADriverContextP ctx,
318- VASurfaceID surface,
319- short srcx,
320- short srcy,
321- unsigned short srcw,
322- unsigned short srch,
323- short destx,
324- short desty,
325- unsigned short destw,
326- unsigned short desth)
327+ VASurfaceID surface,
328+ const VARectangle *src_rect,
329+ const VARectangle *dst_rect,
330+ const VARectangle *cliprects,
331+ unsigned int num_cliprects)
332 {
333 i965_render_vs_unit(ctx);
334 i965_render_sf_unit(ctx);
335@@ -947,16 +941,10 @@ i965_subpic_render_state_setup(VADriverContextP ctx,
336 i965_render_cc_viewport(ctx);
337 i965_subpic_render_cc_unit(ctx);
338 i965_render_binding_table(ctx);
339-
340- VARectangle output_rect;
341- output_rect.x = destx;
342- output_rect.y = desty;
343- output_rect.width = destw;
344- output_rect.height = desth;
345- i965_subpic_render_upload_vertex(ctx, surface, &output_rect);
346+ return i965_subpic_render_upload_vertex(ctx, surface, dst_rect,
347+ cliprects, num_cliprects);
348 }
349
350-
351 static void
352 i965_render_pipeline_select(VADriverContextP ctx)
353 {
354@@ -1192,7 +1180,7 @@ i965_render_upload_image_palette(
355 }
356
357 static void
358-i965_render_startup(VADriverContextP ctx)
359+i965_render_startup(VADriverContextP ctx, unsigned int vb_offset)
360 {
361 struct i965_driver_data *i965 = i965_driver_data(ctx);
362 struct i965_render_state *render_state = &i965->render_state;
363@@ -1203,7 +1191,7 @@ i965_render_startup(VADriverContextP ctx)
364 (0 << VB0_BUFFER_INDEX_SHIFT) |
365 VB0_VERTEXDATA |
366 ((4 * 4) << VB0_BUFFER_PITCH_SHIFT));
367- OUT_RELOC(ctx, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 0);
368+ OUT_RELOC(ctx, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, vb_offset);
369
370 if (IS_IGDNG(i965->intel.device_id))
371 OUT_RELOC(ctx, render_state->vb.vertex_buffer, I915_GEM_DOMAIN_VERTEX, 0, 12 * 4);
372@@ -1268,8 +1256,10 @@ i965_clear_dest_region(VADriverContextP ctx)
373 }
374
375 static void
376-i965_surface_render_pipeline_setup(VADriverContextP ctx)
377+i965_surface_render_pipeline_setup(VADriverContextP ctx, unsigned int n_rects)
378 {
379+ unsigned int i;
380+
381 intel_batchbuffer_start_atomic(ctx, 0x1000);
382 intel_batchbuffer_emit_mi_flush(ctx);
383 i965_clear_dest_region(ctx);
384@@ -1283,13 +1273,16 @@ i965_surface_render_pipeline_setup(VADriverContextP ctx)
385 i965_render_cs_urb_layout(ctx);
386 i965_render_drawing_rectangle(ctx);
387 i965_render_vertex_elements(ctx);
388- i965_render_startup(ctx);
389+ for (i = 0; i < n_rects; i++)
390+ i965_render_startup(ctx, 48 * i);
391 intel_batchbuffer_end_atomic(ctx);
392 }
393
394 static void
395-i965_subpic_render_pipeline_setup(VADriverContextP ctx)
396+i965_subpic_render_pipeline_setup(VADriverContextP ctx, unsigned int n_rects)
397 {
398+ unsigned int i;
399+
400 intel_batchbuffer_start_atomic(ctx, 0x1000);
401 intel_batchbuffer_emit_mi_flush(ctx);
402 i965_render_pipeline_select(ctx);
403@@ -1302,7 +1295,8 @@ i965_subpic_render_pipeline_setup(VADriverContextP ctx)
404 i965_render_cs_urb_layout(ctx);
405 i965_render_drawing_rectangle(ctx);
406 i965_render_vertex_elements(ctx);
407- i965_render_startup(ctx);
408+ for (i = 0; i < n_rects; i++)
409+ i965_render_startup(ctx, 48 * i);
410 intel_batchbuffer_end_atomic(ctx);
411 }
412
413@@ -1396,45 +1390,39 @@ i965_render_initialize(VADriverContextP ctx)
414 void
415 i965_render_put_surface(VADriverContextP ctx,
416 VASurfaceID surface,
417- short srcx,
418- short srcy,
419- unsigned short srcw,
420- unsigned short srch,
421- short destx,
422- short desty,
423- unsigned short destw,
424- unsigned short desth)
425+ const VARectangle *src_rect,
426+ const VARectangle *dst_rect,
427+ const VARectangle *cliprects,
428+ unsigned int num_cliprects)
429 {
430+ unsigned int n_rects;
431+
432 i965_render_initialize(ctx);
433- i965_surface_render_state_setup(ctx, surface,
434- srcx, srcy, srcw, srch,
435- destx, desty, destw, desth);
436- i965_surface_render_pipeline_setup(ctx);
437+ n_rects = i965_surface_render_state_setup(ctx, surface,
438+ src_rect, dst_rect,
439+ cliprects, num_cliprects);
440+ i965_surface_render_pipeline_setup(ctx, n_rects);
441 intel_batchbuffer_flush(ctx);
442 }
443
444 void
445 i965_render_put_subpic(VADriverContextP ctx,
446- VASurfaceID surface,
447- short srcx,
448- short srcy,
449- unsigned short srcw,
450- unsigned short srch,
451- short destx,
452- short desty,
453- unsigned short destw,
454- unsigned short desth)
455+ VASurfaceID surface,
456+ const VARectangle *src_rect,
457+ const VARectangle *dst_rect,
458+ const VARectangle *cliprects,
459+ unsigned int num_cliprects)
460 {
461 struct i965_driver_data *i965 = i965_driver_data(ctx);
462 struct object_surface *obj_surface = SURFACE(surface);
463 struct object_subpic *obj_subpic = SUBPIC(obj_surface->subpic);
464+ unsigned int n_rects;
465 assert(obj_subpic);
466
467 i965_render_initialize(ctx);
468- i965_subpic_render_state_setup(ctx, surface,
469- srcx, srcy, srcw, srch,
470- destx, desty, destw, desth);
471- i965_subpic_render_pipeline_setup(ctx);
472+ n_rects = i965_subpic_render_state_setup(ctx, surface, src_rect, dst_rect,
473+ cliprects, num_cliprects);
474+ i965_subpic_render_pipeline_setup(ctx, n_rects);
475 i965_render_upload_image_palette(ctx, obj_subpic->image, 0xff);
476 intel_batchbuffer_flush(ctx);
477 }
478diff --git a/i965_drv_video/i965_render.h b/i965_drv_video/i965_render.h
479index e3dce02..d2e23f1 100644
480--- a/i965_drv_video/i965_render.h
481+++ b/i965_drv_video/i965_render.h
482@@ -28,6 +28,7 @@
483 #ifndef _I965_RENDER_H_
484 #define _I965_RENDER_H_
485
486+#define MAX_CLIP_RECTS 80 /* vb_bo:4096 / vb:(3*4*4) */
487 #define MAX_RENDER_SURFACES 16
488 #define MAX_SAMPLERS 16
489
490@@ -65,27 +66,20 @@ struct i965_render_state
491
492 Bool i965_render_init(VADriverContextP ctx);
493 Bool i965_render_terminate(VADriverContextP ctx);
494+
495 void i965_render_put_surface(VADriverContextP ctx,
496 VASurfaceID surface,
497- short srcx,
498- short srcy,
499- unsigned short srcw,
500- unsigned short srch,
501- short destx,
502- short desty,
503- unsigned short destw,
504- unsigned short desth);
505-
506+ const VARectangle *src_rect,
507+ const VARectangle *dst_rect,
508+ const VARectangle *cliprects,
509+ unsigned int num_cliprects);
510
511 void
512 i965_render_put_subpic(VADriverContextP ctx,
513- VASurfaceID surface,
514- short srcx,
515- short srcy,
516- unsigned short srcw,
517- unsigned short srch,
518- short destx,
519- short desty,
520- unsigned short destw,
521- unsigned short desth);
522+ VASurfaceID surface,
523+ const VARectangle *src_rect,
524+ const VARectangle *dst_rect,
525+ const VARectangle *cliprects,
526+ unsigned int num_cliprects);
527+
528 #endif /* _I965_RENDER_H_ */
529--
5301.5.4.3
531
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/102_attribute_visibility.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/102_attribute_visibility.patch
deleted file mode 100644
index 2885ab7b..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/102_attribute_visibility.patch
+++ /dev/null
@@ -1,47 +0,0 @@
1commit 8d0004cbd40305114bbe8019122319b43d25a772
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Tue Sep 8 12:34:39 2009 +0000
4
5 Fix ATTRIBUTE_HIDDEN definition if __attribute__((visibility("hidden"))) is not supported.
6
7commit 7a8bf489ffd436d853364dd0d3c9a6734b8cc7eb
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Thu Sep 3 15:46:37 2009 +0000
10
11 Check for __attribute__((visibility("hidden"))).
12
13diff --git a/configure.ac b/configure.ac
14index da96872..abef435 100644
15--- a/configure.ac
16+++ b/configure.ac
17@@ -132,6 +132,30 @@ if test x$enable_i965_driver = xyes && ! $PKG_CONFIG --atleast-version=2.4 libdr
18 fi
19 AM_CONDITIONAL(BUILD_I965_DRIVER, test x$enable_i965_driver = xyes)
20
21+dnl Check for __attribute__((visibility()))
22+AC_CACHE_CHECK([whether __attribute__((visibility())) is supported],
23+ libva_cv_visibility_attribute,
24+ [cat > conftest.c <<EOF
25+int foo __attribute__ ((visibility ("hidden"))) = 1;
26+int bar __attribute__ ((visibility ("protected"))) = 1;
27+EOF
28+ libva_cv_visibility_attribute=no
29+ if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then
30+ if grep '\.hidden.*foo' conftest.s >/dev/null; then
31+ if grep '\.protected.*bar' conftest.s >/dev/null; then
32+ libva_cv_visibility_attribute=yes
33+ fi
34+ fi
35+ fi
36+ rm -f conftest.[cs]
37+])
38+ATTRIBUTE_HIDDEN=""
39+if test $libva_cv_visibility_attribute = yes; then
40+ ATTRIBUTE_HIDDEN="__attribute__((visibility(\"hidden\")))"
41+fi
42+AC_DEFINE_UNQUOTED([ATTRIBUTE_HIDDEN], [$ATTRIBUTE_HIDDEN],
43+ [Defined to __attribute__((visibility("hidden"))) when available])
44+
45 # We only need the headers, we don't link against the DRM libraries
46 LIBVA_CFLAGS="$DRM_CFLAGS"
47 AC_SUBST(LIBVA_CFLAGS)
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/103_fix_vainfo_deps.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/103_fix_vainfo_deps.patch
deleted file mode 100644
index 942c26d1..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/103_fix_vainfo_deps.patch
+++ /dev/null
@@ -1,24 +0,0 @@
1commit 11e626a3610daf0fce253ef48ab8736bce6178f9
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Tue Sep 22 12:29:56 2009 +0000
4
5 Fix vainfo dependencies (Konstantin Pavlov).
6
7diff --git a/test/Makefile.am b/test/Makefile.am
8index 58e1677..ee78d34 100644
9--- a/test/Makefile.am
10+++ b/test/Makefile.am
11@@ -31,10 +31,10 @@ AM_CFLAGS = -I$(top_srcdir)/../../include/external/ -I$(top_srcdir)/src -I$(top_
12
13 TESTS = $(check_PROGRAMS)
14
15-TEST_LIBS = $(top_srcdir)/src/$(libvabackendlib)
16+TEST_LIBS = $(top_srcdir)/src/libva.la $(top_srcdir)/src/$(libvabackendlib)
17
18-vainfo_LDADD = $(top_srcdir)/src/$(libvabackendlib)
19-vainfo_DEPENDENCIES = $(top_srcdir)/src/$(libvabackendlib)
20+vainfo_LDADD = $(top_srcdir)/src/libva.la $(top_srcdir)/src/$(libvabackendlib)
21+vainfo_DEPENDENCIES = $(top_srcdir)/src/libva.la $(top_srcdir)/src/$(libvabackendlib)
22 vainfo_SOURCES = vainfo.c
23
24 test_01_LDADD = $(TEST_LIBS)
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/104_fix_libva_pkgconfig_deps.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/104_fix_libva_pkgconfig_deps.patch
deleted file mode 100644
index bd212bf3..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/104_fix_libva_pkgconfig_deps.patch
+++ /dev/null
@@ -1,18 +0,0 @@
1commit f0b352251894becfcec50de1430bda12c314a464
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Tue Sep 22 13:00:34 2009 +0000
4
5 Fix libva-x11 pkgconfig dependencies.
6
7diff --git a/libva-x11.pc.in b/libva-x11.pc.in
8index 75e4f0b..6dde07f 100644
9--- a/libva-x11.pc.in
10+++ b/libva-x11.pc.in
11@@ -6,6 +6,7 @@ display=x11
12
13 Name: libva-${display}
14 Description: Userspace Video Acceleration (VA) ${display} interface
15+Requires: libva
16 Version: @PACKAGE_VERSION@
17 Libs: -L${libdir} -lva-${display}
18 Cflags: -I${includedir}
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/105_dont_search_LIBGL_DRIVERS_PATH.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/105_dont_search_LIBGL_DRIVERS_PATH.patch
deleted file mode 100644
index de873d60..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/105_dont_search_LIBGL_DRIVERS_PATH.patch
+++ /dev/null
@@ -1,21 +0,0 @@
1commit 035374378644216fb3a7d3974a8c46b1bd425918
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Tue Sep 22 13:03:23 2009 +0000
4
5 Don't search LIBGL_DRIVERS_PATH, stick to LIBVA_DRIVERS_PATH only or the default path.
6
7diff --git a/src/va.c b/src/va.c
8index 12662cd..723235e 100644
9--- a/src/va.c
10+++ b/src/va.c
11@@ -134,10 +134,6 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
12 {
13 /* don't allow setuid apps to use LIBVA_DRIVERS_PATH */
14 search_path = getenv("LIBVA_DRIVERS_PATH");
15- if (!search_path)
16- {
17- search_path = getenv("LIBGL_DRIVERS_PATH");
18- }
19 }
20 if (!search_path)
21 {
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/108_drivers_path.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/108_drivers_path.patch
deleted file mode 100644
index 073c9870..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/108_drivers_path.patch
+++ /dev/null
@@ -1,25 +0,0 @@
1From 332bfec6020b5cfcef5d655f4bf525dab67c0b92 Mon Sep 17 00:00:00 2001
2From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed, 24 Jun 2009 08:12:13 +0000
4Subject: [PATCH] Install drivers into pkglibdir/va/.
5
6---
7 configure.ac | 2 +-
8 1 files changed, 1 insertions(+), 1 deletions(-)
9
10diff --git a/configure.ac b/configure.ac
11index 4be2b56..d595ac9 100644
12--- a/configure.ac
13+++ b/configure.ac
14@@ -73,7 +73,7 @@ AC_ARG_ENABLE(i965-driver,
15
16 AC_ARG_WITH(drivers-path,
17 [AC_HELP_STRING([--with-drivers-path=[[path]]], [drivers path])],,
18- [with_drivers_path="$libdir/dri"])
19+ [with_drivers_path="$libdir/va/drivers"])
20
21 LIBVA_DRIVERS_PATH="$with_drivers_path"
22 AC_SUBST(LIBVA_DRIVERS_PATH)
23--
241.5.4.3
25
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/203_fix_fglrx_detection.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/203_fix_fglrx_detection.patch
deleted file mode 100644
index ce7f1065..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/203_fix_fglrx_detection.patch
+++ /dev/null
@@ -1,542 +0,0 @@
1commit fb6ccda5984eda96bcb394b23255143dcbc21f18
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Thu Sep 10 12:22:17 2009 +0000
4
5 Don't link against libdrm to workaround XvBA / fglrx >= 8.66-RC1 bugs.
6
7commit ab3c0f65182462b54729d2d82d4d645c8be5b2d1
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Wed Sep 9 13:24:46 2009 +0000
10
11 Fix DRM device opening with fglrx >= 8.66-RC1.
12
13diff --git a/src/x11/Makefile.am b/src/x11/Makefile.am
14index c70380d..b6916f2 100644
15--- a/src/x11/Makefile.am
16+++ b/src/x11/Makefile.am
17@@ -25,6 +25,6 @@ noinst_LTLIBRARIES = libva_x11.la
18 libva_x11includedir = ${includedir}/va
19 libva_x11include_HEADERS = va_x11.h va_dri.h va_dri2.h va_dricommon.h
20
21-libva_x11_la_SOURCES = va_x11.c va_dri.c va_dri2.c va_dricommon.c dri2_util.c dri1_util.c va_nvctrl.c
22+libva_x11_la_SOURCES = va_x11.c va_dri.c va_dri2.c va_dricommon.c dri2_util.c dri1_util.c va_nvctrl.c libdrm_glue.c
23
24-EXTRA_DIST = va_dristr.h va_dri2str.h va_dri2tokens.h va_nvctrl.h
25+EXTRA_DIST = va_dristr.h va_dri2str.h va_dri2tokens.h va_nvctrl.h libdrm_glue.h
26diff --git a/src/x11/dri1_util.c b/src/x11/dri1_util.c
27index b3db5b4..3bd490f 100644
28--- a/src/x11/dri1_util.c
29+++ b/src/x11/dri1_util.c
30@@ -1,10 +1,12 @@
31+#include "config.h"
32+#include <stdio.h>
33 #include <stdlib.h>
34 #include <fcntl.h>
35 #include <unistd.h>
36 #include <sys/mman.h>
37 #include <assert.h>
38
39-#include <xf86drm.h>
40+#include "libdrm_glue.h"
41
42 #include "X11/Xlib.h"
43 #include "va.h"
44@@ -21,6 +23,75 @@ struct dri1_drawable
45 int height;
46 };
47
48+static int
49+firegl_drmOpenMinor(int minor)
50+{
51+ char buf[64];
52+ int fd;
53+
54+ sprintf(buf, "/dev/ati/card%d", minor);
55+ if ((fd = open(buf, O_RDWR, 0)) >= 0)
56+ return fd;
57+ return -1;
58+}
59+
60+static int
61+firegl_drmOpenByBusID(const char *busid)
62+{
63+ int i, fd;
64+ drmSetVersion sv;
65+ const char *buf;
66+
67+ for (i = 0; i < DRM_MAX_MINOR; i++) {
68+ if ((fd = firegl_drmOpenMinor(i)) < 0)
69+ continue;
70+ sv.drm_di_major = 1;
71+ sv.drm_di_minor = 1;
72+ sv.drm_dd_major = -1;
73+ sv.drm_dd_minor = -1;
74+ libdrm_drmSetInterfaceVersion(fd, &sv);
75+ buf = libdrm_drmGetBusid(fd);
76+ if (buf && strcasecmp(buf, busid) == 0) { /* XXX: drmMatchBusID() */
77+ libdrm_drmFreeBusid(buf);
78+ return fd;
79+ }
80+ if (buf)
81+ libdrm_drmFreeBusid(buf);
82+ close(fd);
83+ }
84+ return -1;
85+}
86+
87+static int
88+drm_open_once(struct dri_state *dri_state, const char *BusID, int *newlyopened)
89+{
90+ dri_state->driConnectedFlag = VA_NONE;
91+ dri_state->fd = libdrm_drmOpenOnce(NULL, BusID, newlyopened);
92+ if (dri_state->fd < 0) {
93+ dri_state->fd = firegl_drmOpenByBusID(BusID);
94+ if (dri_state->fd >= 0) {
95+ *newlyopened = 1;
96+ dri_state->driConnectedFlag |= VA_DRI_AMD;
97+ }
98+ }
99+ return dri_state->fd;
100+}
101+
102+static void
103+drm_close_once(struct dri_state *dri_state)
104+{
105+ /* XXX: dri_state->close() doesn't seem to be called, thus this
106+ function is never called either */
107+ if (dri_state->fd < 0)
108+ return;
109+ if (dri_state->driConnectedFlag & VA_DRI_AMD)
110+ close(dri_state->fd);
111+ else
112+ libdrm_drmCloseOnce(dri_state->fd);
113+ dri_state->fd = -1;
114+ dri_state->driConnectedFlag = VA_NONE;
115+}
116+
117 static struct dri_drawable *
118 dri1CreateDrawable(VADriverContextP ctx, XID x_drawable)
119 {
120@@ -64,9 +135,9 @@ dri1Close(VADriverContextP ctx)
121 free_drawable_hashtable(ctx);
122 VA_DRIDestroyContext(ctx->x11_dpy, ctx->x11_screen, dri_state->hwContextID);
123 assert(dri_state->pSAREA != MAP_FAILED);
124- drmUnmap(dri_state->pSAREA, SAREA_MAX);
125+ libdrm_drmUnmap(dri_state->pSAREA, SAREA_MAX);
126 assert(dri_state->fd >= 0);
127- drmCloseOnce(dri_state->fd);
128+ drm_close_once(dri_state);
129 VA_DRICloseConnection(ctx->x11_dpy, ctx->x11_screen);
130 }
131
132@@ -104,21 +175,20 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
133 &dri_state->hSAREA, &BusID))
134 goto err_out0;
135
136-
137- dri_state->fd = drmOpenOnce(NULL, BusID, &newlyopened);
138+ drm_open_once(dri_state, BusID, &newlyopened);
139 XFree(BusID);
140
141 if (dri_state->fd < 0)
142 goto err_out1;
143
144
145- if (drmGetMagic(dri_state->fd, &magic))
146+ if (libdrm_drmGetMagic(dri_state->fd, &magic))
147 goto err_out1;
148
149 if (newlyopened && !VA_DRIAuthConnection(ctx->x11_dpy, ctx->x11_screen, magic))
150 goto err_out1;
151
152- if (drmMap(dri_state->fd, dri_state->hSAREA, SAREA_MAX, &dri_state->pSAREA))
153+ if (libdrm_drmMap(dri_state->fd, dri_state->hSAREA, SAREA_MAX, &dri_state->pSAREA))
154 goto err_out1;
155
156 if (!VA_DRICreateContext(ctx->x11_dpy, ctx->x11_screen,
157@@ -127,7 +196,8 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
158 &dri_state->hwContextID, &dri_state->hwContext))
159 goto err_out1;
160
161- dri_state->driConnectedFlag = VA_DRI1;
162+ dri_state->driConnectedFlag &= VA_DRI_AMD; /* clear flags but AMD bit */
163+ dri_state->driConnectedFlag |= VA_DRI1;
164 dri_state->createDrawable = dri1CreateDrawable;
165 dri_state->destroyDrawable = dri1DestroyDrawable;
166 dri_state->swapBuffer = dri1SwapBuffer;
167@@ -138,10 +208,10 @@ isDRI1Connected(VADriverContextP ctx, char **driver_name)
168
169 err_out1:
170 if (dri_state->pSAREA != MAP_FAILED)
171- drmUnmap(dri_state->pSAREA, SAREA_MAX);
172+ libdrm_drmUnmap(dri_state->pSAREA, SAREA_MAX);
173
174 if (dri_state->fd >= 0)
175- drmCloseOnce(dri_state->fd);
176+ drm_close_once(dri_state);
177
178 VA_DRICloseConnection(ctx->x11_dpy, ctx->x11_screen);
179
180diff --git a/src/x11/dri2_util.c b/src/x11/dri2_util.c
181index ebe7a2c..b727e97 100644
182--- a/src/x11/dri2_util.c
183+++ b/src/x11/dri2_util.c
184@@ -3,7 +3,7 @@
185 #include <unistd.h>
186 #include <assert.h>
187
188-#include <xf86drm.h>
189+#include "libdrm_glue.h"
190
191 #include <X11/Xlibint.h>
192 #include <X11/Xlib.h>
193@@ -166,7 +166,7 @@ isDRI2Connected(VADriverContextP ctx, char **driver_name)
194 if (dri_state->fd < 0)
195 goto err_out;
196
197- if (drmGetMagic(dri_state->fd, &magic))
198+ if (libdrm_drmGetMagic(dri_state->fd, &magic))
199 goto err_out;
200
201 if (!VA_DRI2Authenticate(ctx->x11_dpy, RootWindow(ctx->x11_dpy, ctx->x11_screen),
202diff --git a/src/x11/libdrm_glue.c b/src/x11/libdrm_glue.c
203new file mode 100644
204index 0000000..b72a2d1
205--- /dev/null
206+++ b/src/x11/libdrm_glue.c
207@@ -0,0 +1,208 @@
208+/*
209+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
210+ *
211+ * Permission is hereby granted, free of charge, to any person obtaining a
212+ * copy of this software and associated documentation files (the
213+ * "Software"), to deal in the Software without restriction, including
214+ * without limitation the rights to use, copy, modify, merge, publish,
215+ * distribute, sub license, and/or sell copies of the Software, and to
216+ * permit persons to whom the Software is furnished to do so, subject to
217+ * the following conditions:
218+ *
219+ * The above copyright notice and this permission notice (including the
220+ * next paragraph) shall be included in all copies or substantial portions
221+ * of the Software.
222+ *
223+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
224+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
226+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
227+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
228+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
229+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
230+ */
231+
232+#define _GNU_SOURCE 1
233+#include "libdrm_glue.h"
234+#include <stdio.h>
235+#include <string.h>
236+#include <dlfcn.h>
237+#include <assert.h>
238+
239+#define LOAD_FUNC_(NAME, RET, ARGS, FALLBACK) \
240+ static RET (*lib_##NAME) ARGS; \
241+ if (lib_##NAME == NULL) { \
242+ lib_##NAME = libdrm_symbol(#NAME); \
243+ if (!lib_##NAME) \
244+ lib_##NAME = FALLBACK; \
245+ } \
246+ assert(lib_##NAME != NULL)
247+
248+#define LOAD_FUNC(NAME, RET, ARGS) \
249+ LOAD_FUNC_(NAME, RET, ARGS, NULL)
250+
251+static void *libdrm_handle;
252+static int libdrm_handle_ok = -1;
253+
254+static inline void *libdrm_symbol(const char *name)
255+{
256+ if (!libdrm_open())
257+ return NULL;
258+ return dlsym(libdrm_handle, name);
259+}
260+
261+int libdrm_open(void)
262+{
263+ if (libdrm_handle_ok < 0) {
264+ libdrm_handle = dlopen("libdrm.so.2", RTLD_LOCAL|RTLD_LAZY);
265+ libdrm_handle_ok = libdrm_handle != NULL;
266+ }
267+ assert(libdrm_handle);
268+ return libdrm_handle_ok;
269+}
270+
271+void libdrm_close(void)
272+{
273+ if (libdrm_handle)
274+ dlclose(libdrm_handle);
275+}
276+
277+// Default drmOpenOnce() and drmCloseOnce() implementations based on current GIT
278+#define DRM_MAX_FDS 16
279+static struct {
280+ char *BusID;
281+ int fd;
282+ int refcount;
283+} connection[DRM_MAX_FDS];
284+
285+static int nr_fds = 0;
286+
287+// Default implementation for drmOpenOnce() if none exists in the library
288+static int
289+libdrm_default_drmOpenOnce(void *unused, const char *BusID, int *newlyopened)
290+{
291+ int i;
292+ int fd;
293+
294+ for (i = 0; i < nr_fds; i++)
295+ if (strcmp(BusID, connection[i].BusID) == 0) {
296+ connection[i].refcount++;
297+ *newlyopened = 0;
298+ return connection[i].fd;
299+ }
300+
301+ fd = libdrm_drmOpen(unused, BusID);
302+ if (fd <= 0 || nr_fds == DRM_MAX_FDS)
303+ return fd;
304+
305+ connection[nr_fds].BusID = strdup(BusID);
306+ connection[nr_fds].fd = fd;
307+ connection[nr_fds].refcount = 1;
308+ *newlyopened = 1;
309+
310+ if (0)
311+ fprintf(stderr, "saved connection %d for %s %d\n",
312+ nr_fds, connection[nr_fds].BusID,
313+ strcmp(BusID, connection[nr_fds].BusID));
314+ nr_fds++;
315+ return fd;
316+}
317+
318+// Default implementation for drmCloseOnce() if none exists in the library
319+static void libdrm_default_drmCloseOnce(int fd)
320+{
321+ int i;
322+
323+ for (i = 0; i < nr_fds; i++) {
324+ if (fd == connection[i].fd) {
325+ if (--connection[i].refcount == 0) {
326+ libdrm_drmClose(connection[i].fd);
327+ free(connection[i].BusID);
328+ if (i < --nr_fds)
329+ connection[i] = connection[nr_fds];
330+ return;
331+ }
332+ }
333+ }
334+}
335+
336+// Determine whether the DRM kernel driver has been loaded
337+int libdrm_drmAvailable(void)
338+{
339+ LOAD_FUNC(drmAvailable, int, (void));
340+ return lib_drmAvailable();
341+}
342+
343+// Open the DRM device
344+int libdrm_drmOpen(const char *name, const char *busid)
345+{
346+ LOAD_FUNC(drmOpen, int, (const char *, const char *));
347+ return lib_drmOpen(name, busid);
348+}
349+
350+// Close the device
351+int libdrm_drmClose(int fd)
352+{
353+ LOAD_FUNC(drmClose, int, (int));
354+ return lib_drmClose(fd);
355+}
356+
357+// Open the DRM device (re-use an existing connection)
358+int libdrm_drmOpenOnce(void *unused, const char *BusID, int *newlyopened)
359+{
360+ LOAD_FUNC_(drmOpenOnce, int, (void *, const char *, int *),
361+ libdrm_default_drmOpenOnce);
362+ return lib_drmOpenOnce(unused, BusID, newlyopened);
363+}
364+
365+// Close the device (unref an existing connection prior to actually closing it)
366+void libdrm_drmCloseOnce(int fd)
367+{
368+ LOAD_FUNC_(drmCloseOnce, void, (int), libdrm_default_drmCloseOnce);
369+ lib_drmCloseOnce(fd);
370+}
371+
372+// DRM connection cookie
373+int libdrm_drmGetMagic(int fd, drm_magic_t * magic)
374+{
375+ LOAD_FUNC(drmGetMagic, int, (int, drm_magic_t *));
376+ return lib_drmGetMagic(fd, magic);
377+}
378+
379+// Issue a set-version ioctl
380+int libdrm_drmSetInterfaceVersion(int fd, drmSetVersion *version)
381+{
382+ LOAD_FUNC(drmSetInterfaceVersion, int, (int, drmSetVersion *));
383+ return lib_drmSetInterfaceVersion(fd, version);
384+}
385+
386+// Get the bus ID of the device
387+char *libdrm_drmGetBusid(int fd)
388+{
389+ LOAD_FUNC(drmGetBusid, char *, (int));
390+ return lib_drmGetBusid(fd);
391+}
392+
393+// Free the bus ID information
394+void libdrm_drmFreeBusid(const char *busid)
395+{
396+ LOAD_FUNC(drmFreeBusid, void, (const char *));
397+ lib_drmFreeBusid(busid);
398+}
399+
400+// Map a region of memory
401+int libdrm_drmMap(int fd,
402+ drm_handle_t handle,
403+ drmSize size,
404+ drmAddressPtr address)
405+{
406+ LOAD_FUNC(drmMap, int, (int, drm_handle_t, drmSize, drmAddressPtr));
407+ return lib_drmMap(fd, handle, size, address);
408+}
409+
410+// Unmap mappings obtained with drmMap()
411+int libdrm_drmUnmap(drmAddress address, drmSize size)
412+{
413+ LOAD_FUNC(drmUnmap, int, (drmAddress, drmSize));
414+ return lib_drmUnmap(address, size);
415+}
416diff --git a/src/x11/libdrm_glue.h b/src/x11/libdrm_glue.h
417new file mode 100644
418index 0000000..878470b
419--- /dev/null
420+++ b/src/x11/libdrm_glue.h
421@@ -0,0 +1,73 @@
422+/*
423+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
424+ *
425+ * Permission is hereby granted, free of charge, to any person obtaining a
426+ * copy of this software and associated documentation files (the
427+ * "Software"), to deal in the Software without restriction, including
428+ * without limitation the rights to use, copy, modify, merge, publish,
429+ * distribute, sub license, and/or sell copies of the Software, and to
430+ * permit persons to whom the Software is furnished to do so, subject to
431+ * the following conditions:
432+ *
433+ * The above copyright notice and this permission notice (including the
434+ * next paragraph) shall be included in all copies or substantial portions
435+ * of the Software.
436+ *
437+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
438+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
439+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
440+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
441+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
442+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
443+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
444+ */
445+
446+#ifndef LIBDRM_GLUE_H
447+#define LIBDRM_GLUE_H
448+
449+#include "config.h"
450+#include <xf86drm.h>
451+
452+int libdrm_open(void)
453+ ATTRIBUTE_HIDDEN;
454+
455+void libdrm_close(void)
456+ ATTRIBUTE_HIDDEN;
457+
458+int libdrm_drmAvailable(void)
459+ ATTRIBUTE_HIDDEN;
460+
461+int libdrm_drmOpen(const char *name, const char *busid)
462+ ATTRIBUTE_HIDDEN;
463+
464+int libdrm_drmClose(int fd)
465+ ATTRIBUTE_HIDDEN;
466+
467+int libdrm_drmOpenOnce(void *unused, const char *BusID, int *newlyopened)
468+ ATTRIBUTE_HIDDEN;
469+
470+void libdrm_drmCloseOnce(int fd)
471+ ATTRIBUTE_HIDDEN;
472+
473+int libdrm_drmGetMagic(int fd, drm_magic_t * magic)
474+ ATTRIBUTE_HIDDEN;
475+
476+int libdrm_drmSetInterfaceVersion(int fd, drmSetVersion *version)
477+ ATTRIBUTE_HIDDEN;
478+
479+char *libdrm_drmGetBusid(int fd)
480+ ATTRIBUTE_HIDDEN;
481+
482+void libdrm_drmFreeBusid(const char *busid)
483+ ATTRIBUTE_HIDDEN;
484+
485+int libdrm_drmMap(int fd,
486+ drm_handle_t handle,
487+ drmSize size,
488+ drmAddressPtr address)
489+ ATTRIBUTE_HIDDEN;
490+
491+int libdrm_drmUnmap(drmAddress address, drmSize size)
492+ ATTRIBUTE_HIDDEN;
493+
494+#endif /* LIBDRM_GLUE_H */
495diff --git a/src/x11/va_dricommon.h b/src/x11/va_dricommon.h
496index a2a51a6..0da35fe 100644
497--- a/src/x11/va_dricommon.h
498+++ b/src/x11/va_dricommon.h
499@@ -13,7 +13,8 @@ enum
500 {
501 VA_NONE = 0,
502 VA_DRI1 = 1,
503- VA_DRI2 = 2
504+ VA_DRI2 = 2,
505+ VA_DRI_AMD = 4 /* AMD DRI implementation */
506 };
507
508 union dri_buffer
509diff --git a/src/x11/va_x11.c b/src/x11/va_x11.c
510index b8c60fa..414c261 100644
511--- a/src/x11/va_x11.c
512+++ b/src/x11/va_x11.c
513@@ -31,6 +31,7 @@
514 #include "va_dri2.h"
515 #include "va_dricommon.h"
516 #include "va_nvctrl.h"
517+#include "libdrm_glue.h"
518 #include <stdio.h>
519 #include <stdarg.h>
520 #include <string.h>
521@@ -94,6 +75,8 @@ static void va_DisplayContextDestroy (
522 }
523 ctx = &((*ctx)->pNext);
524 }
525+
526+ libdrm_close();
527 free(pDisplayContext->pDriverContext->dri_state);
528 free(pDisplayContext->pDriverContext);
529 free(pDisplayContext);
530diff --git a/src/Makefile.am b/src/Makefile.am
531index e50a15f..d1f8f70 100644
532--- a/src/Makefile.am
533+++ b/src/Makefile.am
534@@ -45,7 +45,7 @@ libva_la_LDFLAGS = $(LDADD) -no-undefined
535 libva_la_LIBADD = $(LIBVA_LIBS) -ldl
536
537 libva_x11_la_SOURCES =
538-libva_x11_la_LIBADD = $(libvacorelib) x11/libva_x11.la $(LIBVA_LIBS) $(X11_LIBS) $(XEXT_LIBS) $(DRM_LIBS) $(XFIXES_LIBS)
539+libva_x11_la_LIBADD = $(libvacorelib) x11/libva_x11.la $(LIBVA_LIBS) $(X11_LIBS) $(XEXT_LIBS) $(XFIXES_LIBS) -ldl
540 libva_x11_la_LDFLAGS = $(LDADD)
541 libva_x11_la_DEPENDENCIES = $(libvacorelib) x11/libva_x11.la
542
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/204_check_ATIFGLEXTENSION.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/204_check_ATIFGLEXTENSION.patch
deleted file mode 100644
index 02920a89..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/204_check_ATIFGLEXTENSION.patch
+++ /dev/null
@@ -1,312 +0,0 @@
1commit d91645f8b37aa43bafa76da3146dcdc9c17963ff
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Fri Nov 20 15:51:22 2009 +0000
4
5 Fix detection of fglrx.
6
7diff --git a/src/x11/Makefile.am b/src/x11/Makefile.am
8index b6916f2..0b61c33 100644
9--- a/src/x11/Makefile.am
10+++ b/src/x11/Makefile.am
11@@ -25,6 +25,23 @@ noinst_LTLIBRARIES = libva_x11.la
12 libva_x11includedir = ${includedir}/va
13 libva_x11include_HEADERS = va_x11.h va_dri.h va_dri2.h va_dricommon.h
14
15-libva_x11_la_SOURCES = va_x11.c va_dri.c va_dri2.c va_dricommon.c dri2_util.c dri1_util.c va_nvctrl.c libdrm_glue.c
16+libva_x11_la_SOURCES = \
17+ dri1_util.c \
18+ dri2_util.c \
19+ libdrm_glue.c \
20+ va_dri.c \
21+ va_dri2.c \
22+ va_dricommon.c \
23+ va_fglext.c \
24+ va_nvctrl.c \
25+ va_x11.c \
26+ $(NULL)
27
28-EXTRA_DIST = va_dristr.h va_dri2str.h va_dri2tokens.h va_nvctrl.h libdrm_glue.h
29+EXTRA_DIST = \
30+ libdrm_glue.h \
31+ va_dri2str.h \
32+ va_dri2tokens.h \
33+ va_dristr.h \
34+ va_fglext.h \
35+ va_nvctrl.h \
36+ $(NULL)
37diff --git a/src/x11/va_fglext.c b/src/x11/va_fglext.c
38new file mode 100644
39index 0000000..bc58e8b
40--- /dev/null
41+++ b/src/x11/va_fglext.c
42@@ -0,0 +1,175 @@
43+/*
44+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
45+ *
46+ * Permission is hereby granted, free of charge, to any person obtaining a
47+ * copy of this software and associated documentation files (the
48+ * "Software"), to deal in the Software without restriction, including
49+ * without limitation the rights to use, copy, modify, merge, publish,
50+ * distribute, sub license, and/or sell copies of the Software, and to
51+ * permit persons to whom the Software is furnished to do so, subject to
52+ * the following conditions:
53+ *
54+ * The above copyright notice and this permission notice (including the
55+ * next paragraph) shall be included in all copies or substantial portions
56+ * of the Software.
57+ *
58+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
59+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
61+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
62+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
63+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
64+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
65+ */
66+
67+#define _GNU_SOURCE 1
68+#include <string.h>
69+
70+#define NEED_REPLIES
71+#include <stdlib.h>
72+#include <X11/Xlibint.h>
73+#include <X11/Xutil.h>
74+#include <X11/extensions/Xext.h>
75+#include <X11/extensions/extutil.h>
76+#include "va_fglext.h"
77+
78+#define ATIFGL_EXTENSION_NAME "ATIFGLEXTENSION"
79+#define ATIFGL_EXTENSION_EVENTS 0
80+
81+typedef struct _FGLGetDriverData {
82+ CARD8 reqType;
83+ CARD8 fireglReqType;
84+ CARD16 length B16;
85+ CARD32 screen B32;
86+ CARD16 size B16;
87+ CARD16 pad1;
88+} xFGLGetDriverDataReq;
89+#define sz_xFGLGetDriverDataReq sizeof(xFGLGetDriverDataReq)
90+
91+typedef struct {
92+ BYTE type;
93+ BYTE pad1;
94+ CARD16 sequenceNumber B16;
95+ CARD32 length B32;
96+ CARD8 majorVersion;
97+ CARD8 minorVersion;
98+ CARD8 patchlevel B16;
99+ CARD8 BIOSVersionMajor;
100+ CARD8 BIOSVersionMinor;
101+ CARD8 HasSecondary;
102+ CARD16 pad3 B16;
103+ CARD32 pad4 B32;
104+ CARD32 pad5 B32;
105+ CARD32 pad6 B32;
106+ CARD32 pad7 B32;
107+ // ... there are more fields
108+} xFGLGetDriverDataReply;
109+#define sz_xFGLGetDriverDataReply sizeof(xFGLGetDriverDataReply)
110+
111+#define X_FGLGetDriverData 0
112+
113+static XExtensionInfo _fglext_ext_info_data;
114+static XExtensionInfo *fglext_ext_info = &_fglext_ext_info_data;
115+static /* const */ char *fglext_extension_name = ATIFGL_EXTENSION_NAME;
116+
117+#define xFGLCheckExtension(dpy,i,val) \
118+ XextCheckExtension (dpy, i, fglext_extension_name, val)
119+
120+static int close_display();
121+static /* const */ XExtensionHooks fglext_extension_hooks = {
122+ NULL, /* create_gc */
123+ NULL, /* copy_gc */
124+ NULL, /* flush_gc */
125+ NULL, /* free_gc */
126+ NULL, /* create_font */
127+ NULL, /* free_font */
128+ close_display, /* close_display */
129+ NULL, /* wire_to_event */
130+ NULL, /* event_to_wire */
131+ NULL, /* error */
132+ NULL, /* error_string */
133+};
134+
135+static XEXT_GENERATE_FIND_DISPLAY (find_display, fglext_ext_info,
136+ fglext_extension_name,
137+ &fglext_extension_hooks,
138+ ATIFGL_EXTENSION_EVENTS, NULL)
139+
140+static XEXT_GENERATE_CLOSE_DISPLAY (close_display, fglext_ext_info)
141+
142+Bool VA_FGLEXTQueryDirectRenderingCapable( Display *dpy, int screen,
143+ Bool *isCapable )
144+{
145+ char **extensions;
146+ int i, n_extensions, has_fglext = 0, has_fglrxdri = 0;
147+
148+ if (isCapable)
149+ *isCapable = False;
150+
151+ extensions = XListExtensions(dpy, &n_extensions);
152+ if (!extensions)
153+ return False;
154+
155+ for (i = 0; i < n_extensions; i++) {
156+ if (strcmp(extensions[i], ATIFGL_EXTENSION_NAME) == 0)
157+ has_fglext = 1;
158+ if (strcmp(extensions[i], "ATIFGLRXDRI") == 0)
159+ has_fglrxdri = 1;
160+ }
161+ XFreeExtensionList(extensions);
162+
163+ if (!has_fglext)
164+ return False;
165+
166+ if (isCapable)
167+ *isCapable = has_fglrxdri;
168+
169+ return True;
170+}
171+
172+Bool VA_FGLEXTGetClientDriverName( Display *dpy, int screen,
173+ int *ddxDriverMajorVersion, int *ddxDriverMinorVersion,
174+ int *ddxDriverPatchVersion, char **clientDriverName )
175+{
176+ XExtDisplayInfo *info = find_display (dpy);
177+ xFGLGetDriverDataReply rep;
178+ xFGLGetDriverDataReq *req;
179+
180+ if (ddxDriverMajorVersion)
181+ *ddxDriverMajorVersion = 0;
182+ if (ddxDriverMinorVersion)
183+ *ddxDriverMinorVersion = 0;
184+ if (ddxDriverPatchVersion)
185+ *ddxDriverPatchVersion = 0;
186+ if (clientDriverName)
187+ *clientDriverName = NULL;
188+
189+ if(!XextHasExtension(info))
190+ return False;
191+
192+ xFGLCheckExtension (dpy, info, False);
193+
194+ LockDisplay (dpy);
195+ GetReq (FGLGetDriverData, req);
196+ req->reqType = info->codes->major_opcode;
197+ req->fireglReqType = X_FGLGetDriverData;
198+ req->screen = screen;
199+ if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
200+ UnlockDisplay (dpy);
201+ SyncHandle ();
202+ return False;
203+ }
204+ UnlockDisplay (dpy);
205+ SyncHandle ();
206+
207+ if (ddxDriverMajorVersion)
208+ *ddxDriverMajorVersion = rep.majorVersion;
209+ if (ddxDriverMinorVersion)
210+ *ddxDriverMinorVersion = rep.minorVersion;
211+ if (ddxDriverPatchVersion)
212+ *ddxDriverPatchVersion = rep.patchlevel;
213+ if (clientDriverName)
214+ *clientDriverName = strdup("fglrx");
215+
216+ return True;
217+}
218diff --git a/src/x11/va_fglext.h b/src/x11/va_fglext.h
219new file mode 100644
220index 0000000..f2d87c3
221--- /dev/null
222+++ b/src/x11/va_fglext.h
223@@ -0,0 +1,37 @@
224+/*
225+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
226+ *
227+ * Permission is hereby granted, free of charge, to any person obtaining a
228+ * copy of this software and associated documentation files (the
229+ * "Software"), to deal in the Software without restriction, including
230+ * without limitation the rights to use, copy, modify, merge, publish,
231+ * distribute, sub license, and/or sell copies of the Software, and to
232+ * permit persons to whom the Software is furnished to do so, subject to
233+ * the following conditions:
234+ *
235+ * The above copyright notice and this permission notice (including the
236+ * next paragraph) shall be included in all copies or substantial portions
237+ * of the Software.
238+ *
239+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
240+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
241+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
242+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
243+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
244+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
245+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
246+ */
247+
248+#ifndef VA_FGLEXTLIB_H
249+#define VA_FGLEXTLIB_H
250+
251+#include <X11/Xlib.h>
252+
253+Bool VA_FGLEXTQueryDirectRenderingCapable( Display *dpy, int screen,
254+ Bool *isCapable );
255+
256+Bool VA_FGLEXTGetClientDriverName( Display *dpy, int screen,
257+ int *ddxDriverMajorVersion, int *ddxDriverMinorVersion,
258+ int *ddxDriverPatchVersion, char **clientDriverName );
259+
260+#endif /* VA_FGLEXTLIB_H */
261diff --git a/src/x11/va_x11.c b/src/x11/va_x11.c
262index 414c261..0510e00 100644
263--- a/src/x11/va_x11.c
264+++ b/src/x11/va_x11.c
265@@ -31,6 +31,7 @@
266 #include "va_dri2.h"
267 #include "va_dricommon.h"
268 #include "va_nvctrl.h"
269+#include "va_fglext.h"
270 #include "libdrm_glue.h"
271 #include <stdio.h>
272 #include <stdarg.h>
273@@ -132,6 +133,29 @@ static VAStatus va_NVCTRL_GetDriverName (
274 return VA_STATUS_SUCCESS;
275 }
276
277+static VAStatus va_FGLEXT_GetDriverName(
278+ VADisplayContextP pDisplayContext,
279+ char **driver_name
280+)
281+{
282+ VADriverContextP ctx = pDisplayContext->pDriverContext;
283+ int direct_capable, driver_major, driver_minor, driver_patch;
284+ Bool result;
285+
286+ result = VA_FGLEXTQueryDirectRenderingCapable(ctx->x11_dpy, ctx->x11_screen,
287+ &direct_capable);
288+ if (!result || !direct_capable)
289+ return VA_STATUS_ERROR_UNKNOWN;
290+
291+ result = VA_FGLEXTGetClientDriverName(ctx->x11_dpy, ctx->x11_screen,
292+ &driver_major, &driver_minor,
293+ &driver_patch, driver_name);
294+ if (!result)
295+ return VA_STATUS_ERROR_UNKNOWN;
296+
297+ return VA_STATUS_SUCCESS;
298+}
299+
300 static VAStatus va_DisplayContextGetDriverName (
301 VADisplayContextP pDisplayContext,
302 char **driver_name
303@@ -156,7 +180,8 @@ static VAStatus va_DisplayContextGetDriverName (
304 vaStatus = va_DRIGetDriverName(pDisplayContext, driver_name);
305 if (vaStatus != VA_STATUS_SUCCESS)
306 vaStatus = va_NVCTRL_GetDriverName(pDisplayContext, driver_name);
307-
308+ if (vaStatus != VA_STATUS_SUCCESS)
309+ vaStatus = va_FGLEXT_GetDriverName(pDisplayContext, driver_name);
310 return vaStatus;
311 }
312
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/300_sds_version.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/300_sds_version.patch
deleted file mode 100644
index 07531c90..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/300_sds_version.patch
+++ /dev/null
@@ -1,87 +0,0 @@
1commit 890acc1975ed9f6b7173ff6fbf9d689943590913
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Wed Jun 24 11:32:40 2009 +0000
4
5 Explicit API extensions from SDS.
6
7diff --git a/configure.ac b/configure.ac
8index 3999dc4..17b0403 100644
9--- a/configure.ac
10+++ b/configure.ac
11@@ -28,6 +28,9 @@ m4_define([libva_micro_version], [0])
12 m4_define([libva_version],
13 [libva_major_version.libva_minor_version.libva_micro_version])
14
15+# increase this number for each API change
16+m4_define([libva_sds_version], [4])
17+
18 # if the library source code has changed, increment revision
19 m4_define([libva_lt_revision], [0])
20 # if any interface was added/removed/changed, then inc current, reset revision
21@@ -52,11 +55,14 @@ AC_SUBST(LIBVA_MINOR_VERSION)
22 AC_SUBST(LIBVA_MICRO_VERSION)
23 AC_SUBST(LIBVA_VERSION)
24
25+LIBVA_SDS_VERSION=libva_sds_version
26+AC_SUBST(LIBVA_SDS_VERSION)
27+
28 LIBVA_LT_CURRENT=libva_lt_current
29 LIBVA_LT_REV=libva_lt_revision
30 LIBVA_LT_AGE=libva_lt_age
31 LIBVA_LT_VERSION="$LIBVA_LT_CURRENT:$LIBVA_LT_REV:$LIBVA_LT_AGE"
32-LIBVA_LT_LDFLAGS="-version-info $LIBVA_LT_VERSION"
33+LIBVA_LT_LDFLAGS="-version-info $LIBVA_LT_VERSION -release $LIBVA_VERSION.$LIBVA_SDS_VERSION"
34 AC_SUBST(LIBVA_LT_VERSION)
35 AC_SUBST(LIBVA_LT_LDFLAGS)
36
37diff --git a/src/va.c b/src/va.c
38index f9791f8..b60ac12 100644
39--- a/src/va.c
40+++ b/src/va.c
41@@ -35,6 +35,7 @@
42 #include <linux/videodev2.h>
43
44 #define DRIVER_INIT_FUNC "__vaDriverInit_0_31"
45+#define DRIVER_INIT_FUNC_SDS "__vaDriverInit_0_31_sds"
46
47 #define DRIVER_EXTENSION "_drv_video.so"
48
49@@ -160,6 +161,11 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
50 init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC);
51 if (!init_func)
52 {
53+ /* Then try SDS extensions (VDPAU and XvBA backends) */
54+ init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC_SDS);
55+ }
56+ if (!init_func)
57+ {
58 va_errorMessage("%s has no function %s\n", driver_path, DRIVER_INIT_FUNC);
59 dlclose(handle);
60 }
61diff --git a/src/va_version.h.in b/src/va_version.h.in
62index c9ea97a..197c482 100644
63--- a/src/va_version.h.in
64+++ b/src/va_version.h.in
65@@ -47,6 +47,13 @@
66 #define VA_MICRO_VERSION (@LIBVA_MICRO_VERSION@)
67
68 /**
69+ * VA_SDS_VERSION:
70+ *
71+ * The version of the SDS API extensions to the VA library
72+ */
73+#define VA_SDS_VERSION (@LIBVA_SDS_VERSION@)
74+
75+/**
76 * VA_VERSION:
77 *
78 * The full version of the VA library, like 1.2.3
79@@ -59,7 +66,7 @@
80 * The full version of the VA library, in string form (suited for
81 * string concatenation)
82 */
83-#define VA_VERSION_S "@LIBVA_VERSION@"
84+#define VA_VERSION_S "@LIBVA_VERSION@-sds@LIBVA_SDS_VERSION@"
85
86 /**
87 * VA_VERSION_HEX:
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/301_vdpau_mpeg4.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/301_vdpau_mpeg4.patch
deleted file mode 100644
index 86188902..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/301_vdpau_mpeg4.patch
+++ /dev/null
@@ -1,26 +0,0 @@
1commit 3c2d45290e1369083a27d53a5f94276c82512974
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Mon Nov 23 12:21:24 2009 +0000
4
5 Add extra picture info fields for VDPAU/MPEG-4.
6
7diff --git a/src/va.h b/src/va.h
8index fa34850..f89a5cb 100755
9--- a/src/va.h
10+++ b/src/va.h
11@@ -672,6 +672,7 @@ typedef struct _VAPictureParameterBufferMPEG4
12 unsigned int quarter_sample : 1;
13 unsigned int data_partitioned : 1;
14 unsigned int reversible_vlc : 1;
15+ unsigned int resync_marker_disable : 1;
16 } bits;
17 unsigned int value;
18 } vol_fields;
19@@ -692,6 +693,7 @@ typedef struct _VAPictureParameterBufferMPEG4
20 } vop_fields;
21 unsigned char vop_fcode_forward;
22 unsigned char vop_fcode_backward;
23+ unsigned short vop_time_increment_resolution;
24 /* short header related */
25 unsigned char num_gobs_in_vop;
26 unsigned char num_macroblocks_in_gob;
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/320_move_vaPutSurface_flags_def.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/320_move_vaPutSurface_flags_def.patch
deleted file mode 100644
index f00c52ca..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/320_move_vaPutSurface_flags_def.patch
+++ /dev/null
@@ -1,60 +0,0 @@
1commit c682fb5ebd1964638f90590f66edf49629e7481d
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Fri Aug 21 11:34:50 2009 +0000
4
5 Move vaPutSurface() flags to <va/va.h> header.
6
7diff --git a/src/va.h b/src/va.h
8index 0519f6f..6b4bbd4 100755
9--- a/src/va.h
10+++ b/src/va.h
11@@ -127,6 +127,22 @@ typedef int VAStatus; /* Return status type from functions */
12 #define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013
13 #define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF
14
15+/* De-interlacing flags for vaPutSurface() */
16+#define VA_FRAME_PICTURE 0x00000000
17+#define VA_TOP_FIELD 0x00000001
18+#define VA_BOTTOM_FIELD 0x00000002
19+
20+/*
21+ * Clears the drawable with background color.
22+ * for hardware overlay based implementation this flag
23+ * can be used to turn off the overlay
24+ */
25+#define VA_CLEAR_DRAWABLE 0x00000008
26+
27+/* Color space conversion flags for vaPutSurface() */
28+#define VA_SRC_BT601 0x00000010
29+#define VA_SRC_BT709 0x00000020
30+
31 /*
32 * Returns a short english description of error_status
33 */
34diff --git a/src/x11/va_x11.h b/src/x11/va_x11.h
35index 2171ac6..5ab5200 100644
36--- a/src/x11/va_x11.h
37+++ b/src/x11/va_x11.h
38@@ -27,22 +27,6 @@ VADisplay vaGetDisplay (
39 * color space conversion and scaling to the destination
40 * rectangle
41 */
42-/* de-interlacing flags for vaPutSurface */
43-#define VA_FRAME_PICTURE 0x00000000
44-#define VA_TOP_FIELD 0x00000001
45-#define VA_BOTTOM_FIELD 0x00000002
46-
47-/*
48- * clears the drawable with background color.
49- * for hardware overlay based implementation this flag
50- * can be used to turn off the overlay
51- */
52-#define VA_CLEAR_DRAWABLE 0x00000008
53-
54-/* color space conversion flags for vaPutSurface */
55-#define VA_SRC_BT601 0x00000010
56-#define VA_SRC_BT709 0x00000020
57-
58 VAStatus vaPutSurface (
59 VADisplay dpy,
60 VASurfaceID surface,
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/321_libva_glx.base.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/321_libva_glx.base.patch
deleted file mode 100644
index 43af6f40..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/321_libva_glx.base.patch
+++ /dev/null
@@ -1,212 +0,0 @@
1commit f0b352251894becfcec50de1430bda12c314a464
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Tue Sep 22 13:00:34 2009 +0000
4
5 Fix libva-glx pkgconfig dependencies.
6
7commit df0953a951d8a2e5e4b0a28a95ae0f1ac735726e
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Tue Sep 8 12:25:14 2009 +0000
10
11 Add generic VA/GLX implementation with TFP and FBO.
12
13commit f640b1cf9eab4e5d478239b608ed0d8b68f6c5f6
14Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
15Date: Tue Sep 8 12:15:35 2009 +0000
16
17 Move GLX VTable to a new file.
18
19commit 70d9cb6d1aa2fc2dde6646f3b692433e0d93d431
20Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
21Date: Fri Aug 28 11:15:51 2009 +0000
22
23 Add OpenGL extensions (v3).
24
25diff --git a/Makefile.am b/Makefile.am
26index 07385e6..6fb4cae 100644
27--- a/Makefile.am
28+++ b/Makefile.am
29@@ -32,10 +32,13 @@ endif
30
31 pcfiles = libva.pc
32 pcfiles += libva-x11.pc
33+if USE_GLX
34+pcfiles += libva-glx.pc
35+endif
36
37 pkgconfigdir = @pkgconfigdir@
38 pkgconfig_DATA = $(pcfiles)
39
40-EXTRA_DIST = libva.pc.in libva-x11.pc.in
41+EXTRA_DIST = libva.pc.in libva-x11.pc.in libva-glx.pc.in
42
43 CLEANFILES = $(pcfiles)
44diff --git a/configure.ac b/configure.ac
45index c3aba90..abef435 100644
46--- a/configure.ac
47+++ b/configure.ac
48@@ -52,6 +55,11 @@ AC_SUBST(LIBVA_MINOR_VERSION)
49 AC_SUBST(LIBVA_LT_VERSION)
50 AC_SUBST(LIBVA_LT_LDFLAGS)
51
52+AC_ARG_ENABLE(glx,
53+ [AC_HELP_STRING([--enable-glx],
54+ [build with OpenGL for X11 support])],
55+ [], [enable_glx=yes])
56+
57 AC_ARG_ENABLE(dummy-driver,
58 [AC_HELP_STRING([--enable-dummy-driver],
59 [build dummy video driver])],
60@@ -100,6 +132,23 @@ if test x$enable_i965_driver = xyes && ! $PKG_CONFIG --atleast-version=2.4 libdr
61 AC_DEFINE_UNQUOTED([ATTRIBUTE_HIDDEN], [$ATTRIBUTE_HIDDEN],
62 [Defined to __attribute__((visibility("hidden"))) when available])
63
64+# Check for OpenGL (X11)
65+USE_GLX="no"
66+GL_DEPS_CFLAGS=""
67+GL_DEPS_LIBS=""
68+
69+if test x$enable_glx = xyes; then
70+ AC_CHECK_HEADERS([GL/gl.h])
71+ AC_CHECK_HEADERS([GL/glx.h])
72+ AC_CHECK_LIB(GL, glXCreateContext, [
73+ USE_GLX="yes"
74+ GL_DEPS_LIBS="-lX11 -lGL"
75+ ])
76+fi
77+AC_SUBST(GL_DEPS_CFLAGS)
78+AC_SUBST(GL_DEPS_LIBS)
79+AM_CONDITIONAL(USE_GLX, test "$USE_GLX" = "yes")
80+
81 # We only need the headers, we don't link against the DRM libraries
82 LIBVA_CFLAGS="$DRM_CFLAGS"
83 AC_SUBST(LIBVA_CFLAGS)
84@@ -119,6 +192,7 @@ AC_OUTPUT([
85 src/Makefile
86 src/va_version.h
87 src/x11/Makefile
88+ src/glx/Makefile
89 dummy_drv_video/Makefile
90 i965_drv_video/Makefile
91 i965_drv_video/shaders/Makefile
92@@ -128,5 +202,6 @@ AC_OUTPUT([
93 test/Makefile
94 libva.pc
95 libva-x11.pc
96+ libva-glx.pc
97 ])
98
99diff --git a/libva-glx.pc.in b/libva-glx.pc.in
100new file mode 100644
101index 0000000..20ba20a
102--- /dev/null
103+++ b/libva-glx.pc.in
104@@ -0,0 +1,12 @@
105+prefix=@prefix@
106+exec_prefix=@exec_prefix@
107+libdir=@libdir@
108+includedir=@includedir@
109+display=glx
110+
111+Name: libva-${display}
112+Description: Userspace Video Acceleration (VA) ${display} interface
113+Requires: libva
114+Version: @PACKAGE_VERSION@
115+Libs: -L${libdir} -lva-${display}
116+Cflags: -I${includedir}
117diff --git a/src/Makefile.am b/src/Makefile.am
118index 2f4210a..e50a15f 100644
119--- a/src/Makefile.am
120+++ b/src/Makefile.am
121@@ -28,9 +28,17 @@ INCLUDES = \
122 LDADD = \
123 $(LIBVA_LT_LDFLAGS)
124
125-lib_LTLIBRARIES = \
126- libva.la \
127- libva-x11.la
128+libva_x11_backend = libva-x11.la
129+libva_x11_backenddir = x11
130+if USE_GLX
131+libva_glx_backend = libva-glx.la
132+libva_glx_backenddir = glx
133+else
134+libva_glx_backend =
135+libva_glx_backenddir =
136+endif
137+
138+lib_LTLIBRARIES = libva.la $(libva_x11_backend) $(libva_glx_backend)
139
140 libva_ladir = $(libdir)
141 libva_la_LDFLAGS = $(LDADD) -no-undefined
142@@ -41,7 +49,14 @@ libva_x11_la_LIBADD = $(libvacorelib) x11/libva_x11.la $(LIBVA_LIBS) $(X11_LIBS
143 libva_x11_la_LDFLAGS = $(LDADD)
144 libva_x11_la_DEPENDENCIES = $(libvacorelib) x11/libva_x11.la
145
146-SUBDIRS = x11
147+libva_glx_la_SOURCES =
148+libva_glx_la_LIBADD = $(libvacorelib) glx/libva_glx.la libva-x11.la $(GL_DEPS_LIBS) -ldl
149+libva_glx_la_LDFLAGS = $(LDADD)
150+libva_glx_la_DEPENDENCIES = $(libvacorelib) glx/libva_glx.la libva-x11.la
151+
152+SUBDIRS = $(libva_x11_backenddir) $(libva_glx_backenddir)
153+
154+DIST_SUBDIRS = x11 glx
155
156 libva_la_SOURCES = va.c
157
158diff --git a/src/va_backend.h b/src/va_backend.h
159index 6f858f5..8f722a3 100644
160--- a/src/va_backend.h
161+++ b/src/va_backend.h
162@@ -32,9 +32,11 @@
163 #ifdef IN_LIBVA
164 #include "va.h"
165 #include "x11/va_x11.h"
166+#include "glx/va_backend_glx.h"
167 #else
168 #include <va/va.h>
169 #include <va/va_x11.h>
170+#include <va/va_backend_glx.h>
171 #endif
172
173 #include <stdlib.h>
174@@ -372,6 +374,9 @@ struct VADriverVTable
175 unsigned int *chroma_v_offset,
176 void **buffer
177 );
178+
179+ /* Optional: GLX support hooks */
180+ struct VADriverVTableGLX glx;
181 };
182
183 struct VADriverContext
184@@ -394,6 +399,7 @@ struct VADriverContext
185 void *handle; /* dlopen handle */
186
187 void *dri_state;
188+ void *glx; /* opaque for GLX code */
189 };
190
191 struct VADisplayContext
192@@ -413,6 +420,8 @@ struct VADisplayContext
193 VADisplayContextP ctx,
194 char **driver_name
195 );
196+
197+ void *opaque; /* opaque for display extensions (e.g. GLX) */
198 };
199
200 typedef VAStatus (*VADriverInit) (
201diff --git a/src/x11/va_x11.c b/src/x11/va_x11.c
202index 9de904e..b8c60fa 100644
203--- a/src/x11/va_x11.c
204+++ b/src/x11/va_x11.c
205@@ -243,6 +243,7 @@ VADisplay vaGetDisplay (
206 pDisplayContext->vaIsValid = va_DisplayContextIsValid;
207 pDisplayContext->vaDestroy = va_DisplayContextDestroy;
208 pDisplayContext->vaGetDriverName = va_DisplayContextGetDriverName;
209+ pDisplayContext->opaque = NULL;
210 pDisplayContexts = pDisplayContext;
211 pDriverContext->dri_state = dri_state;
212 dpy = (VADisplay)pDisplayContext;
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/322_libva_glx.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/322_libva_glx.patch
deleted file mode 100644
index ccd9ae09..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/322_libva_glx.patch
+++ /dev/null
@@ -1,2024 +0,0 @@
1commit 8e76000abce070da5f1c902a6290f4ccaa3eccc8
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Fri Sep 18 15:51:08 2009 +0000
4
5 Add C++ guards.
6
7commit bf1ae22ef324fbb347f5369e1ba307e847553fe8
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Fri Sep 18 15:49:55 2009 +0000
10
11 Fix check for GL extensions.
12
13commit df0953a951d8a2e5e4b0a28a95ae0f1ac735726e
14Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
15Date: Tue Sep 8 12:25:14 2009 +0000
16
17 Add generic VA/GLX implementation with TFP and FBO.
18
19commit f640b1cf9eab4e5d478239b608ed0d8b68f6c5f6
20Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
21Date: Tue Sep 8 12:15:35 2009 +0000
22
23 Move GLX VTable to a new file.
24
25commit 70d9cb6d1aa2fc2dde6646f3b692433e0d93d431
26Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
27Date: Fri Aug 28 11:15:51 2009 +0000
28
29 Add OpenGL extensions (v3).
30
31diff --git a/src/glx/Makefile.am b/src/glx/Makefile.am
32new file mode 100644
33index 0000000..7783d8c
34--- /dev/null
35+++ b/src/glx/Makefile.am
36@@ -0,0 +1,41 @@
37+# Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
38+#
39+# Permission is hereby granted, free of charge, to any person obtaining a
40+# copy of this software and associated documentation files (the
41+# "Software"), to deal in the Software without restriction, including
42+# without limitation the rights to use, copy, modify, merge, publish,
43+# distribute, sub license, and/or sell copies of the Software, and to
44+# permit persons to whom the Software is furnished to do so, subject to
45+# the following conditions:
46+#
47+# The above copyright notice and this permission notice (including the
48+# next paragraph) shall be included in all copies or substantial portions
49+# of the Software.
50+#
51+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
52+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
54+# IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
55+# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
56+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
57+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
58+
59+AM_CFLAGS = -DLINUX -DIN_LIBVA -I$(top_srcdir)/src -I$(top_srcdir)/src/x11
60+
61+source_c = \
62+ va_glx.c \
63+ va_glx_impl.c
64+
65+source_h = \
66+ va_glx.h \
67+ va_backend_glx.h
68+
69+source_h_priv = \
70+ va_glx_impl.h \
71+ va_glx_private.h
72+
73+noinst_LTLIBRARIES = libva_glx.la
74+libva_glxincludedir = ${includedir}/va
75+libva_glxinclude_HEADERS = $(source_h)
76+libva_glx_la_SOURCES = $(source_c)
77+noinst_HEADERS = $(source_h_priv)
78diff --git a/src/glx/va_backend_glx.h b/src/glx/va_backend_glx.h
79new file mode 100644
80index 0000000..3885d30
81--- /dev/null
82+++ b/src/glx/va_backend_glx.h
83@@ -0,0 +1,87 @@
84+/*
85+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
86+ *
87+ * Permission is hereby granted, free of charge, to any person obtaining a
88+ * copy of this software and associated documentation files (the
89+ * "Software"), to deal in the Software without restriction, including
90+ * without limitation the rights to use, copy, modify, merge, publish,
91+ * distribute, sub license, and/or sell copies of the Software, and to
92+ * permit persons to whom the Software is furnished to do so, subject to
93+ * the following conditions:
94+ *
95+ * The above copyright notice and this permission notice (including the
96+ * next paragraph) shall be included in all copies or substantial portions
97+ * of the Software.
98+ *
99+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
100+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
101+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
102+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
103+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
104+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
105+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
106+ */
107+
108+#ifndef VA_BACKEND_GLX_H
109+#define VA_BACKEND_GLX_H
110+
111+struct VADriverContext;
112+
113+struct VADriverVTableGLX {
114+ /* Optional: create a surface used for display to OpenGL */
115+ VAStatus (*vaCreateSurfaceGLX)(
116+ struct VADriverContext *ctx,
117+ unsigned int gl_target,
118+ unsigned int gl_texture,
119+ void **gl_surface
120+ );
121+
122+ /* Optional: destroy a VA/GLX surface */
123+ VAStatus (*vaDestroySurfaceGLX)(
124+ struct VADriverContext *ctx,
125+ void *gl_surface
126+ );
127+
128+ /* Optional: associate a VA surface to a VA/GLX surface */
129+ VAStatus (*vaAssociateSurfaceGLX)(
130+ struct VADriverContext *ctx,
131+ void *gl_surface,
132+ VASurfaceID surface,
133+ unsigned int flags
134+ );
135+
136+ /* Optional: deassociate a VA surface from a VA/GLX surface */
137+ VAStatus (*vaDeassociateSurfaceGLX)(
138+ struct VADriverContext *ctx,
139+ void *gl_surface
140+ );
141+
142+ /* Optional: synchronize a VA/GLX surface */
143+ VAStatus (*vaSyncSurfaceGLX)(
144+ struct VADriverContext *ctx,
145+ void *gl_surface
146+ );
147+
148+ /* Optional: prepare VA/GLX surface for rendering */
149+ VAStatus (*vaBeginRenderSurfaceGLX)(
150+ struct VADriverContext *ctx,
151+ void *gl_surface
152+ );
153+
154+ /* Optional: notify the server that the VA/GLX surface is no
155+ longer used for rendering */
156+ VAStatus (*vaEndRenderSurfaceGLX)(
157+ struct VADriverContext *ctx,
158+ void *gl_surface
159+ );
160+
161+ /* Optional: copy a VA surface to a VA/GLX surface */
162+ VAStatus (*vaCopySurfaceGLX)(
163+ struct VADriverContext *ctx,
164+ void *gl_surface,
165+ VASurfaceID surface,
166+ unsigned int flags
167+ );
168+};
169+
170+#endif /* VA_BACKEND_GLX_H */
171diff --git a/src/glx/va_glx.c b/src/glx/va_glx.c
172new file mode 100644
173index 0000000..f6ec2c3
174--- /dev/null
175+++ b/src/glx/va_glx.c
176@@ -0,0 +1,295 @@
177+/*
178+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
179+ *
180+ * Permission is hereby granted, free of charge, to any person obtaining a
181+ * copy of this software and associated documentation files (the
182+ * "Software"), to deal in the Software without restriction, including
183+ * without limitation the rights to use, copy, modify, merge, publish,
184+ * distribute, sub license, and/or sell copies of the Software, and to
185+ * permit persons to whom the Software is furnished to do so, subject to
186+ * the following conditions:
187+ *
188+ * The above copyright notice and this permission notice (including the
189+ * next paragraph) shall be included in all copies or substantial portions
190+ * of the Software.
191+ *
192+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
194+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
195+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
196+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
197+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
198+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
199+ */
200+
201+#include "va_glx_private.h"
202+#include "va_glx_impl.h"
203+
204+#define INIT_CONTEXT(ctx, dpy) do { \
205+ if (!vaDisplayIsValid(dpy)) \
206+ return VA_STATUS_ERROR_INVALID_DISPLAY; \
207+ \
208+ ctx = ((VADisplayContextP)(dpy))->pDriverContext; \
209+ if (!(ctx)) \
210+ return VA_STATUS_ERROR_INVALID_DISPLAY; \
211+ \
212+ VAStatus status = va_glx_init_context(ctx); \
213+ if (status != VA_STATUS_SUCCESS) \
214+ return status; \
215+ } while (0)
216+
217+#define INIT_SURFACE(surface, surface_arg) do { \
218+ surface = (VASurfaceGLXP)(surface_arg); \
219+ if (!vaSurfaceIsValid(surface)) \
220+ return VA_STATUS_ERROR_INVALID_SURFACE; \
221+ } while (0)
222+
223+#define INVOKE(ctx, func, args) do { \
224+ VADriverVTableGLXP vtable; \
225+ vtable = &VA_DRIVER_CONTEXT_GLX(ctx)->vtable; \
226+ if (!vtable->va##func##GLX) \
227+ return VA_STATUS_ERROR_UNIMPLEMENTED; \
228+ status = vtable->va##func##GLX args; \
229+ } while (0)
230+
231+// Check VADisplay is valid
232+static inline int vaDisplayIsValid(VADisplay dpy)
233+{
234+ VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
235+
236+ return (pDisplayContext &&
237+ pDisplayContext->vaIsValid &&
238+ pDisplayContext->vaIsValid(pDisplayContext));
239+}
240+
241+// Check VASurfaceGLX is valid
242+static inline int vaSurfaceIsValid(VASurfaceGLXP pSurfaceGLX)
243+{
244+ return pSurfaceGLX && pSurfaceGLX->magic == VA_SURFACE_GLX_MAGIC;
245+}
246+
247+// Destroy VA/GLX display context
248+static void va_DisplayContextDestroy(VADisplayContextP pDisplayContext)
249+{
250+ VADisplayContextGLXP pDisplayContextGLX;
251+ VADriverContextP pDriverContext;
252+ VADriverContextGLXP pDriverContextGLX;
253+
254+ if (!pDisplayContext)
255+ return;
256+
257+ pDriverContext = pDisplayContext->pDriverContext;
258+ pDriverContextGLX = pDriverContext->glx;
259+ if (pDriverContextGLX) {
260+ free(pDriverContextGLX);
261+ pDriverContext->glx = NULL;
262+ }
263+
264+ pDisplayContextGLX = pDisplayContext->opaque;
265+ if (pDisplayContextGLX) {
266+ if (pDisplayContextGLX->vaDestroy)
267+ pDisplayContextGLX->vaDestroy(pDisplayContext);
268+ free(pDisplayContextGLX);
269+ pDisplayContext->opaque = NULL;
270+ }
271+}
272+
273+// Return a suitable VADisplay for VA API
274+VADisplay vaGetDisplayGLX(Display *native_dpy)
275+{
276+ VADisplay dpy = NULL;
277+ VADisplayContextP pDisplayContext = NULL;
278+ VADisplayContextGLXP pDisplayContextGLX = NULL;
279+ VADriverContextP pDriverContext;
280+ VADriverContextGLXP pDriverContextGLX = NULL;
281+
282+ dpy = vaGetDisplay(native_dpy);
283+ if (!dpy)
284+ return NULL;
285+ pDisplayContext = (VADisplayContextP)dpy;
286+ pDriverContext = pDisplayContext->pDriverContext;
287+
288+ pDisplayContextGLX = calloc(1, sizeof(*pDisplayContextGLX));
289+ if (!pDisplayContextGLX)
290+ goto error;
291+
292+ pDriverContextGLX = calloc(1, sizeof(*pDriverContextGLX));
293+ if (!pDriverContextGLX)
294+ goto error;
295+
296+ pDisplayContextGLX->vaDestroy = pDisplayContext->vaDestroy;
297+ pDisplayContext->vaDestroy = va_DisplayContextDestroy;
298+ pDisplayContext->opaque = pDisplayContextGLX;
299+ pDriverContext->glx = pDriverContextGLX;
300+ return dpy;
301+
302+error:
303+ free(pDriverContextGLX);
304+ free(pDisplayContextGLX);
305+ pDisplayContext->vaDestroy(pDisplayContext);
306+ return NULL;
307+}
308+
309+// Create a surface used for display to OpenGL
310+VAStatus vaCreateSurfaceGLX(
311+ VADisplay dpy,
312+ GLenum target,
313+ GLuint texture,
314+ void **gl_surface
315+)
316+{
317+ VADriverContextP ctx;
318+ VASurfaceGLXP pSurfaceGLX;
319+ VAStatus status;
320+
321+ /* Make sure it is a valid GL texture object */
322+ if (!glIsTexture(texture))
323+ return VA_STATUS_ERROR_INVALID_PARAMETER;
324+
325+ INIT_CONTEXT(ctx, dpy);
326+
327+ pSurfaceGLX = va_glx_create_surface(ctx, target, texture);
328+ if (!pSurfaceGLX)
329+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
330+
331+ INVOKE(ctx, CreateSurface, (ctx, target, texture, &pSurfaceGLX->priv));
332+
333+ if (status != VA_STATUS_SUCCESS)
334+ va_glx_destroy_surface(ctx, &pSurfaceGLX);
335+
336+ *gl_surface = pSurfaceGLX;
337+ return status;
338+}
339+
340+// Destroy a VA/GLX surface
341+VAStatus vaDestroySurfaceGLX(
342+ VADisplay dpy,
343+ void *gl_surface
344+)
345+{
346+ VADriverContextP ctx;
347+ VASurfaceGLXP pSurfaceGLX;
348+ VAStatus status;
349+
350+ INIT_CONTEXT(ctx, dpy);
351+ INIT_SURFACE(pSurfaceGLX, gl_surface);
352+
353+ INVOKE(ctx, DestroySurface, (ctx, pSurfaceGLX));
354+
355+ free(pSurfaceGLX);
356+ return status;
357+}
358+
359+// Associate a VA surface to a VA/GLX surface
360+VAStatus vaAssociateSurfaceGLX(
361+ VADisplay dpy,
362+ void *gl_surface,
363+ VASurfaceID surface,
364+ unsigned int flags
365+)
366+{
367+ VADriverContextP ctx;
368+ VASurfaceGLXP pSurfaceGLX;
369+ VAStatus status;
370+
371+ INIT_CONTEXT(ctx, dpy);
372+ INIT_SURFACE(pSurfaceGLX, gl_surface);
373+
374+ INVOKE(ctx, AssociateSurface, (ctx, pSurfaceGLX, surface, flags));
375+
376+ if (status == VA_STATUS_SUCCESS)
377+ pSurfaceGLX->surface = surface;
378+
379+ return status;
380+}
381+
382+// Deassociate a VA surface from a VA/GLX surface
383+VAStatus vaDeassociateSurfaceGLX(
384+ VADisplay dpy,
385+ void *gl_surface
386+)
387+{
388+ VADriverContextP ctx;
389+ VASurfaceGLXP pSurfaceGLX;
390+ VAStatus status;
391+
392+ INIT_CONTEXT(ctx, dpy);
393+ INIT_SURFACE(pSurfaceGLX, gl_surface);
394+
395+ INVOKE(ctx, DeassociateSurface, (ctx, pSurfaceGLX));
396+
397+ if (status == VA_STATUS_SUCCESS)
398+ pSurfaceGLX->surface = VA_INVALID_SURFACE;
399+
400+ return status;
401+}
402+
403+// Synchronize a VA/GLX surface
404+VAStatus vaSyncSurfaceGLX(
405+ VADisplay dpy,
406+ void *gl_surface
407+)
408+{
409+ VADriverContextP ctx;
410+ VASurfaceGLXP pSurfaceGLX;
411+ VAStatus status;
412+
413+ INIT_CONTEXT(ctx, dpy);
414+ INIT_SURFACE(pSurfaceGLX, gl_surface);
415+
416+ INVOKE(ctx, SyncSurface, (ctx, pSurfaceGLX));
417+ return status;
418+}
419+
420+// Prepare VA/GLX surface for rendering
421+VAStatus vaBeginRenderSurfaceGLX(
422+ VADisplay dpy,
423+ void *gl_surface
424+)
425+{
426+ VADriverContextP ctx;
427+ VASurfaceGLXP pSurfaceGLX;
428+ VAStatus status;
429+
430+ INIT_CONTEXT(ctx, dpy);
431+ INIT_SURFACE(pSurfaceGLX, gl_surface);
432+
433+ INVOKE(ctx, BeginRenderSurface, (ctx, pSurfaceGLX));
434+ return status;
435+}
436+
437+// Notify the server that the VA/GLX surface is no longer used for rendering
438+VAStatus vaEndRenderSurfaceGLX(
439+ VADisplay dpy,
440+ void *gl_surface
441+)
442+{
443+ VADriverContextP ctx;
444+ VASurfaceGLXP pSurfaceGLX;
445+ VAStatus status;
446+
447+ INIT_CONTEXT(ctx, dpy);
448+ INIT_SURFACE(pSurfaceGLX, gl_surface);
449+
450+ INVOKE(ctx, EndRenderSurface, (ctx, pSurfaceGLX));
451+ return status;
452+}
453+
454+// Copy a VA surface to a VA/GLX surface
455+VAStatus vaCopySurfaceGLX(
456+ VADisplay dpy,
457+ void *gl_surface,
458+ VASurfaceID surface,
459+ unsigned int flags
460+)
461+{
462+ VADriverContextP ctx;
463+ VASurfaceGLXP pSurfaceGLX;
464+ VAStatus status;
465+
466+ INIT_CONTEXT(ctx, dpy);
467+ INIT_SURFACE(pSurfaceGLX, gl_surface);
468+
469+ INVOKE(ctx, CopySurface, (ctx, pSurfaceGLX, surface, flags));
470+ return status;
471+}
472diff --git a/src/glx/va_glx.h b/src/glx/va_glx.h
473new file mode 100644
474index 0000000..183ef3a
475--- /dev/null
476+++ b/src/glx/va_glx.h
477@@ -0,0 +1,217 @@
478+/*
479+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
480+ *
481+ * Permission is hereby granted, free of charge, to any person obtaining a
482+ * copy of this software and associated documentation files (the
483+ * "Software"), to deal in the Software without restriction, including
484+ * without limitation the rights to use, copy, modify, merge, publish,
485+ * distribute, sub license, and/or sell copies of the Software, and to
486+ * permit persons to whom the Software is furnished to do so, subject to
487+ * the following conditions:
488+ *
489+ * The above copyright notice and this permission notice (including the
490+ * next paragraph) shall be included in all copies or substantial portions
491+ * of the Software.
492+ *
493+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
494+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
495+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
496+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
497+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
498+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
499+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
500+ */
501+
502+#ifndef VA_GLX_H
503+#define VA_GLX_H
504+
505+#ifdef IN_LIBVA
506+#include "va.h"
507+#else
508+#include <va/va.h>
509+#endif
510+#include <GL/glx.h>
511+
512+#ifdef __cplusplus
513+extern "C" {
514+#endif
515+
516+/**
517+ * Return a suitable VADisplay for VA API
518+ *
519+ * @param[in] dpy the X11 display
520+ * @return a VADisplay
521+ */
522+VADisplay vaGetDisplayGLX(
523+ Display *dpy
524+);
525+
526+/**
527+ * Create a surface used for display to OpenGL
528+ *
529+ * The application shall maintain the live GLX context itself.
530+ * Implementations are free to use glXGetCurrentContext() and
531+ * glXGetCurrentDrawable() functions for internal purposes.
532+ *
533+ * @param[in] dpy the VA display
534+ * @param[in] target the GL target to which the texture needs to be bound
535+ * @param[in] texture the GL texture
536+ * @param[out] gl_surface the VA/GLX surface
537+ * @return VA_STATUS_SUCCESS if successful
538+ */
539+VAStatus vaCreateSurfaceGLX(
540+ VADisplay dpy,
541+ GLenum target,
542+ GLuint texture,
543+ void **gl_surface
544+);
545+
546+/**
547+ * Destroy a VA/GLX surface
548+ *
549+ * The application shall maintain the live GLX context itself.
550+ * Implementations are free to use glXGetCurrentContext() and
551+ * glXGetCurrentDrawable() functions for internal purposes.
552+ *
553+ * @param[in] dpy the VA display
554+ * @param[in] gl_surface the VA surface
555+ * @return VA_STATUS_SUCCESS if successful
556+ */
557+VAStatus vaDestroySurfaceGLX(
558+ VADisplay dpy,
559+ void *gl_surface
560+);
561+
562+/**
563+ * Associate a VA surface to a VA/GLX surface
564+ *
565+ * The association is live until vaDeassociateSurfaceGLX(),
566+ * vaCopySurfaceGLX() or the next call to vaBeginPicture() with the
567+ * specificed VA surface.
568+ *
569+ * The application shall maintain the live GLX context itself.
570+ * Implementations are free to use glXGetCurrentContext() and
571+ * glXGetCurrentDrawable() functions for internal purposes.
572+ *
573+ * @param[in] dpy the VA display
574+ * @param[in] gl_surface the VA/GLX surface
575+ * @param[in] surface the VA surface
576+ * @param[in] flags the PutSurface flags
577+ * @return VA_STATUS_SUCCESS if successful
578+ */
579+VAStatus vaAssociateSurfaceGLX(
580+ VADisplay dpy,
581+ void *gl_surface,
582+ VASurfaceID surface,
583+ unsigned int flags
584+);
585+
586+/**
587+ * Deassociate a VA surface from a VA/GLX surface
588+ *
589+ * The application shall maintain the live GLX context itself.
590+ * Implementations are free to use glXGetCurrentContext() and
591+ * glXGetCurrentDrawable() functions for internal purposes.
592+ *
593+ * @param[in] dpy the VA display
594+ * @param[in] gl_surface the VA surface
595+ * @return VA_STATUS_SUCCESS if successful
596+ */
597+VAStatus vaDeassociateSurfaceGLX(
598+ VADisplay dpy,
599+ void *gl_surface
600+);
601+
602+/**
603+ * Synchronize a VA/GLX surface
604+ *
605+ * This function blocks until all pending operations on the VA/GLX
606+ * surface have been completed.
607+ *
608+ * The application shall maintain the live GLX context itself.
609+ * Implementations are free to use glXGetCurrentContext() and
610+ * glXGetCurrentDrawable() functions for internal purposes.
611+ *
612+ * @param[in] dpy the VA display
613+ * @param[in] gl_surface the VA surface
614+ * @return VA_STATUS_SUCCESS if successful
615+ */
616+VAStatus vaSyncSurfaceGLX(
617+ VADisplay dpy,
618+ void *gl_surface
619+);
620+
621+/**
622+ * Prepare VA/GLX surface for rendering
623+ *
624+ * This function performs an implicit vaSyncSurfaceGLX().
625+ *
626+ * Implementations using the GLX texture-from-pixmap extension will
627+ * generally call glXBindTexImage() here.
628+ *
629+ * The application shall maintain the live GLX context itself.
630+ * Implementations are free to use glXGetCurrentContext() and
631+ * glXGetCurrentDrawable() functions for internal purposes.
632+ *
633+ * @param[in] dpy the VA display
634+ * @param[in] gl_surface the VA surface
635+ * @return VA_STATUS_SUCCESS if successful
636+ */
637+VAStatus vaBeginRenderSurfaceGLX(
638+ VADisplay dpy,
639+ void *gl_surface
640+);
641+
642+/**
643+ * Notify the server that the VA/GLX surface is no longer used for
644+ * rendering
645+ *
646+ * Implementations using the GLX texture-from-pixmap extension will
647+ * generally call glXReleaseTexImage() here.
648+ *
649+ * The application shall maintain the live GLX context itself.
650+ * Implementations are free to use glXGetCurrentContext() and
651+ * glXGetCurrentDrawable() functions for internal purposes.
652+ *
653+ * @param[in] dpy the VA display
654+ * @param[in] gl_surface the VA surface
655+ * @return VA_STATUS_SUCCESS if successful
656+ */
657+VAStatus vaEndRenderSurfaceGLX(
658+ VADisplay dpy,
659+ void *gl_surface
660+);
661+
662+/**
663+ * Copy a VA surface to a VA/GLX surface
664+ *
665+ * This function kills any association that was previously made with
666+ * vaAssociateSurfaceGLX() and will not return until the copy is
667+ * completed.
668+ *
669+ * Upon successful return, the underlying GL texture will contain the
670+ * complete pixels and no call to vaBeginRenderSurfaceGLX() or
671+ * vaEndRenderSurfaceGLX() is required.
672+ *
673+ * The application shall maintain the live GLX context itself.
674+ * Implementations are free to use glXGetCurrentContext() and
675+ * glXGetCurrentDrawable() functions for internal purposes.
676+ *
677+ * @param[in] dpy the VA display
678+ * @param[in] gl_surface the VA/GLX destination surface
679+ * @param[in] surface the VA source surface
680+ * @param[in] flags the PutSurface flags
681+ * @return VA_STATUS_SUCCESS if successful
682+ */
683+VAStatus vaCopySurfaceGLX(
684+ VADisplay dpy,
685+ void *gl_surface,
686+ VASurfaceID surface,
687+ unsigned int flags
688+);
689+
690+#ifdef __cplusplus
691+}
692+#endif
693+
694+#endif /* VA_GLX_H */
695diff --git a/src/glx/va_glx_impl.c b/src/glx/va_glx_impl.c
696new file mode 100644
697index 0000000..d4f9c1d
698--- /dev/null
699+++ b/src/glx/va_glx_impl.c
700@@ -0,0 +1,1168 @@
701+/*
702+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
703+ *
704+ * Permission is hereby granted, free of charge, to any person obtaining a
705+ * copy of this software and associated documentation files (the
706+ * "Software"), to deal in the Software without restriction, including
707+ * without limitation the rights to use, copy, modify, merge, publish,
708+ * distribute, sub license, and/or sell copies of the Software, and to
709+ * permit persons to whom the Software is furnished to do so, subject to
710+ * the following conditions:
711+ *
712+ * The above copyright notice and this permission notice (including the
713+ * next paragraph) shall be included in all copies or substantial portions
714+ * of the Software.
715+ *
716+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
717+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
718+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
719+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
720+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
721+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
722+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
723+ */
724+
725+#define _GNU_SOURCE 1
726+#include "va_glx_private.h"
727+#include "va_glx_impl.h"
728+#include <stdio.h>
729+#include <stdarg.h>
730+#include <string.h>
731+#include <assert.h>
732+#include <dlfcn.h>
733+
734+static void va_glx_error_message(const char *format, ...)
735+{
736+ va_list args;
737+ va_start(args, format);
738+ fprintf(stderr, "[%s] ", PACKAGE_NAME);
739+ vfprintf(stderr, format, args);
740+ va_end(args);
741+}
742+
743+// X error trap
744+static int x11_error_code = 0;
745+static int (*old_error_handler)(Display *, XErrorEvent *);
746+
747+static int error_handler(Display *dpy, XErrorEvent *error)
748+{
749+ x11_error_code = error->error_code;
750+ return 0;
751+}
752+
753+static void x11_trap_errors(void)
754+{
755+ x11_error_code = 0;
756+ old_error_handler = XSetErrorHandler(error_handler);
757+}
758+
759+static int x11_untrap_errors(void)
760+{
761+ XSetErrorHandler(old_error_handler);
762+ return x11_error_code;
763+}
764+
765+// Returns a string representation of an OpenGL error
766+static const char *gl_get_error_string(GLenum error)
767+{
768+ static const struct {
769+ GLenum val;
770+ const char *str;
771+ }
772+ gl_errors[] = {
773+ { GL_NO_ERROR, "no error" },
774+ { GL_INVALID_ENUM, "invalid enumerant" },
775+ { GL_INVALID_VALUE, "invalid value" },
776+ { GL_INVALID_OPERATION, "invalid operation" },
777+ { GL_STACK_OVERFLOW, "stack overflow" },
778+ { GL_STACK_UNDERFLOW, "stack underflow" },
779+ { GL_OUT_OF_MEMORY, "out of memory" },
780+#ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT
781+ { GL_INVALID_FRAMEBUFFER_OPERATION_EXT, "invalid framebuffer operation" },
782+#endif
783+ { ~0, NULL }
784+ };
785+
786+ int i;
787+ for (i = 0; gl_errors[i].str; i++) {
788+ if (gl_errors[i].val == error)
789+ return gl_errors[i].str;
790+ }
791+ return "unknown";
792+}
793+
794+static inline int gl_do_check_error(int report)
795+{
796+ GLenum error;
797+ int is_error = 0;
798+ while ((error = glGetError()) != GL_NO_ERROR) {
799+ if (report)
800+ va_glx_error_message("glError: %s caught\n",
801+ gl_get_error_string(error));
802+ is_error = 1;
803+ }
804+ return is_error;
805+}
806+
807+static inline void gl_purge_errors(void)
808+{
809+ gl_do_check_error(0);
810+}
811+
812+static inline int gl_check_error(void)
813+{
814+ return gl_do_check_error(1);
815+}
816+
817+// glGetFloatv() wrapper
818+static int gl_get_current_color(float color[4])
819+{
820+ gl_purge_errors();
821+ glGetFloatv(GL_CURRENT_COLOR, color);
822+ if (gl_check_error())
823+ return -1;
824+ return 0;
825+}
826+
827+// glGetIntegerv() wrapper
828+static int gl_get_param(GLenum param, unsigned int *pval)
829+{
830+ GLint val;
831+
832+ gl_purge_errors();
833+ glGetIntegerv(param, &val);
834+ if (gl_check_error())
835+ return -1;
836+ if (pval)
837+ *pval = val;
838+ return 0;
839+}
840+
841+// glGetTexLevelParameteriv() wrapper
842+static int gl_get_texture_param(GLenum param, unsigned int *pval)
843+{
844+ GLint val;
845+
846+ gl_purge_errors();
847+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, param, &val);
848+ if (gl_check_error())
849+ return -1;
850+ if (pval)
851+ *pval = val;
852+ return 0;
853+}
854+
855+// Returns the OpenGL VTable
856+static inline VAOpenGLVTableP gl_get_vtable(VADriverContextP ctx)
857+{
858+ return &VA_DRIVER_CONTEXT_GLX(ctx)->gl_vtable;
859+}
860+
861+// Lookup for a GLX function
862+typedef void (*GLFuncPtr)(void);
863+typedef GLFuncPtr (*GLXGetProcAddressProc)(const char *);
864+
865+static GLFuncPtr get_proc_address_default(const char *name)
866+{
867+ return NULL;
868+}
869+
870+static GLXGetProcAddressProc get_proc_address_func(void)
871+{
872+ GLXGetProcAddressProc get_proc_func;
873+
874+ dlerror();
875+ get_proc_func = (GLXGetProcAddressProc)
876+ dlsym(RTLD_DEFAULT, "glXGetProcAddress");
877+ if (dlerror() == NULL)
878+ return get_proc_func;
879+
880+ get_proc_func = (GLXGetProcAddressProc)
881+ dlsym(RTLD_DEFAULT, "glXGetProcAddressARB");
882+ if (dlerror() == NULL)
883+ return get_proc_func;
884+
885+ return get_proc_address_default;
886+}
887+
888+static inline GLFuncPtr get_proc_address(const char *name)
889+{
890+ static GLXGetProcAddressProc get_proc_func = NULL;
891+ if (get_proc_func == NULL)
892+ get_proc_func = get_proc_address_func();
893+ return get_proc_func(name);
894+}
895+
896+// Check for GLX extensions (TFP, FBO)
897+static int check_extension(const char *name, const char *ext)
898+{
899+ const char *end;
900+ int name_len, n;
901+
902+ if (name == NULL || ext == NULL)
903+ return 0;
904+
905+ end = ext + strlen(ext);
906+ name_len = strlen(name);
907+ while (ext < end) {
908+ n = strcspn(ext, " ");
909+ if (n == name_len && strncmp(name, ext, n) == 0)
910+ return 1;
911+ ext += (n + 1);
912+ }
913+ return 0;
914+}
915+
916+static int check_tfp_extensions(VADriverContextP ctx)
917+{
918+ const char *gl_extensions;
919+ const char *glx_extensions;
920+
921+ gl_extensions = (const char *)glGetString(GL_EXTENSIONS);
922+ if (!check_extension("GL_ARB_texture_non_power_of_two", gl_extensions))
923+ return 0;
924+
925+ glx_extensions = glXQueryExtensionsString(ctx->x11_dpy, ctx->x11_screen);
926+ if (!check_extension("GLX_EXT_texture_from_pixmap", glx_extensions))
927+ return 0;
928+ return 1;
929+}
930+
931+static int check_fbo_extensions(VADriverContextP ctx)
932+{
933+ const char *gl_extensions;
934+
935+ gl_extensions = (const char *)glGetString(GL_EXTENSIONS);
936+ if (!check_extension("GL_ARB_framebuffer_object", gl_extensions))
937+ return 0;
938+ if (!check_extension("GL_EXT_framebuffer_object", gl_extensions))
939+ return 0;
940+ return 1;
941+}
942+
943+// Load GLX extensions
944+static int load_tfp_extensions(VADriverContextP ctx)
945+{
946+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
947+
948+ pOpenGLVTable->glx_bind_tex_image = (PFNGLXBINDTEXIMAGEEXTPROC)
949+ get_proc_address("glXBindTexImageEXT");
950+ if (pOpenGLVTable->glx_bind_tex_image == NULL)
951+ return 0;
952+ pOpenGLVTable->glx_release_tex_image = (PFNGLXRELEASETEXIMAGEEXTPROC)
953+ get_proc_address("glXReleaseTexImageEXT");
954+ if (pOpenGLVTable->glx_release_tex_image == NULL)
955+ return 0;
956+ return 1;
957+}
958+
959+static int load_fbo_extensions(VADriverContextP ctx)
960+{
961+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
962+
963+ pOpenGLVTable->gl_gen_framebuffers = (PFNGLGENFRAMEBUFFERSEXTPROC)
964+ get_proc_address("glGenFramebuffersEXT");
965+ if (pOpenGLVTable->gl_gen_framebuffers == NULL)
966+ return 0;
967+ pOpenGLVTable->gl_delete_framebuffers = (PFNGLDELETEFRAMEBUFFERSEXTPROC)
968+ get_proc_address("glDeleteFramebuffersEXT");
969+ if (pOpenGLVTable->gl_delete_framebuffers == NULL)
970+ return 0;
971+ pOpenGLVTable->gl_bind_framebuffer = (PFNGLBINDFRAMEBUFFEREXTPROC)
972+ get_proc_address("glBindFramebufferEXT");
973+ if (pOpenGLVTable->gl_bind_framebuffer == NULL)
974+ return 0;
975+ pOpenGLVTable->gl_gen_renderbuffers = (PFNGLGENRENDERBUFFERSEXTPROC)
976+ get_proc_address("glGenRenderbuffersEXT");
977+ if (pOpenGLVTable->gl_gen_renderbuffers == NULL)
978+ return 0;
979+ pOpenGLVTable->gl_delete_renderbuffers = (PFNGLDELETERENDERBUFFERSEXTPROC)
980+ get_proc_address("glDeleteRenderbuffersEXT");
981+ if (pOpenGLVTable->gl_delete_renderbuffers == NULL)
982+ return 0;
983+ pOpenGLVTable->gl_bind_renderbuffer = (PFNGLBINDRENDERBUFFEREXTPROC)
984+ get_proc_address("glBindRenderbufferEXT");
985+ if (pOpenGLVTable->gl_bind_renderbuffer == NULL)
986+ return 0;
987+ pOpenGLVTable->gl_renderbuffer_storage = (PFNGLRENDERBUFFERSTORAGEEXTPROC)
988+ get_proc_address("glRenderbufferStorageEXT");
989+ if (pOpenGLVTable->gl_renderbuffer_storage == NULL)
990+ return 0;
991+ pOpenGLVTable->gl_framebuffer_renderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)
992+ get_proc_address("glFramebufferRenderbufferEXT");
993+ if (pOpenGLVTable->gl_framebuffer_renderbuffer == NULL)
994+ return 0;
995+ pOpenGLVTable->gl_framebuffer_texture_2d = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)
996+ get_proc_address("glFramebufferTexture2DEXT");
997+ if (pOpenGLVTable->gl_framebuffer_texture_2d == NULL)
998+ return 0;
999+ pOpenGLVTable->gl_check_framebuffer_status = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)
1000+ get_proc_address("glCheckFramebufferStatusEXT");
1001+ if (pOpenGLVTable->gl_check_framebuffer_status == NULL)
1002+ return 0;
1003+ return 1;
1004+}
1005+
1006+
1007+/* ========================================================================= */
1008+/* === VA/GLX helpers === */
1009+/* ========================================================================= */
1010+
1011+// OpenGL texture state
1012+typedef struct OpenGLTextureState *OpenGLTextureStateP;
1013+
1014+struct OpenGLTextureState {
1015+ int was_enabled;
1016+ int was_bound;
1017+ GLenum target;
1018+ GLuint old_texture;
1019+};
1020+
1021+// Bind texture, preserve previous texture state
1022+static int bind_texture(OpenGLTextureStateP ts, GLenum target, GLuint texture)
1023+{
1024+ ts->target = target;
1025+ ts->old_texture = 0;
1026+ ts->was_bound = 0;
1027+ ts->was_enabled = glIsEnabled(target);
1028+ if (!ts->was_enabled)
1029+ glEnable(target);
1030+
1031+ GLenum texture_binding;
1032+ switch (target) {
1033+ case GL_TEXTURE_1D:
1034+ texture_binding = GL_TEXTURE_BINDING_1D;
1035+ break;
1036+ case GL_TEXTURE_2D:
1037+ texture_binding = GL_TEXTURE_BINDING_2D;
1038+ break;
1039+ case GL_TEXTURE_3D:
1040+ texture_binding = GL_TEXTURE_BINDING_3D;
1041+ break;
1042+ case GL_TEXTURE_RECTANGLE_ARB:
1043+ texture_binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
1044+ break;
1045+ default:
1046+ assert(!target);
1047+ return -1;
1048+ }
1049+
1050+ if (ts->was_enabled && gl_get_param(texture_binding, &ts->old_texture) < 0)
1051+ return -1;
1052+
1053+ ts->was_bound = texture == ts->old_texture;
1054+ if (!ts->was_bound) {
1055+ gl_purge_errors();
1056+ glBindTexture(target, texture);
1057+ if (gl_check_error())
1058+ return -1;
1059+ }
1060+ return 0;
1061+}
1062+
1063+// Unbind texture, restore previous texture state
1064+static void unbind_texture(OpenGLTextureStateP ts)
1065+{
1066+ if (!ts->was_bound && ts->old_texture)
1067+ glBindTexture(ts->target, ts->old_texture);
1068+ if (!ts->was_enabled)
1069+ glDisable(ts->target);
1070+}
1071+
1072+// Create Pixmaps for GLX texture-from-pixmap extension
1073+static int create_tfp_surface(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1074+{
1075+ const unsigned int width = pSurfaceGLX->width;
1076+ const unsigned int height = pSurfaceGLX->height;
1077+ Pixmap pixmap = None;
1078+ GLXFBConfig *fbconfig = NULL;
1079+ GLXPixmap glx_pixmap = None;
1080+ Window root_window;
1081+ XWindowAttributes wattr;
1082+ int *attrib;
1083+ int n_fbconfig_attribs, x, y, status;
1084+ unsigned int border_width, depth, dummy;
1085+
1086+ root_window = RootWindow(ctx->x11_dpy, ctx->x11_screen);
1087+ XGetWindowAttributes(ctx->x11_dpy, root_window, &wattr);
1088+ pixmap = XCreatePixmap(ctx->x11_dpy, root_window,
1089+ width, height, wattr.depth);
1090+ if (!pixmap)
1091+ return -1;
1092+ pSurfaceGLX->pixmap = pixmap;
1093+
1094+ x11_trap_errors();
1095+ status = XGetGeometry(ctx->x11_dpy,
1096+ (Drawable)pixmap,
1097+ &root_window,
1098+ &x,
1099+ &y,
1100+ &dummy,
1101+ &dummy,
1102+ &border_width,
1103+ &depth);
1104+ if (x11_untrap_errors() != 0 || status == 0)
1105+ return -1;
1106+ if (depth != 24 && depth != 32)
1107+ return -1;
1108+
1109+ int fbconfig_attribs[32] = {
1110+ GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
1111+ GLX_DOUBLEBUFFER, GL_TRUE,
1112+ GLX_RENDER_TYPE, GLX_RGBA_BIT,
1113+ GLX_X_RENDERABLE, GL_TRUE,
1114+ GLX_Y_INVERTED_EXT, GL_TRUE,
1115+ GLX_RED_SIZE, 8,
1116+ GLX_GREEN_SIZE, 8,
1117+ GLX_BLUE_SIZE, 8,
1118+ GL_NONE,
1119+ };
1120+ for (attrib = fbconfig_attribs; *attrib != GL_NONE; attrib += 2)
1121+ ;
1122+ *attrib++ = GLX_DEPTH_SIZE; *attrib++ = depth;
1123+ if (depth == 32) {
1124+ *attrib++ = GLX_ALPHA_SIZE; *attrib++ = 8;
1125+ *attrib++ = GLX_BIND_TO_TEXTURE_RGBA_EXT; *attrib++ = GL_TRUE;
1126+ }
1127+ else {
1128+ *attrib++ = GLX_BIND_TO_TEXTURE_RGB_EXT; *attrib++ = GL_TRUE;
1129+ }
1130+ *attrib++ = GL_NONE;
1131+
1132+ fbconfig = glXChooseFBConfig(ctx->x11_dpy, ctx->x11_screen, fbconfig_attribs, &n_fbconfig_attribs);
1133+ if (fbconfig == NULL)
1134+ return -1;
1135+
1136+ int pixmap_attribs[10] = {
1137+ GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT,
1138+ GLX_MIPMAP_TEXTURE_EXT, GL_FALSE,
1139+ GL_NONE,
1140+ };
1141+ for (attrib = pixmap_attribs; *attrib != GL_NONE; attrib += 2)
1142+ ;
1143+ *attrib++ = GLX_TEXTURE_FORMAT_EXT;
1144+ if (depth == 32)
1145+ *attrib++ = GLX_TEXTURE_FORMAT_RGBA_EXT;
1146+ else
1147+ *attrib++ = GLX_TEXTURE_FORMAT_RGB_EXT;
1148+ *attrib++ = GL_NONE;
1149+
1150+ x11_trap_errors();
1151+ glx_pixmap = glXCreatePixmap(ctx->x11_dpy,
1152+ fbconfig[0],
1153+ pixmap,
1154+ pixmap_attribs);
1155+ free(fbconfig);
1156+ if (x11_untrap_errors() != 0)
1157+ return -1;
1158+ pSurfaceGLX->glx_pixmap = glx_pixmap;
1159+ return 0;
1160+}
1161+
1162+// Destroy Pixmaps used for TFP
1163+static void destroy_tfp_surface(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1164+{
1165+ if (pSurfaceGLX->glx_pixmap) {
1166+ glXDestroyPixmap(ctx->x11_dpy, pSurfaceGLX->glx_pixmap);
1167+ pSurfaceGLX->glx_pixmap = None;
1168+ }
1169+
1170+ if (pSurfaceGLX->pixmap) {
1171+ XFreePixmap(ctx->x11_dpy, pSurfaceGLX->pixmap);
1172+ pSurfaceGLX->pixmap = None;
1173+ }
1174+}
1175+
1176+// Bind GLX Pixmap to texture
1177+static int bind_pixmap(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1178+{
1179+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1180+
1181+ if (pSurfaceGLX->is_bound)
1182+ return 0;
1183+
1184+ x11_trap_errors();
1185+ pOpenGLVTable->glx_bind_tex_image(ctx->x11_dpy, pSurfaceGLX->glx_pixmap,
1186+ GLX_FRONT_LEFT_EXT, NULL);
1187+ XSync(ctx->x11_dpy, False);
1188+ if (x11_untrap_errors() != 0) {
1189+ va_glx_error_message("failed to bind pixmap\n");
1190+ return -1;
1191+ }
1192+
1193+ pSurfaceGLX->is_bound = 1;
1194+ return 0;
1195+}
1196+
1197+// Release GLX Pixmap from texture
1198+static int unbind_pixmap(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1199+{
1200+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1201+
1202+ if (!pSurfaceGLX->is_bound)
1203+ return 0;
1204+
1205+ x11_trap_errors();
1206+ pOpenGLVTable->glx_release_tex_image(ctx->x11_dpy, pSurfaceGLX->glx_pixmap,
1207+ GLX_FRONT_LEFT_EXT);
1208+ XSync(ctx->x11_dpy, False);
1209+ if (x11_untrap_errors() != 0) {
1210+ va_glx_error_message("failed to release pixmap\n");
1211+ return -1;
1212+ }
1213+
1214+ pSurfaceGLX->is_bound = 0;
1215+ return 0;
1216+}
1217+
1218+// Render GLX Pixmap to texture
1219+static void render_pixmap(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1220+{
1221+ const unsigned int w = pSurfaceGLX->width;
1222+ const unsigned int h = pSurfaceGLX->height;
1223+ float old_color[4];
1224+
1225+ gl_get_current_color(old_color);
1226+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
1227+ glBegin(GL_QUADS);
1228+ {
1229+ glTexCoord2f(0.0f, 0.0f); glVertex2i(0, 0);
1230+ glTexCoord2f(0.0f, 1.0f); glVertex2i(0, h);
1231+ glTexCoord2f(1.0f, 1.0f); glVertex2i(w, h);
1232+ glTexCoord2f(1.0f, 0.0f); glVertex2i(w, 0);
1233+ }
1234+ glEnd();
1235+ glColor4fv(old_color);
1236+}
1237+
1238+// Create offscreen surface
1239+static int create_fbo_surface(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1240+{
1241+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1242+ const GLenum texture = pSurfaceGLX->texture;
1243+ const unsigned int texture_width = pSurfaceGLX->width;
1244+ const unsigned int texture_height = pSurfaceGLX->height;
1245+ GLuint fbo, fbo_buffer, fbo_texture;
1246+ GLenum status;
1247+
1248+ glGenTextures(1, &fbo_texture);
1249+ glBindTexture(GL_TEXTURE_2D, fbo_texture);
1250+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1251+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1252+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1253+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1254+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
1255+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0,
1256+ GL_BGRA, GL_UNSIGNED_BYTE, NULL);
1257+
1258+ pOpenGLVTable->gl_gen_framebuffers(1, &fbo);
1259+ pOpenGLVTable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, fbo);
1260+ pOpenGLVTable->gl_gen_renderbuffers(1, &fbo_buffer);
1261+ pOpenGLVTable->gl_bind_renderbuffer(GL_RENDERBUFFER_EXT, fbo_buffer);
1262+
1263+ glBindTexture(GL_TEXTURE_2D, texture);
1264+ pOpenGLVTable->gl_framebuffer_texture_2d(GL_FRAMEBUFFER_EXT,
1265+ GL_COLOR_ATTACHMENT0_EXT,
1266+ GL_TEXTURE_2D, texture, 0);
1267+
1268+ status = pOpenGLVTable->gl_check_framebuffer_status(GL_DRAW_FRAMEBUFFER_EXT);
1269+ pOpenGLVTable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, 0);
1270+ if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
1271+ return -1;
1272+
1273+ pSurfaceGLX->fbo = fbo;
1274+ pSurfaceGLX->fbo_buffer = fbo_buffer;
1275+ pSurfaceGLX->fbo_texture = fbo_texture;
1276+ return 0;
1277+}
1278+
1279+// Destroy offscreen surface
1280+static void destroy_fbo_surface(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1281+{
1282+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1283+
1284+ if (pSurfaceGLX->fbo_texture) {
1285+ glDeleteTextures(1, &pSurfaceGLX->fbo_texture);
1286+ pSurfaceGLX->fbo_texture = 0;
1287+ }
1288+
1289+ if (pSurfaceGLX->fbo_buffer) {
1290+ pOpenGLVTable->gl_delete_renderbuffers(1, &pSurfaceGLX->fbo_buffer);
1291+ pSurfaceGLX->fbo_buffer = 0;
1292+ }
1293+
1294+ if (pSurfaceGLX->fbo) {
1295+ pOpenGLVTable->gl_delete_framebuffers(1, &pSurfaceGLX->fbo);
1296+ pSurfaceGLX->fbo = 0;
1297+ }
1298+}
1299+
1300+// Setup matrices to match the FBO texture dimensions
1301+static void fbo_enter(VADriverContextP ctx, VASurfaceGLXP pSurfaceGLX)
1302+{
1303+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1304+ const unsigned int width = pSurfaceGLX->width;
1305+ const unsigned int height = pSurfaceGLX->height;
1306+
1307+ pOpenGLVTable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, pSurfaceGLX->fbo);
1308+ glPushAttrib(GL_VIEWPORT_BIT);
1309+ glMatrixMode(GL_PROJECTION);
1310+ glPushMatrix();
1311+ glLoadIdentity();
1312+ glMatrixMode(GL_MODELVIEW);
1313+ glPushMatrix();
1314+ glLoadIdentity();
1315+ glViewport(0, 0, width, height);
1316+ glTranslatef(-1.0f, -1.0f, 0.0f);
1317+ glScalef(2.0f / width, 2.0f / height, 1.0f);
1318+
1319+ glBindTexture(GL_TEXTURE_2D, pSurfaceGLX->fbo_texture);
1320+}
1321+
1322+// Restore original OpenGL matrices
1323+static void fbo_leave(VADriverContextP ctx)
1324+{
1325+ VAOpenGLVTableP pOpenGLVTable = gl_get_vtable(ctx);
1326+
1327+ glPopAttrib();
1328+ glMatrixMode(GL_PROJECTION);
1329+ glPopMatrix();
1330+ glMatrixMode(GL_MODELVIEW);
1331+ glPopMatrix();
1332+ pOpenGLVTable->gl_bind_framebuffer(GL_FRAMEBUFFER_EXT, 0);
1333+}
1334+
1335+// Create VA/GLX surface
1336+VASurfaceGLXP
1337+va_glx_create_surface(VADriverContextP ctx, GLenum target, GLuint texture)
1338+{
1339+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1340+ VASurfaceGLXP pSurfaceGLX;
1341+ unsigned int internal_format, border_width, width, height;
1342+ int is_error = 1;
1343+
1344+ /* Make sure binding succeeds, if texture was not already bound */
1345+ struct OpenGLTextureState ts;
1346+ if (bind_texture(&ts, target, texture) < 0)
1347+ goto end;
1348+
1349+ pSurfaceGLX = malloc(sizeof(*pSurfaceGLX));
1350+ if (!pSurfaceGLX)
1351+ goto end;
1352+
1353+ pSurfaceGLX->magic = VA_SURFACE_GLX_MAGIC;
1354+ pSurfaceGLX->target = target;
1355+ pSurfaceGLX->texture = texture;
1356+ pSurfaceGLX->surface = VA_INVALID_SURFACE;
1357+ pSurfaceGLX->is_bound = 0;
1358+ pSurfaceGLX->pixmap = None;
1359+ pSurfaceGLX->glx_pixmap = None;
1360+ pSurfaceGLX->fbo = 0;
1361+ pSurfaceGLX->fbo_buffer = 0;
1362+ pSurfaceGLX->fbo_texture = 0;
1363+ pSurfaceGLX->priv = NULL;
1364+
1365+ /* XXX: we don't support other textures than RGBA */
1366+ if (gl_get_texture_param(GL_TEXTURE_INTERNAL_FORMAT, &internal_format) < 0)
1367+ goto end;
1368+ if (internal_format != GL_RGBA)
1369+ goto end;
1370+
1371+ /* Check texture dimensions */
1372+ if (gl_get_texture_param(GL_TEXTURE_BORDER, &border_width) < 0)
1373+ goto end;
1374+ if (gl_get_texture_param(GL_TEXTURE_WIDTH, &width) < 0)
1375+ goto end;
1376+ if (gl_get_texture_param(GL_TEXTURE_HEIGHT, &height) < 0)
1377+ goto end;
1378+
1379+ width -= 2 * border_width;
1380+ height -= 2 * border_width;
1381+ if (width == 0 || height == 0)
1382+ goto end;
1383+
1384+ pSurfaceGLX->width = width;
1385+ pSurfaceGLX->height = height;
1386+
1387+ /* Create Pixmaps for TFP */
1388+ if (pDriverContextGLX->use_tfp) {
1389+ if (create_tfp_surface(ctx, pSurfaceGLX) < 0)
1390+ goto end;
1391+ }
1392+
1393+ /* Create Pixmaps for FBO */
1394+ if (pDriverContextGLX->use_fbo) {
1395+ if (create_fbo_surface(ctx, pSurfaceGLX) < 0)
1396+ goto end;
1397+ }
1398+
1399+ is_error = 0;
1400+end:
1401+ if (is_error && pSurfaceGLX)
1402+ va_glx_destroy_surface(ctx, &pSurfaceGLX);
1403+
1404+ unbind_texture(&ts);
1405+ return pSurfaceGLX;
1406+}
1407+
1408+// Destroy VA/GLX surface
1409+void va_glx_destroy_surface(VADriverContextP ctx, VASurfaceGLXP *ppSurfaceGLX)
1410+{
1411+ VASurfaceGLXP pSurfaceGLX = *ppSurfaceGLX;
1412+
1413+ unbind_pixmap(ctx, pSurfaceGLX);
1414+ destroy_fbo_surface(ctx, pSurfaceGLX);
1415+ destroy_tfp_surface(ctx, pSurfaceGLX);
1416+
1417+ free(pSurfaceGLX);
1418+ *ppSurfaceGLX = NULL;
1419+}
1420+
1421+
1422+/* ========================================================================= */
1423+/* === VA/GLX implementation from the driver (fordward calls) === */
1424+/* ========================================================================= */
1425+
1426+#define INVOKE(ctx, func, args) do { \
1427+ VADriverVTableGLXP vtable = &(ctx)->vtable.glx; \
1428+ if (!vtable->va##func##GLX) \
1429+ return VA_STATUS_ERROR_UNIMPLEMENTED; \
1430+ \
1431+ VAStatus status = vtable->va##func##GLX args; \
1432+ if (status != VA_STATUS_SUCCESS) \
1433+ return status; \
1434+ } while (0)
1435+
1436+static VAStatus
1437+vaCreateSurfaceGLX_impl_driver(
1438+ VADriverContextP ctx,
1439+ GLenum target,
1440+ GLuint texture,
1441+ void **gl_surface
1442+)
1443+{
1444+ INVOKE(ctx, CreateSurface, (ctx, target, texture, gl_surface));
1445+ return VA_STATUS_SUCCESS;
1446+}
1447+
1448+static VAStatus
1449+vaDestroySurfaceGLX_impl_driver(VADriverContextP ctx, void *gl_surface)
1450+{
1451+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1452+
1453+ INVOKE(ctx, DestroySurface, (ctx, pSurfaceGLX->priv));
1454+ return VA_STATUS_SUCCESS;
1455+}
1456+
1457+static VAStatus
1458+vaAssociateSurfaceGLX_impl_driver(
1459+ VADriverContextP ctx,
1460+ void *gl_surface,
1461+ VASurfaceID surface,
1462+ unsigned int flags
1463+)
1464+{
1465+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1466+
1467+ INVOKE(ctx, AssociateSurface, (ctx, pSurfaceGLX->priv, surface, flags));
1468+ return VA_STATUS_SUCCESS;
1469+}
1470+
1471+static VAStatus
1472+vaDeassociateSurfaceGLX_impl_driver(VADriverContextP ctx, void *gl_surface)
1473+{
1474+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1475+
1476+ INVOKE(ctx, DeassociateSurface, (ctx, pSurfaceGLX->priv));
1477+ return VA_STATUS_SUCCESS;
1478+}
1479+
1480+static VAStatus
1481+vaSyncSurfaceGLX_impl_driver(VADriverContextP ctx, void *gl_surface)
1482+{
1483+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1484+
1485+ INVOKE(ctx, SyncSurface, (ctx, pSurfaceGLX->priv));
1486+ return VA_STATUS_SUCCESS;
1487+}
1488+
1489+static VAStatus
1490+vaBeginRenderSurfaceGLX_impl_driver(VADriverContextP ctx, void *gl_surface)
1491+{
1492+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1493+
1494+ INVOKE(ctx, BeginRenderSurface, (ctx, pSurfaceGLX->priv));
1495+ return VA_STATUS_SUCCESS;
1496+}
1497+
1498+static VAStatus
1499+vaEndRenderSurfaceGLX_impl_driver(VADriverContextP ctx, void *gl_surface)
1500+{
1501+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1502+
1503+ INVOKE(ctx, EndRenderSurface, (ctx, pSurfaceGLX->priv));
1504+ return VA_STATUS_SUCCESS;
1505+}
1506+
1507+static VAStatus
1508+vaCopySurfaceGLX_impl_driver(
1509+ VADriverContextP ctx,
1510+ void *gl_surface,
1511+ VASurfaceID surface,
1512+ unsigned int flags
1513+)
1514+{
1515+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1516+
1517+ INVOKE(ctx, CopySurface, (ctx, pSurfaceGLX->priv, surface, flags));
1518+ return VA_STATUS_SUCCESS;
1519+}
1520+
1521+#undef INVOKE
1522+
1523+
1524+/* ========================================================================= */
1525+/* === VA/GLX implementation from libVA (generic and suboptimal path) === */
1526+/* ========================================================================= */
1527+
1528+static VAStatus
1529+vaCreateSurfaceGLX_impl_libva(
1530+ VADriverContextP ctx,
1531+ GLenum target,
1532+ GLuint texture,
1533+ void **gl_surface
1534+)
1535+{
1536+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1537+
1538+ if (!pDriverContextGLX->use_tfp)
1539+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1540+
1541+ *gl_surface = NULL;
1542+ return VA_STATUS_SUCCESS;
1543+}
1544+
1545+static VAStatus
1546+vaDestroySurfaceGLX_impl_libva(VADriverContextP ctx, void *gl_surface)
1547+{
1548+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1549+
1550+ if (!pDriverContextGLX->use_tfp)
1551+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1552+
1553+ return VA_STATUS_SUCCESS;
1554+}
1555+
1556+static VAStatus
1557+vaAssociateSurfaceGLX_impl_libva(
1558+ VADriverContextP ctx,
1559+ void *gl_surface,
1560+ VASurfaceID surface,
1561+ unsigned int flags
1562+)
1563+{
1564+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1565+ VADriverVTableGLXP vtable = &pDriverContextGLX->vtable;
1566+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1567+ VAStatus status;
1568+
1569+ if (!pDriverContextGLX->use_tfp)
1570+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1571+
1572+ /* XXX: only support VA_FRAME_PICTURE */
1573+ if (flags != VA_FRAME_PICTURE)
1574+ return VA_STATUS_ERROR_FLAG_NOT_SUPPORTED;
1575+
1576+ /* XXX: optimise case where we are associating the same VA surface
1577+ as before an no changed occurred to it */
1578+ status = vtable->vaDeassociateSurfaceGLX(ctx, gl_surface);
1579+ if (status != VA_STATUS_SUCCESS)
1580+ return status;
1581+
1582+ x11_trap_errors();
1583+ status = ctx->vtable.vaPutSurface(ctx,
1584+ surface,
1585+ pSurfaceGLX->pixmap,
1586+ 0, 0,
1587+ pSurfaceGLX->width,
1588+ pSurfaceGLX->height,
1589+ 0, 0,
1590+ pSurfaceGLX->width,
1591+ pSurfaceGLX->height,
1592+ NULL, 0,
1593+ flags);
1594+ XSync(ctx->x11_dpy, False);
1595+ if (x11_untrap_errors() != 0)
1596+ return VA_STATUS_ERROR_OPERATION_FAILED;
1597+ if (status != VA_STATUS_SUCCESS)
1598+ return status;
1599+
1600+ pSurfaceGLX->surface = surface;
1601+ return VA_STATUS_SUCCESS;
1602+}
1603+
1604+static VAStatus
1605+vaDeassociateSurfaceGLX_impl_libva(VADriverContextP ctx, void *gl_surface)
1606+{
1607+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1608+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1609+
1610+ if (!pDriverContextGLX->use_tfp)
1611+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1612+
1613+ if (unbind_pixmap(ctx, pSurfaceGLX) < 0)
1614+ return VA_STATUS_ERROR_OPERATION_FAILED;
1615+
1616+ pSurfaceGLX->surface = VA_INVALID_SURFACE;
1617+ return VA_STATUS_SUCCESS;
1618+}
1619+
1620+static VAStatus
1621+vaSyncSurfaceGLX_impl_libva(VADriverContextP ctx, void *gl_surface)
1622+{
1623+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1624+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1625+
1626+ if (!pDriverContextGLX->use_tfp)
1627+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1628+
1629+ if (pSurfaceGLX->surface == VA_INVALID_SURFACE)
1630+ return VA_STATUS_ERROR_INVALID_SURFACE;
1631+
1632+ return ctx->vtable.vaSyncSurface(ctx, pSurfaceGLX->surface);
1633+}
1634+
1635+static VAStatus
1636+vaBeginRenderSurfaceGLX_impl_libva(VADriverContextP ctx, void *gl_surface)
1637+{
1638+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1639+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1640+ VAStatus status;
1641+
1642+ if (!pDriverContextGLX->use_tfp)
1643+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1644+
1645+ status = vaSyncSurfaceGLX_impl_libva(ctx, gl_surface);
1646+ if (status != VA_STATUS_SUCCESS)
1647+ return status;
1648+
1649+ if (bind_pixmap(ctx, pSurfaceGLX) < 0)
1650+ return VA_STATUS_ERROR_OPERATION_FAILED;
1651+
1652+ return VA_STATUS_SUCCESS;
1653+}
1654+
1655+static VAStatus
1656+vaEndRenderSurfaceGLX_impl_libva(VADriverContextP ctx, void *gl_surface)
1657+{
1658+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1659+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1660+ VAStatus status;
1661+
1662+ if (!pDriverContextGLX->use_tfp)
1663+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1664+
1665+ if (unbind_pixmap(ctx, pSurfaceGLX) < 0)
1666+ return VA_STATUS_ERROR_OPERATION_FAILED;
1667+
1668+ return VA_STATUS_SUCCESS;
1669+}
1670+
1671+static VAStatus
1672+vaCopySurfaceGLX_impl_libva(
1673+ VADriverContextP ctx,
1674+ void *gl_surface,
1675+ VASurfaceID surface,
1676+ unsigned int flags
1677+)
1678+{
1679+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1680+ VADriverVTableGLXP vtable = &pDriverContextGLX->vtable;
1681+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1682+ VAStatus status;
1683+
1684+ if (!pDriverContextGLX->use_fbo)
1685+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1686+
1687+ /* XXX: only support VA_FRAME_PICTURE */
1688+ if (flags != VA_FRAME_PICTURE)
1689+ return VA_STATUS_ERROR_FLAG_NOT_SUPPORTED;
1690+
1691+ /* Associate VA surface */
1692+ status = vtable->vaAssociateSurfaceGLX(ctx, gl_surface, surface, flags);
1693+ if (status != VA_STATUS_SUCCESS)
1694+ return status;
1695+
1696+ /* Make sure binding succeeds, if texture was not already bound */
1697+ struct OpenGLTextureState ts;
1698+ if (bind_texture(&ts, pSurfaceGLX->target, pSurfaceGLX->texture) < 0)
1699+ return VA_STATUS_ERROR_OPERATION_FAILED;
1700+
1701+ /* Render to FBO */
1702+ fbo_enter(ctx, pSurfaceGLX);
1703+ status = vtable->vaBeginRenderSurfaceGLX(ctx, gl_surface);
1704+ if (status == VA_STATUS_SUCCESS) {
1705+ render_pixmap(ctx, pSurfaceGLX);
1706+ status = vtable->vaEndRenderSurfaceGLX(ctx, gl_surface);
1707+ }
1708+ fbo_leave(ctx);
1709+ unbind_texture(&ts);
1710+ if (status != VA_STATUS_SUCCESS)
1711+ return status;
1712+
1713+ return vtable->vaDeassociateSurfaceGLX(ctx, gl_surface);
1714+}
1715+
1716+
1717+/* ========================================================================= */
1718+/* === VA/GLX bind functions implementation with vaCopySurfaceGLX() === */
1719+/* ========================================================================= */
1720+
1721+static VAStatus
1722+vaAssociateSurfaceGLX_impl_bind(
1723+ VADriverContextP ctx,
1724+ void *gl_surface,
1725+ VASurfaceID surface,
1726+ unsigned int flags
1727+)
1728+{
1729+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1730+ VADriverVTableGLXP vtable = &pDriverContextGLX->vtable;
1731+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1732+ VAStatus status;
1733+
1734+ if (!pDriverContextGLX->has_copy)
1735+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1736+
1737+ status = vtable->vaCopySurfaceGLX(ctx, gl_surface, surface, flags);
1738+ if (status != VA_STATUS_SUCCESS)
1739+ return status;
1740+
1741+ pSurfaceGLX->surface = surface;
1742+ return VA_STATUS_SUCCESS;
1743+}
1744+
1745+static VAStatus
1746+vaDeassociateSurfaceGLX_impl_bind(VADriverContextP ctx, void *gl_surface)
1747+{
1748+ VADriverContextGLXP pDriverContextGLX = VA_DRIVER_CONTEXT_GLX(ctx);
1749+ VASurfaceGLXP pSurfaceGLX = gl_surface;
1750+
1751+ if (!pDriverContextGLX->has_copy)
1752+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1753+
1754+ pSurfaceGLX->surface = VA_INVALID_SURFACE;
1755+ return VA_STATUS_SUCCESS;
1756+}
1757+
1758+static VAStatus
1759+vaBeginRenderSurfaceGLX_impl_bind(VADriverContextP ctx, void *gl_surface)
1760+{
1761+ /* Surface is already copied into the texture, in vaAssociateSurfaceGLX() */
1762+ return VA_STATUS_SUCCESS;
1763+}
1764+
1765+static VAStatus
1766+vaEndRenderSurfaceGLX_impl_bind(VADriverContextP ctx, void *gl_surface)
1767+{
1768+ return VA_STATUS_SUCCESS;
1769+}
1770+
1771+
1772+/* ========================================================================= */
1773+/* === Private VA/GLX vtable initialization === */
1774+/* ========================================================================= */
1775+
1776+// Initialize GLX driver context
1777+VAStatus va_glx_init_context(VADriverContextP ctx)
1778+{
1779+ VADriverContextGLXP glx_ctx = VA_DRIVER_CONTEXT_GLX(ctx);
1780+ VADriverVTableGLXP vtable = &glx_ctx->vtable;
1781+ int needs_tfp = 0, needs_fbo = 0;
1782+
1783+ if (glx_ctx->is_initialized)
1784+ return VA_STATUS_SUCCESS;
1785+
1786+ glx_ctx->has_copy = ctx->vtable.glx.vaCopySurfaceGLX != NULL;
1787+ glx_ctx->has_bind = (ctx->vtable.glx.vaAssociateSurfaceGLX != NULL &&
1788+ ctx->vtable.glx.vaBeginRenderSurfaceGLX != NULL &&
1789+ ctx->vtable.glx.vaEndRenderSurfaceGLX != NULL &&
1790+ ctx->vtable.glx.vaDeassociateSurfaceGLX != NULL);
1791+
1792+ switch ((((unsigned int)glx_ctx->has_bind) << 1) | glx_ctx->has_copy) {
1793+ case 0:
1794+ /* Full implementation in libVA */
1795+ needs_tfp = 1;
1796+ needs_fbo = 1;
1797+ vtable->vaCreateSurfaceGLX = vaCreateSurfaceGLX_impl_libva;
1798+ vtable->vaDestroySurfaceGLX = vaDestroySurfaceGLX_impl_libva;
1799+ vtable->vaAssociateSurfaceGLX = vaAssociateSurfaceGLX_impl_libva;
1800+ vtable->vaDeassociateSurfaceGLX = vaDeassociateSurfaceGLX_impl_libva;
1801+ vtable->vaBeginRenderSurfaceGLX = vaBeginRenderSurfaceGLX_impl_libva;
1802+ vtable->vaEndRenderSurfaceGLX = vaEndRenderSurfaceGLX_impl_libva;
1803+ vtable->vaSyncSurfaceGLX = vaSyncSurfaceGLX_impl_libva;
1804+ vtable->vaCopySurfaceGLX = vaCopySurfaceGLX_impl_libva;
1805+ break;
1806+ case 1:
1807+ /* Add bind functions based on vaCopySurfaceGLX() */
1808+ /* XXX: override vaSyncSurfaceGLX()? */
1809+ vtable->vaCreateSurfaceGLX = vaCreateSurfaceGLX_impl_driver;
1810+ vtable->vaDestroySurfaceGLX = vaDestroySurfaceGLX_impl_driver;
1811+ vtable->vaAssociateSurfaceGLX = vaAssociateSurfaceGLX_impl_bind;
1812+ vtable->vaDeassociateSurfaceGLX = vaDeassociateSurfaceGLX_impl_bind;
1813+ vtable->vaBeginRenderSurfaceGLX = vaBeginRenderSurfaceGLX_impl_bind;
1814+ vtable->vaEndRenderSurfaceGLX = vaEndRenderSurfaceGLX_impl_bind;
1815+ vtable->vaSyncSurfaceGLX = vaSyncSurfaceGLX_impl_driver;
1816+ vtable->vaCopySurfaceGLX = vaCopySurfaceGLX_impl_driver;
1817+ break;
1818+ case 2:
1819+ /* Add copy function based on vaBeginRenderSurfaceGLX() et al. */
1820+ needs_fbo = 1;
1821+ vtable->vaCreateSurfaceGLX = vaCreateSurfaceGLX_impl_driver;
1822+ vtable->vaDestroySurfaceGLX = vaDestroySurfaceGLX_impl_driver;
1823+ vtable->vaAssociateSurfaceGLX = vaAssociateSurfaceGLX_impl_driver;
1824+ vtable->vaDeassociateSurfaceGLX = vaDeassociateSurfaceGLX_impl_driver;
1825+ vtable->vaBeginRenderSurfaceGLX = vaBeginRenderSurfaceGLX_impl_driver;
1826+ vtable->vaEndRenderSurfaceGLX = vaEndRenderSurfaceGLX_impl_driver;
1827+ vtable->vaSyncSurfaceGLX = vaSyncSurfaceGLX_impl_driver;
1828+ vtable->vaCopySurfaceGLX = vaCopySurfaceGLX_impl_libva;
1829+ break;
1830+ case 3:
1831+ /* Keep driver bind & copy functions */
1832+ vtable->vaCreateSurfaceGLX = vaCreateSurfaceGLX_impl_driver;
1833+ vtable->vaDestroySurfaceGLX = vaDestroySurfaceGLX_impl_driver;
1834+ vtable->vaAssociateSurfaceGLX = vaAssociateSurfaceGLX_impl_driver;
1835+ vtable->vaDeassociateSurfaceGLX = vaDeassociateSurfaceGLX_impl_driver;
1836+ vtable->vaBeginRenderSurfaceGLX = vaBeginRenderSurfaceGLX_impl_driver;
1837+ vtable->vaEndRenderSurfaceGLX = vaEndRenderSurfaceGLX_impl_driver;
1838+ vtable->vaSyncSurfaceGLX = vaSyncSurfaceGLX_impl_driver;
1839+ vtable->vaCopySurfaceGLX = vaCopySurfaceGLX_impl_driver;
1840+ break;
1841+ default:
1842+ /* Fatal error: this cannot happen */
1843+ assert(0);
1844+ return VA_STATUS_ERROR_UNKNOWN;
1845+ }
1846+
1847+ glx_ctx->has_tfp = 0;
1848+ glx_ctx->use_tfp = 0;
1849+ glx_ctx->has_fbo = 0;
1850+ glx_ctx->use_fbo = 0;
1851+
1852+ if (needs_tfp) {
1853+ glx_ctx->has_tfp = check_tfp_extensions(ctx);
1854+ if (!glx_ctx->has_tfp || !load_tfp_extensions(ctx))
1855+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1856+ glx_ctx->use_tfp = 1;
1857+ }
1858+
1859+ if (needs_fbo) {
1860+ glx_ctx->has_fbo = check_fbo_extensions(ctx);
1861+ if (!glx_ctx->has_fbo || !load_fbo_extensions(ctx))
1862+ return VA_STATUS_ERROR_UNIMPLEMENTED;
1863+ glx_ctx->use_fbo = 1;
1864+ }
1865+
1866+ glx_ctx->is_initialized = 1;
1867+ return VA_STATUS_SUCCESS;
1868+}
1869diff --git a/src/glx/va_glx_impl.h b/src/glx/va_glx_impl.h
1870new file mode 100644
1871index 0000000..977bfcc
1872--- /dev/null
1873+++ b/src/glx/va_glx_impl.h
1874@@ -0,0 +1,46 @@
1875+/*
1876+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
1877+ *
1878+ * Permission is hereby granted, free of charge, to any person obtaining a
1879+ * copy of this software and associated documentation files (the
1880+ * "Software"), to deal in the Software without restriction, including
1881+ * without limitation the rights to use, copy, modify, merge, publish,
1882+ * distribute, sub license, and/or sell copies of the Software, and to
1883+ * permit persons to whom the Software is furnished to do so, subject to
1884+ * the following conditions:
1885+ *
1886+ * The above copyright notice and this permission notice (including the
1887+ * next paragraph) shall be included in all copies or substantial portions
1888+ * of the Software.
1889+ *
1890+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1891+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1892+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
1893+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
1894+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1895+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1896+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1897+ */
1898+
1899+#ifndef VA_GLX_IMPL_H
1900+#define VA_GLX_IMPL_H
1901+
1902+/**
1903+ * Initialize GLX driver context
1904+ *
1905+ * @param[in] ctx the VA driver context
1906+ * @return VA_STATUS_SUCCESS if successful
1907+ */
1908+VAStatus va_glx_init_context(VADriverContextP ctx)
1909+ ATTRIBUTE_HIDDEN;
1910+
1911+/** Create VA/GLX surface */
1912+VASurfaceGLXP
1913+va_glx_create_surface(VADriverContextP ctx, GLenum target, GLuint texture)
1914+ ATTRIBUTE_HIDDEN;
1915+
1916+/** Destroy VA/GLX surface */
1917+void va_glx_destroy_surface(VADriverContextP ctx, VASurfaceGLXP *pSurfaceGLX)
1918+ ATTRIBUTE_HIDDEN;
1919+
1920+#endif /* VA_GLX_IMPL_H */
1921diff --git a/src/glx/va_glx_private.h b/src/glx/va_glx_private.h
1922new file mode 100644
1923index 0000000..8658ad3
1924--- /dev/null
1925+++ b/src/glx/va_glx_private.h
1926@@ -0,0 +1,98 @@
1927+/*
1928+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
1929+ *
1930+ * Permission is hereby granted, free of charge, to any person obtaining a
1931+ * copy of this software and associated documentation files (the
1932+ * "Software"), to deal in the Software without restriction, including
1933+ * without limitation the rights to use, copy, modify, merge, publish,
1934+ * distribute, sub license, and/or sell copies of the Software, and to
1935+ * permit persons to whom the Software is furnished to do so, subject to
1936+ * the following conditions:
1937+ *
1938+ * The above copyright notice and this permission notice (including the
1939+ * next paragraph) shall be included in all copies or substantial portions
1940+ * of the Software.
1941+ *
1942+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1943+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1944+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
1945+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
1946+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1947+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1948+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1949+ */
1950+
1951+#ifndef VA_GLX_PRIVATE_H
1952+#define VA_GLX_PRIVATE_H
1953+
1954+#include "config.h"
1955+#include "va.h"
1956+#include "va_backend.h"
1957+#include "va_x11.h"
1958+#include "va_glx.h"
1959+
1960+#if GLX_GLXEXT_VERSION < 18
1961+typedef void (*PFNGLXBINDTEXIMAGEEXTPROC)(Display *, GLXDrawable, int, const int *);
1962+typedef void (*PFNGLXRELEASETEXIMAGEEXTPROC)(Display *, GLXDrawable, int);
1963+#endif
1964+
1965+typedef struct VAOpenGLVTable *VAOpenGLVTableP;
1966+
1967+struct VAOpenGLVTable {
1968+ PFNGLXBINDTEXIMAGEEXTPROC glx_bind_tex_image;
1969+ PFNGLXRELEASETEXIMAGEEXTPROC glx_release_tex_image;
1970+ PFNGLGENFRAMEBUFFERSEXTPROC gl_gen_framebuffers;
1971+ PFNGLDELETEFRAMEBUFFERSEXTPROC gl_delete_framebuffers;
1972+ PFNGLBINDFRAMEBUFFEREXTPROC gl_bind_framebuffer;
1973+ PFNGLGENRENDERBUFFERSEXTPROC gl_gen_renderbuffers;
1974+ PFNGLDELETERENDERBUFFERSEXTPROC gl_delete_renderbuffers;
1975+ PFNGLBINDRENDERBUFFEREXTPROC gl_bind_renderbuffer;
1976+ PFNGLRENDERBUFFERSTORAGEEXTPROC gl_renderbuffer_storage;
1977+ PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC gl_framebuffer_renderbuffer;
1978+ PFNGLFRAMEBUFFERTEXTURE2DEXTPROC gl_framebuffer_texture_2d;
1979+ PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC gl_check_framebuffer_status;
1980+};
1981+
1982+typedef struct VADisplayContextGLX *VADisplayContextGLXP;
1983+typedef struct VADriverContextGLX *VADriverContextGLXP;
1984+typedef struct VASurfaceGLX *VASurfaceGLXP;
1985+typedef struct VADriverVTableGLX *VADriverVTableGLXP;
1986+
1987+struct VADisplayContextGLX {
1988+ void (*vaDestroy)(VADisplayContextP ctx);
1989+};
1990+
1991+#define VA_DRIVER_CONTEXT_GLX(ctx) ((VADriverContextGLXP)((ctx)->glx))
1992+
1993+struct VADriverContextGLX {
1994+ struct VADriverVTableGLX vtable;
1995+ struct VAOpenGLVTable gl_vtable;
1996+ unsigned int is_initialized : 1;
1997+ unsigned int has_copy : 1;
1998+ unsigned int has_bind : 1;
1999+ unsigned int has_tfp : 1;
2000+ unsigned int has_fbo : 1;
2001+ unsigned int use_tfp : 1;
2002+ unsigned int use_fbo : 1;
2003+};
2004+
2005+/** Unique VASurfaceGLX identifier */
2006+#define VA_SURFACE_GLX_MAGIC VA_FOURCC('V','A','G','L')
2007+
2008+struct VASurfaceGLX {
2009+ uint32_t magic; ///< Magic number identifying a VASurfaceGLX
2010+ GLenum target; ///< GL target to which the texture is bound
2011+ GLuint texture; ///< GL texture
2012+ VASurfaceID surface; ///< Associated VA surface
2013+ unsigned int width;
2014+ unsigned int height;
2015+ int is_bound;
2016+ Pixmap pixmap;
2017+ GLXPixmap glx_pixmap;
2018+ GLuint fbo;
2019+ GLuint fbo_buffer;
2020+ GLuint fbo_texture;
2021+ void *priv; ///< Private VA/GLX surface data from driver
2022+};
2023+
2024+#endif /* VA_GLX_PRIVATE_H */
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/390_compat.base.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/390_compat.base.patch
deleted file mode 100644
index f2e0d61b..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/390_compat.base.patch
+++ /dev/null
@@ -1,135 +0,0 @@
1commit 483bc9e67afa9bcd8f99f08a74a78e7dfad4651f
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Thu Jul 2 09:24:04 2009 +0000
4
5 Fix make dist (va_compat_template.h).
6
7commit 0e0da9ea861f14e8129767dbf6f11be5c051d85f
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Wed Jun 24 11:40:56 2009 +0000
10
11 Add compatibility layer with original libva 0.29.
12
13--- a/src/Makefile.am
14+++ b/src/Makefile.am
15@@ -44,7 +44,7 @@ libva_x11_la_DEPENDENCIES = $(libvacorelib)
16 libva_x11_la_DEPENDENCIES = $(libvacorelib)
17
18
19-libva_la_SOURCES = va.c
20+libva_la_SOURCES = va.c va_compat.c
21
22 libvaincludedir = ${includedir}/va
23 libvainclude_HEADERS = va.h va_backend.h va_version.h
24@@ -53,4 +53,8 @@ DISTCLEANFILES = \
25 va_version.h
26
27 EXTRA_DIST = \
28- va_version.h.in
29+ va_version.h.in \
30+ va_compat.h \
31+ va_compat_template.h
32+
33+va_compat.c: va_compat_template.h
34--- a/src/va.c
35+++ b/src/va.c
36@@ -25,6 +25,7 @@
37 #define _GNU_SOURCE 1
38 #include "va.h"
39 #include "va_backend.h"
40+#include "va_compat.h"
41
42 #include <assert.h>
43 #include <stdarg.h>
44@@ -41,6 +42,8 @@
45
46 #define DRIVER_INIT_FUNC "__vaDriverInit_0_31"
47 #define DRIVER_INIT_FUNC_SDS "__vaDriverInit_0_31_sds"
48+#define DRIVER_INIT_FUNC_0_29 "__vaDriverInit_0_29"
49+#define DRIVER_INIT_FUNC_0_30 "__vaDriverInit_0_30"
50
51 #define DRIVER_EXTENSION "_drv_video.so"
52
53@@ -168,11 +171,22 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
54 else
55 {
56 VADriverInit init_func;
57- init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC);
58+ int compat_version = 0;
59+ /* First, try SDS extensions (VDPAU and XvBA backends) */
60+ init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC_SDS);
61 if (!init_func)
62 {
63- /* Then try SDS extensions (VDPAU and XvBA backends) */
64- init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC_SDS);
65+ /* Otherwise, we need the compatibility layer for some buffers */
66+ init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC);
67+ compat_version = VA_MINOR_VERSION;
68+ if (!init_func) {
69+ init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC_0_29);
70+ compat_version = 29;
71+ }
72+ if (!init_func) {
73+ init_func = (VADriverInit) dlsym(handle, DRIVER_INIT_FUNC_0_30);
74+ compat_version = 30;
75+ }
76 }
77 if (!init_func)
78 {
79@@ -181,7 +195,36 @@ static VAStatus va_openDriver(VADisplay dpy, char *driver_name)
80 }
81 else
82 {
83- vaStatus = (*init_func)(ctx);
84+ struct VADriverContext_0_29 ctx_0_29;
85+ struct VADriverContext_0_30 ctx_0_30;
86+ void *compat_ctx = NULL;
87+
88+ switch (compat_version) {
89+ case 29:
90+ compat_ctx = &ctx_0_29;
91+ ctx_0_29.pDriverData = NULL;
92+ ctx_0_29.x11_dpy = ctx->x11_dpy;
93+ ctx_0_29.x11_screen = ctx->x11_screen;
94+ break;
95+ case 30:
96+ compat_ctx = &ctx_0_30;
97+ ctx_0_30.pDriverData = NULL;
98+ ctx_0_30.x11_dpy = ctx->x11_dpy;
99+ ctx_0_30.x11_screen = ctx->x11_screen;
100+ break;
101+ case VA_MINOR_VERSION:
102+ compat_ctx = ctx;
103+ break;
104+ default:
105+ ASSERT(compat_version == 0);
106+ vaStatus = VA_STATUS_ERROR_UNKNOWN;
107+ break;
108+ }
109+
110+ vaStatus = (*init_func)(compat_ctx ? compat_ctx : ctx);
111+
112+ if (VA_STATUS_SUCCESS == vaStatus)
113+ vaStatus = va_compat_init(dpy, compat_version, compat_ctx);
114
115 if (VA_STATUS_SUCCESS == vaStatus)
116 {
117@@ -377,6 +422,8 @@ VAStatus vaTerminate (
118 old_ctx->handle = NULL;
119 }
120
121+ va_compat_fini(dpy);
122+
123 if (VA_STATUS_SUCCESS == vaStatus)
124 pDisplayContext->vaDestroy(pDisplayContext);
125 return vaStatus;
126--- a/src/va_backend.h
127+++ b/src/va_backend.h
128@@ -426,6 +426,7 @@ struct VADriverContext
129
130 void *dri_state;
131 void *glx; /* opaque for GLX code */
132+ void *compat; /* opaque for compat code */
133 };
134
135 struct VADisplayContext
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch
deleted file mode 100644
index 5e09d22b..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/391_compat.patch
+++ /dev/null
@@ -1,3273 +0,0 @@
1commit 2e7aa803a8547dfcde6e97ae2bb4a8bbdbb2634e
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Mon Nov 23 12:22:09 2009 +0000
4
5 Update compat code for VDPAU/MPEG-4 additions.
6
7commit 30808b39d82cbf0c185052a2d2d5ed8a5fc065d1
8Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
9Date: Thu Sep 10 14:01:57 2009 +0000
10
11 Update compatibility glue for VASliceParameterBufferMPEG2.slice_horizontal_position addition.
12
13commit 27faf49366602637da223f3dc5f30ce4d6d72070
14Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
15Date: Wed Sep 2 15:06:20 2009 +0000
16
17 Fix vaSyncSurface() compat code for VA API < 0.31 drivers.
18
19commit dc33a3e28b38b7d579ab768899963cf9b0d38677
20Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
21Date: Wed Sep 2 12:28:43 2009 +0000
22
23 Fix check for 0.30 modules.
24
25commit bd913971bd9e7460b454513b006e16c18136625e
26Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
27Date: Wed Sep 2 11:58:08 2009 +0000
28
29 Update for VA API 0.31.
30
31commit 9cc7f89d3cc0238ab5b3a47c316e261e06a16634
32Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
33Date: Thu Jul 2 15:55:48 2009 +0000
34
35 Fix VAEncSliceParameterBuffer thunk.
36
37commit 483bc9e67afa9bcd8f99f08a74a78e7dfad4651f
38Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
39Date: Thu Jul 2 09:24:04 2009 +0000
40
41 Fix make dist (va_compat_template.h).
42
43commit 7f41b22366142c4e476fbae929ad343dc33af3a4
44Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
45Date: Thu Jun 25 14:05:57 2009 +0000
46
47 Drop superfluous semi-colon.
48
49commit dcc75aae23fc8f653179b6a331f4021acd6775fd
50Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
51Date: Thu Jun 25 13:53:26 2009 +0000
52
53 Fix check for 0.30 modules.
54
55commit b34512e74ac4150a3f8ee4abe4fa5b17907f8869
56Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
57Date: Thu Jun 25 13:17:48 2009 +0000
58
59 Fix vaTerminate() thunk.
60
61commit 3b006d1ac66429f6b8ffff00ce60e1e47a32c02c
62Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
63Date: Thu Jun 25 12:48:22 2009 +0000
64
65 Cosmetics.
66
67commit 452295d5ac34643f8a316491888c3900f12c5bff
68Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
69Date: Thu Jun 25 12:18:48 2009 +0000
70
71 Fix compatibility with 0.29 modules.
72
73commit 0e0da9ea861f14e8129767dbf6f11be5c051d85f
74Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
75Date: Wed Jun 24 11:40:56 2009 +0000
76
77 Add compatibility layer with original libva 0.29.
78
79diff --git a/src/va_compat.c b/src/va_compat.c
80new file mode 100644
81index 0000000..0bd7385
82--- /dev/null
83+++ b/src/va_compat.c
84@@ -0,0 +1,1171 @@
85+/*
86+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
87+ *
88+ * Permission is hereby granted, free of charge, to any person obtaining a
89+ * copy of this software and associated documentation files (the
90+ * "Software"), to deal in the Software without restriction, including
91+ * without limitation the rights to use, copy, modify, merge, publish,
92+ * distribute, sub license, and/or sell copies of the Software, and to
93+ * permit persons to whom the Software is furnished to do so, subject to
94+ * the following conditions:
95+ *
96+ * The above copyright notice and this permission notice (including the
97+ * next paragraph) shall be included in all copies or substantial portions
98+ * of the Software.
99+ *
100+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
101+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
102+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
103+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
104+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
105+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
106+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
107+ */
108+
109+#include "config.h"
110+#include "va.h"
111+#include "va_compat.h"
112+#include "va_backend.h"
113+#include <string.h>
114+#include <alloca.h>
115+#include <assert.h>
116+
117+#define CTX(dpy) (((VADisplayContextP)dpy)->pDriverContext)
118+#define COMPAT_CTX(ctx) ((VACompatContextP)(ctx)->compat)
119+#define ASSERT assert
120+
121+/* Invoke the normal VA API entry-point. This one can be replaced with
122+ one of the va_compat_*() functions */
123+#define VA_INVOKE(FUNC, CTX, ...) \
124+ (CTX)->vtable.FUNC(CTX, __VA_ARGS__)
125+
126+/* Invoke the real VA API entry-point. That is, the driver's function */
127+#define VA_INVOKE_COMPAT_ARGS(CTX, ...) \
128+ (COMPAT_CTX(CTX)->compat_ctx, __VA_ARGS__)
129+#define VA_INVOKE_COMPAT(FUNC, CTX, ...) \
130+ COMPAT_CTX(CTX)->vtable.FUNC VA_INVOKE_COMPAT_ARGS(CTX, __VA_ARGS__)
131+
132+typedef struct VACompatContext *VACompatContextP;
133+
134+typedef VAStatus (*VABufferTranslateFunc)(VACompatContextP ctx, void *dest, const void *src);
135+
136+typedef enum {
137+ VA_DRIVER_ID_UNKNOWN,
138+ VA_DRIVER_ID_POULSBO,
139+ VA_DRIVER_ID_IEGD
140+} VADriverID;
141+
142+typedef struct {
143+ VABufferID id;
144+ VABufferType type;
145+ unsigned int size;
146+ unsigned int num_elements;
147+ unsigned char *data;
148+ VABufferTranslateFunc translate;
149+ VABufferID compat_id;
150+ unsigned int compat_size;
151+ unsigned char *compat_data;
152+ unsigned int map_count;
153+} VABufferCompat;
154+
155+typedef struct VAContextMap *VAContextMapP;
156+typedef struct VAContextMap {
157+ VASurfaceID surface;
158+ VAContextID context;
159+ VAContextMapP next;
160+} VAContextMap;
161+
162+typedef struct {
163+ VAStatus (*vaTerminate)(void *);
164+ VAStatus (*vaQueryConfigProfiles)(void *, VAProfile *, int *);
165+ VAStatus (*vaQueryConfigEntrypoints)(void *, VAProfile, VAEntrypoint *, int *);
166+ VAStatus (*vaGetConfigAttributes)(void *, VAProfile, VAEntrypoint, VAConfigAttrib *, int);
167+ VAStatus (*vaCreateConfig)(void *, VAProfile, VAEntrypoint, VAConfigAttrib *, int, VAConfigID *);
168+ VAStatus (*vaDestroyConfig)(void *, VAConfigID);
169+ VAStatus (*vaQueryConfigAttributes)(void *, VAConfigID, VAProfile *, VAEntrypoint *, VAConfigAttrib *, int *);
170+ VAStatus (*vaCreateSurfaces)(void *, int, int, int, int, VASurfaceID *);
171+ VAStatus (*vaDestroySurfaces)(void *, VASurfaceID *, int);
172+ VAStatus (*vaCreateContext)(void *, VAConfigID, int, int, int, VASurfaceID *, int, VAContextID *);
173+ VAStatus (*vaDestroyContext)(void *, VAContextID);
174+ VAStatus (*vaCreateBuffer)(void *, VAContextID, VABufferType, unsigned int, unsigned int, void *, VABufferID *);
175+ VAStatus (*vaBufferSetNumElements)(void *, VABufferID, unsigned int);
176+ VAStatus (*vaMapBuffer)(void *, VABufferID, void **);
177+ VAStatus (*vaUnmapBuffer)(void *, VABufferID);
178+ VAStatus (*vaDestroyBuffer)(void *, VABufferID);
179+ VAStatus (*vaBeginPicture)(void *, VAContextID, VASurfaceID);
180+ VAStatus (*vaRenderPicture)(void *, VAContextID, VABufferID *, int);
181+ VAStatus (*vaEndPicture)(void *, VAContextID);
182+ VAStatus (*vaSyncSurface_pre31)(void *, VAContextID, VASurfaceID);
183+ VAStatus (*vaQuerySurfaceStatus)(void *, VASurfaceID, VASurfaceStatus *);
184+ VAStatus (*vaPutSurface)(void *, VASurfaceID, unsigned long, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, VARectangle *, unsigned int, unsigned int);
185+ VAStatus (*vaQueryImageFormats)(void *, VAImageFormat *, int *);
186+ VAStatus (*vaCreateImage)(void *, VAImageFormat *, int, int, VAImage *);
187+ VAStatus (*vaDeriveImage)(void *, VASurfaceID, VAImage *);
188+ VAStatus (*vaDestroyImage)(void *, VAImageID);
189+ VAStatus (*vaSetImagePalette)(void *, VAImageID, unsigned char *);
190+ VAStatus (*vaGetImage)(void *, VASurfaceID, int, int, unsigned int, unsigned int, VAImageID);
191+ VAStatus (*vaPutImage_pre31)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int);
192+ VAStatus (*vaPutImage2_pre31)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int, unsigned int, unsigned int);
193+ VAStatus (*vaQuerySubpictureFormats)(void *, VAImageFormat *, unsigned int *, unsigned int *);
194+ VAStatus (*vaCreateSubpicture)(void *, VAImageID, VASubpictureID *);
195+ VAStatus (*vaDestroySubpicture)(void *, VASubpictureID);
196+ VAStatus (*vaSetSubpictureImage)(void *, VASubpictureID, VAImageID);
197+ VAStatus (*vaSetSubpictureChromakey)(void *, VASubpictureID, unsigned int, unsigned int, unsigned int);
198+ VAStatus (*vaSetSubpictureGlobalAlpha)(void *, VASubpictureID, float);
199+ VAStatus (*vaAssociateSubpicture_pre31)(void *, VASubpictureID, VASurfaceID *, int, short, short, short, short, unsigned short, unsigned short, unsigned int);
200+ VAStatus (*vaAssociateSubpicture2_pre31)(void *, VASubpictureID, VASurfaceID *, int, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, unsigned int);
201+ VAStatus (*vaDeassociateSubpicture)(void *, VASubpictureID, VASurfaceID *, int);
202+ VAStatus (*vaQueryDisplayAttributes)(void *, VADisplayAttribute *, int *);
203+ VAStatus (*vaGetDisplayAttributes)(void *, VADisplayAttribute *, int);
204+ VAStatus (*vaSetDisplayAttributes)(void *, VADisplayAttribute *, int);
205+
206+ /* 0.29 hooks */
207+ VAStatus (*vaSetSubpicturePalette)(void *, VASubpictureID, unsigned char *);
208+ VAStatus (*vaDbgCopySurfaceToBuffer)(void *, VASurfaceID, void **, unsigned int *);
209+
210+ /* 0.30 hooks */
211+ VAStatus (*vaCreateSurfaceFromCIFrame)(void *, unsigned long, VASurfaceID *);
212+ VAStatus (*vaCreateSurfaceFromV4L2Buf)(void *, int, struct v4l2_format *, struct v4l2_buffer *, VASurfaceID *);
213+ VAStatus (*vaCopySurfaceToBuffer)(void *, VASurfaceID, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, unsigned int *, void **);
214+
215+ /* 0.31 hooks */
216+ VAStatus (*vaPutImage)(void *, VASurfaceID, VAImageID, int, int, unsigned int, unsigned int, int, int, unsigned int, unsigned int);
217+ VAStatus (*vaAssociateSubpicture)(void *, VASubpictureID, VASurfaceID *, int, short, short, unsigned short, unsigned short, short, short, unsigned short, unsigned short, unsigned int);
218+ VAStatus (*vaSyncSurface)(void *, VASurfaceID);
219+} VACompatDriverVTable;
220+
221+typedef struct VACompatContext {
222+ VABufferCompat *buffers;
223+ unsigned int buffers_count_max;
224+ unsigned int compat_version;
225+ void *compat_ctx;
226+ VACompatDriverVTable vtable; /* original vtable */
227+ VADriverID driver_id;
228+ char *driver_name;
229+ VAContextMapP context_map;
230+ VAContextMapP last_context_map_match;
231+ unsigned int skip_frame : 1;
232+} VACompatContext;
233+
234+#define COMPAT_MAJOR 0
235+#define COMPAT_MINOR 29
236+#include "va_compat_template.h"
237+
238+#define COMPAT_MAJOR 0
239+#define COMPAT_MINOR 30
240+#include "va_compat_template.h"
241+
242+#define COMPAT_MAJOR 0
243+#define COMPAT_MINOR 31
244+#include "va_compat_template.h"
245+
246+static inline int va_IsIntelBuffer(VADriverContextP ctx, VABufferID id)
247+{
248+ VACompatContextP compat = ctx->compat;
249+
250+ if (compat->driver_id == VA_DRIVER_ID_POULSBO) {
251+ /* There were only Intel implementations for VA API. Besides, the
252+ returned buffer IDs had the following format [ 0 BASE ID ] where
253+ BASE is the 7-bit value 0x04 and ID an index into the heap of
254+ objects */
255+ return (id & 0x7f000000) == 0x04000000;
256+ }
257+
258+ if (compat->driver_id == VA_DRIVER_ID_IEGD) {
259+ /* XXX: there is no means to differentiate the buffers, they
260+ are linearly generated (IEGD 10.0 build 1335) */
261+ return 1;
262+ }
263+
264+ return 0;
265+}
266+
267+static VAContextMapP va_context_map_lookup_p(
268+ VACompatContextP ctx,
269+ VASurfaceID surface
270+)
271+{
272+ VAContextMapP m = ctx->context_map;
273+
274+ while (m) {
275+ if (m->surface == surface)
276+ return m;
277+ m = m->next;
278+ }
279+ return NULL;
280+}
281+
282+static VAContextID va_context_map_lookup(
283+ VACompatContextP ctx,
284+ VASurfaceID surface
285+)
286+{
287+ VAContextMapP m;
288+
289+ /* Lookup in cached */
290+ m = ctx->last_context_map_match;
291+ if (m && m->surface == surface)
292+ return m->context;
293+
294+ /* Full (slow) lookup */
295+ m = va_context_map_lookup_p(ctx, surface);
296+ if (m) {
297+ ctx->last_context_map_match = m;
298+ return m->context;
299+ }
300+ return VA_INVALID_ID;
301+}
302+
303+static void va_context_map_add(
304+ VACompatContextP ctx,
305+ VAContextID context,
306+ VASurfaceID surface
307+)
308+{
309+ VAContextMapP m;
310+
311+ /* Update existing entry */
312+ m = va_context_map_lookup_p(ctx, surface);
313+ if (m) {
314+ m->context = context;
315+ return;
316+ }
317+
318+ /* Create new mapping */
319+ m = malloc(sizeof(*m));
320+ ASSERT(m);
321+ if (m) {
322+ m->surface = surface;
323+ m->context = context;
324+ m->next = ctx->context_map;
325+ ctx->context_map = m;
326+ }
327+}
328+
329+static void va_context_map_remove(
330+ VACompatContextP ctx,
331+ VAContextID context
332+)
333+{
334+ VAContextMapP p = NULL;
335+ VAContextMapP m = ctx->context_map;
336+ VAContextMapP d;
337+
338+ while (m) {
339+ if (m->context == context) {
340+ d = m;
341+
342+ /* Unlink current node */
343+ if (p)
344+ p->next = m->next;
345+ else
346+ ctx->context_map = m->next;
347+ m = m->next;
348+
349+ /* Reset cache */
350+ if (ctx->last_context_map_match == d)
351+ ctx->last_context_map_match = NULL;
352+
353+ free(d);
354+ }
355+ else {
356+ p = m;
357+ m = m->next;
358+ }
359+ }
360+}
361+
362+static VABufferCompat *va_GetBufferCompat (
363+ VADriverContextP ctx,
364+ VABufferID id
365+)
366+{
367+ VACompatContextP compat = ctx->compat;
368+ int index;
369+
370+ if (!va_IsIntelBuffer(ctx, id))
371+ return NULL;
372+
373+ index = id & 0x00ffffff;
374+ if (index >= compat->buffers_count_max)
375+ return NULL;
376+
377+ if (compat->buffers[index].id != id)
378+ return NULL;
379+
380+ return &compat->buffers[index];
381+}
382+
383+static VAStatus va_TranslateBufferCompat (
384+ VADriverContextP ctx,
385+ VABufferCompat *compat_buffer
386+)
387+{
388+ VAStatus status;
389+ unsigned char *src, *dest;
390+ int i;
391+
392+ status = VA_INVOKE(vaMapBuffer, ctx, compat_buffer->id, (void **)&src);
393+ if (status != VA_STATUS_SUCCESS)
394+ return status;
395+
396+ ASSERT(compat_buffer->data);
397+ ASSERT(src == compat_buffer->data);
398+ ASSERT(compat_buffer->compat_data);
399+ dest = compat_buffer->compat_data;
400+ for (i = 0; i < compat_buffer->num_elements; i++)
401+ {
402+ /* XXX: check errors */
403+ status = compat_buffer->translate(ctx->compat, dest, src);
404+
405+ src += compat_buffer->size;
406+ dest += compat_buffer->compat_size;
407+ }
408+
409+ return VA_INVOKE(vaUnmapBuffer, ctx, compat_buffer->id);
410+}
411+
412+static VAStatus va_CreateBufferCompat (
413+ VADriverContextP ctx,
414+ VAContextID context,
415+ VABufferID id,
416+ VABufferType type,
417+ unsigned int size,
418+ unsigned int num_elements,
419+ unsigned int compat_size,
420+ VABufferTranslateFunc translate_func
421+)
422+{
423+ VACompatContextP compat = ctx->compat;
424+ VABufferCompat *compat_buffer;
425+ int index;
426+
427+ if (!va_IsIntelBuffer(ctx, id))
428+ return VA_STATUS_ERROR_INVALID_BUFFER;
429+ index = id & 0x00ffffff;
430+
431+ /* XXX: this allocation strategy is not really space efficient... */
432+ if (index >= compat->buffers_count_max)
433+ {
434+ compat->buffers_count_max = index + 1;
435+ compat->buffers = realloc(compat->buffers,
436+ (compat->buffers_count_max *
437+ sizeof(VABufferCompat)));
438+ if (compat->buffers == NULL)
439+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
440+ }
441+
442+ compat_buffer = &compat->buffers[index];
443+ compat_buffer->id = id;
444+ compat_buffer->type = type;
445+ compat_buffer->size = size;
446+ compat_buffer->num_elements = num_elements;
447+ compat_buffer->data = NULL;
448+ compat_buffer->translate = translate_func;
449+ compat_buffer->compat_size = compat_size;
450+ compat_buffer->compat_data = NULL;
451+ compat_buffer->map_count = 0;
452+
453+ return VA_INVOKE_COMPAT(vaCreateBuffer,
454+ ctx,
455+ context,
456+ type,
457+ compat_size,
458+ num_elements,
459+ NULL,
460+ &compat_buffer->compat_id);
461+}
462+
463+static VAStatus va_DestroyBufferCompat (
464+ VADriverContextP ctx,
465+ VABufferID id
466+)
467+{
468+ VABufferCompat *compat_buffer;
469+ VAStatus status;
470+
471+ if ((compat_buffer = va_GetBufferCompat(ctx, id)) == NULL)
472+ return VA_STATUS_SUCCESS;
473+
474+ /* Force unmap if there were more maps than unmaps */
475+ if (compat_buffer->map_count > 1)
476+ compat_buffer->map_count = 1;
477+ if (compat_buffer->map_count > 1)
478+ {
479+ if ((status = VA_INVOKE(vaUnmapBuffer, ctx, id)) != VA_STATUS_SUCCESS)
480+ return status;
481+ }
482+
483+ compat_buffer->id = 0;
484+ return VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, compat_buffer->compat_id);
485+}
486+
487+static VAStatus va_compat_CreateBuffer (
488+ VADriverContextP ctx,
489+ VAContextID context, /* in */
490+ VABufferType type, /* in */
491+ unsigned int size, /* in */
492+ unsigned int num_elements, /* in */
493+ void *data, /* in */
494+ VABufferID *buf_id /* out */
495+)
496+{
497+ VABufferTranslateFunc translate_func = NULL;
498+ unsigned int compat_size = 0;
499+ VAStatus status;
500+
501+ status = VA_INVOKE_COMPAT(vaCreateBuffer,
502+ ctx,
503+ context,
504+ type,
505+ size,
506+ num_elements,
507+ data,
508+ buf_id);
509+
510+ if (status != VA_STATUS_SUCCESS)
511+ return status;
512+
513+#define INIT_TRANSLATE_FUNC_(STRUCT, MAJOR, MINOR) do { \
514+ translate_func = va_compat_translate_VA##STRUCT##_##MAJOR##_##MINOR; \
515+ compat_size = sizeof(VA##STRUCT##_##MAJOR##_##MINOR); \
516+} while (0)
517+#define INIT_TRANSLATE_FUNC(BUFFER, CODEC, MAJOR, MINOR) \
518+ INIT_TRANSLATE_FUNC_(BUFFER##Buffer##CODEC, MAJOR, MINOR)
519+
520+ /* XXX: this assumes all structures have different sizes from each other */
521+ switch (size) {
522+ case sizeof(VAPictureParameterBufferH264):
523+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
524+ {
525+ switch (ctx->version_minor) {
526+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,H264, 0,29); break;
527+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,H264, 0,30); break;
528+ }
529+ }
530+ break;
531+ case sizeof(VASliceParameterBufferH264):
532+ if (type == VASliceParameterBufferType && ctx->version_major == 0)
533+ {
534+ switch (ctx->version_minor) {
535+ case 29: INIT_TRANSLATE_FUNC(SliceParameter,H264, 0,29); break;
536+ case 30: INIT_TRANSLATE_FUNC(SliceParameter,H264, 0,30); break;
537+ }
538+ }
539+ break;
540+ case sizeof(VAPictureParameterBufferVC1):
541+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
542+ {
543+ switch (ctx->version_minor) {
544+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,VC1, 0,29); break;
545+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,VC1, 0,30); break;
546+ }
547+ }
548+ break;
549+ case sizeof(VAPictureParameterBufferMPEG2):
550+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
551+ {
552+ switch (ctx->version_minor) {
553+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,MPEG2, 0,29); break;
554+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,MPEG2, 0,30); break;
555+ }
556+ }
557+ break;
558+ case sizeof(VASliceParameterBufferMPEG2):
559+ if (type == VASliceParameterBufferType && ctx->version_major == 0)
560+ {
561+ switch (ctx->version_minor) {
562+ case 29: INIT_TRANSLATE_FUNC(SliceParameter,MPEG2, 0,29); break;
563+ case 30: INIT_TRANSLATE_FUNC(SliceParameter,MPEG2, 0,30); break;
564+ }
565+ }
566+ break;
567+ case sizeof(VAPictureParameterBufferMPEG4):
568+ if (type == VAPictureParameterBufferType && ctx->version_major == 0)
569+ {
570+ switch (ctx->version_minor) {
571+ case 29: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,29); break;
572+ case 30: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,30); break;
573+ case 31: INIT_TRANSLATE_FUNC(PictureParameter,MPEG4, 0,31); break;
574+ }
575+ }
576+ break;
577+ case sizeof(VAEncSliceParameterBuffer):
578+ if (type == VAEncSliceParameterBufferType && ctx->version_major == 0)
579+ {
580+ switch (ctx->version_minor) {
581+ case 30: INIT_TRANSLATE_FUNC_(EncSliceParameterBuffer, 0,30); break;
582+ }
583+ }
584+ break;
585+ }
586+
587+#undef INIT_TRANSLATE_FUNC
588+
589+ /* Create thunk */
590+ if (buf_id && translate_func)
591+ {
592+ ASSERT(compat_size > 0);
593+
594+ status = va_CreateBufferCompat(ctx,
595+ context,
596+ *buf_id,
597+ type,
598+ size,
599+ num_elements,
600+ compat_size,
601+ translate_func);
602+ }
603+
604+ return status;
605+}
606+
607+static VAStatus va_compat_BufferSetNumElements (
608+ VADriverContextP ctx,
609+ VABufferID buf_id, /* in */
610+ unsigned int num_elements /* in */
611+)
612+{
613+ VABufferCompat *compat_buffer;
614+ VAStatus status;
615+
616+ status = VA_INVOKE_COMPAT(vaBufferSetNumElements, ctx, buf_id, num_elements);
617+ if (status != VA_STATUS_SUCCESS)
618+ return status;
619+
620+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) != NULL)
621+ {
622+ compat_buffer->num_elements = num_elements;
623+ status = VA_INVOKE_COMPAT(vaBufferSetNumElements,
624+ ctx,
625+ compat_buffer->compat_id,
626+ num_elements);
627+ }
628+
629+ return status;
630+}
631+
632+static VAStatus va_compat_DestroyBuffer (
633+ VADriverContextP ctx,
634+ VABufferID buffer_id
635+)
636+{
637+ VAStatus status;
638+ if ((status = va_DestroyBufferCompat(ctx, buffer_id)) != VA_STATUS_SUCCESS)
639+ return status;
640+
641+ return VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, buffer_id);
642+}
643+
644+static VAStatus va_compat_MapBuffer (
645+ VADriverContextP ctx,
646+ VABufferID buf_id, /* in */
647+ void **pbuf /* out */
648+)
649+{
650+ VABufferCompat *compat_buffer;
651+ VAStatus status;
652+
653+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) == NULL)
654+ return VA_INVOKE_COMPAT(vaMapBuffer, ctx, buf_id, pbuf);
655+
656+ if (compat_buffer->map_count++ == 0)
657+ {
658+ status = VA_INVOKE_COMPAT(vaMapBuffer, ctx, buf_id, (void **)&compat_buffer->data);
659+ if (status != VA_STATUS_SUCCESS)
660+ return status;
661+
662+ status = VA_INVOKE_COMPAT(vaMapBuffer, ctx, compat_buffer->compat_id, (void **)&compat_buffer->compat_data);
663+ if (status != VA_STATUS_SUCCESS)
664+ return status;
665+ }
666+
667+ if (pbuf)
668+ *pbuf = compat_buffer->data;
669+
670+ return VA_STATUS_SUCCESS;
671+}
672+
673+static VAStatus va_compat_UnmapBuffer (
674+ VADriverContextP ctx,
675+ VABufferID buf_id /* in */
676+)
677+{
678+ VABufferCompat *compat_buffer;
679+ VAStatus status;
680+
681+ if ((compat_buffer = va_GetBufferCompat(ctx, buf_id)) == NULL)
682+ return VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, buf_id);
683+
684+ if (--compat_buffer->map_count == 0)
685+ {
686+ status = VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, compat_buffer->compat_id);
687+ if (status != VA_STATUS_SUCCESS)
688+ return status;
689+ compat_buffer->compat_data = NULL;
690+
691+ status = VA_INVOKE_COMPAT(vaUnmapBuffer, ctx, compat_buffer->id);
692+ if (status != VA_STATUS_SUCCESS)
693+ return status;
694+ compat_buffer->data = NULL;
695+ }
696+
697+ return VA_STATUS_SUCCESS;
698+}
699+
700+static VAStatus va_compat_BeginPicture (
701+ VADriverContextP ctx,
702+ VAContextID context,
703+ VASurfaceID render_target
704+)
705+{
706+ VACompatContextP compat = ctx->compat;
707+ compat->skip_frame = 0;
708+ return VA_INVOKE_COMPAT(vaBeginPicture, ctx, context, render_target);
709+}
710+
711+static VAStatus va_compat_EndPicture (
712+ VADriverContextP ctx,
713+ VAContextID context
714+)
715+{
716+ VACompatContextP compat = ctx->compat;
717+ VAStatus status = VA_INVOKE_COMPAT(vaEndPicture, ctx, context);
718+
719+ /* Ignore errors if the HW decoder did not handle VC-1 skipped P-frames */
720+ if (compat->skip_frame && status == VA_STATUS_ERROR_UNKNOWN)
721+ status = VA_STATUS_SUCCESS;
722+
723+ return status;
724+}
725+
726+static VAStatus va_compat_RenderPicture (
727+ VADriverContextP ctx,
728+ VAContextID context,
729+ VABufferID *buffers,
730+ int num_buffers
731+)
732+{
733+ VACompatContextP compat = ctx->compat;
734+ VABufferCompat *compat_buffer;
735+ VABufferID *compat_buffer_ids;
736+ VAStatus status;
737+ int i, n;
738+
739+ if ((n = num_buffers) < 1)
740+ n = 1;
741+ compat_buffer_ids = alloca(n * sizeof(compat_buffer_ids[0]));
742+
743+ for (i = 0; i < num_buffers; i++)
744+ {
745+ if ((compat_buffer = va_GetBufferCompat(ctx, buffers[i])) == NULL)
746+ compat_buffer_ids[i] = buffers[i];
747+ else
748+ {
749+ status = va_TranslateBufferCompat(ctx, compat_buffer);
750+ if (status != VA_STATUS_SUCCESS)
751+ return status;
752+ compat_buffer_ids[i] = compat_buffer->compat_id;
753+ }
754+ }
755+
756+ if (!compat->skip_frame)
757+ {
758+ status = VA_INVOKE_COMPAT(vaRenderPicture, ctx, context, compat_buffer_ids, num_buffers);
759+ if (status != VA_STATUS_SUCCESS)
760+ return status;
761+ }
762+
763+ /* Buffers are automatically destroyed afterwards */
764+ for (i = 0; i < num_buffers; i++)
765+ {
766+ if ((compat_buffer = va_GetBufferCompat(ctx, buffers[i])) != NULL)
767+ {
768+ status = VA_INVOKE_COMPAT(vaDestroyBuffer, ctx, compat_buffer->id);
769+ if (status != VA_STATUS_SUCCESS)
770+ return status;
771+ }
772+ }
773+
774+ return VA_STATUS_SUCCESS;
775+}
776+
777+#define DEFINE_VTABLE_ENTRY_(RETVAL, PROC, ARGS, COMPAT_PROC, COMPAT_ARGS, COMPAT_PRE, COMPAT_POST) \
778+static RETVAL va_compat_##PROC ARGS \
779+{ \
780+ if (COMPAT_CTX(ctx)->vtable.va##COMPAT_PROC == NULL) \
781+ return VA_STATUS_ERROR_OPERATION_FAILED; \
782+ COMPAT_PRE; \
783+ RETVAL ret = COMPAT_CTX(ctx)->vtable.va##COMPAT_PROC VA_INVOKE_COMPAT_ARGS COMPAT_ARGS; \
784+ COMPAT_POST; \
785+ return ret; \
786+}
787+
788+#define DEFINE_VTABLE_ENTRY(RETVAL, PROC, DECL_ARGS, CALL_ARGS) \
789+DEFINE_VTABLE_ENTRY_(RETVAL, PROC, DECL_ARGS, PROC, CALL_ARGS, {}, {})
790+
791+static VAStatus va_compat_Terminate(VADriverContextP ctx)
792+{
793+ if (COMPAT_CTX(ctx)->vtable.vaTerminate == NULL)
794+ return VA_STATUS_ERROR_OPERATION_FAILED;
795+ return COMPAT_CTX(ctx)->vtable.vaTerminate(COMPAT_CTX(ctx)->compat_ctx);
796+}
797+
798+DEFINE_VTABLE_ENTRY(
799+ VAStatus, QueryConfigProfiles,
800+ (VADriverContextP ctx, VAProfile *profile_list, int *num_profiles),
801+ (ctx, profile_list, num_profiles))
802+
803+DEFINE_VTABLE_ENTRY(
804+ VAStatus, QueryConfigEntrypoints,
805+ (VADriverContextP ctx, VAProfile profile,
806+ VAEntrypoint *entrypoint_list, int *num_entrypoints),
807+ (ctx, profile, entrypoint_list, num_entrypoints))
808+
809+DEFINE_VTABLE_ENTRY(
810+ VAStatus, GetConfigAttributes,
811+ (VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
812+ VAConfigAttrib *attrib_list, int num_attribs),
813+ (ctx, profile, entrypoint, attrib_list, num_attribs))
814+
815+DEFINE_VTABLE_ENTRY(
816+ VAStatus, CreateConfig,
817+ (VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
818+ VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id),
819+ (ctx, profile, entrypoint, attrib_list, num_attribs, config_id))
820+
821+DEFINE_VTABLE_ENTRY(
822+ VAStatus, DestroyConfig,
823+ (VADriverContextP ctx, VAConfigID config_id),
824+ (ctx, config_id))
825+
826+DEFINE_VTABLE_ENTRY(
827+ VAStatus, QueryConfigAttributes,
828+ (VADriverContextP ctx, VAConfigID config_id, VAProfile *profile,
829+ VAEntrypoint *entrypoint, VAConfigAttrib *attrib_list, int *num_attribs),
830+ (ctx, config_id, profile, entrypoint, attrib_list, num_attribs))
831+
832+DEFINE_VTABLE_ENTRY(
833+ VAStatus, CreateSurfaces,
834+ (VADriverContextP ctx, int width, int height, int format,
835+ int num_surfaces, VASurfaceID *surfaces),
836+ (ctx, width, height, format, num_surfaces, surfaces))
837+
838+DEFINE_VTABLE_ENTRY(
839+ VAStatus, DestroySurfaces,
840+ (VADriverContextP ctx, VASurfaceID *surface_list, int num_surfaces),
841+ (ctx, surface_list, num_surfaces))
842+
843+DEFINE_VTABLE_ENTRY(
844+ VAStatus, CreateContext,
845+ (VADriverContextP ctx, VAConfigID config_id,
846+ int picture_width, int picture_height, int flag,
847+ VASurfaceID *render_targets, int num_render_targets, VAContextID *context),
848+ (ctx, config_id, picture_width, picture_height, flag,
849+ render_targets, num_render_targets, context))
850+
851+DEFINE_VTABLE_ENTRY(
852+ VAStatus, DestroyContext,
853+ (VADriverContextP ctx, VAContextID context),
854+ (ctx, context))
855+
856+DEFINE_VTABLE_ENTRY(
857+ VAStatus, SyncSurface,
858+ (VADriverContextP ctx, VASurfaceID render_target),
859+ (ctx, render_target))
860+
861+DEFINE_VTABLE_ENTRY(
862+ VAStatus, QuerySurfaceStatus,
863+ (VADriverContextP ctx, VASurfaceID render_target, VASurfaceStatus *status),
864+ (ctx, render_target, status))
865+
866+DEFINE_VTABLE_ENTRY(
867+ VAStatus, PutSurface,
868+ (VADriverContextP ctx, VASurfaceID surface, Drawable draw,
869+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
870+ short destx, short desty, unsigned short destw, unsigned short desth,
871+ VARectangle *cliprects, unsigned int number_cliprects, unsigned int flags),
872+ (ctx, surface, draw, srcx, srcy, srcw, srch, destx, desty, destw, desth,
873+ cliprects, number_cliprects, flags))
874+
875+DEFINE_VTABLE_ENTRY(
876+ VAStatus, QueryImageFormats,
877+ (VADriverContextP ctx, VAImageFormat *format_list, int *num_formats),
878+ (ctx, format_list, num_formats))
879+
880+DEFINE_VTABLE_ENTRY(
881+ VAStatus, CreateImage,
882+ (VADriverContextP ctx, VAImageFormat *format,
883+ int width, int height, VAImage *image),
884+ (ctx, format, width, height, image))
885+
886+DEFINE_VTABLE_ENTRY(
887+ VAStatus, DeriveImage,
888+ (VADriverContextP ctx, VASurfaceID surface, VAImage *image),
889+ (ctx, surface, image))
890+
891+DEFINE_VTABLE_ENTRY(
892+ VAStatus, DestroyImage,
893+ (VADriverContextP ctx, VAImageID image),
894+ (ctx, image))
895+
896+DEFINE_VTABLE_ENTRY(
897+ VAStatus, SetImagePalette,
898+ (VADriverContextP ctx, VAImageID image, unsigned char *palette),
899+ (ctx, image, palette))
900+
901+DEFINE_VTABLE_ENTRY(
902+ VAStatus, GetImage,
903+ (VADriverContextP ctx, VASurfaceID surface,
904+ int x, int y, unsigned int width, unsigned int height, VAImageID image),
905+ (ctx, surface, x, y, width, height, image))
906+
907+DEFINE_VTABLE_ENTRY(
908+ VAStatus, PutImage,
909+ (VADriverContextP ctx, VASurfaceID surface, VAImageID image,
910+ int srcx, int srcy, unsigned int srcw, unsigned int srch,
911+ int destx, int desty, unsigned int destw, unsigned int desth),
912+ (ctx, surface, image, srcx, srcy, srcw, srch, destx, desty, destw, desth))
913+
914+DEFINE_VTABLE_ENTRY(
915+ VAStatus, QuerySubpictureFormats,
916+ (VADriverContextP ctx, VAImageFormat *format_list,
917+ unsigned int *flags, unsigned int *num_formats),
918+ (ctx, format_list, flags, num_formats))
919+
920+DEFINE_VTABLE_ENTRY(
921+ VAStatus, CreateSubpicture,
922+ (VADriverContextP ctx, VAImageID image, VASubpictureID *subpicture),
923+ (ctx, image, subpicture))
924+
925+DEFINE_VTABLE_ENTRY(
926+ VAStatus, DestroySubpicture,
927+ (VADriverContextP ctx, VASubpictureID subpicture),
928+ (ctx, subpicture))
929+
930+DEFINE_VTABLE_ENTRY(
931+ VAStatus, SetSubpictureImage,
932+ (VADriverContextP ctx, VASubpictureID subpicture, VAImageID image),
933+ (ctx, subpicture, image))
934+
935+DEFINE_VTABLE_ENTRY(
936+ VAStatus, SetSubpictureChromakey,
937+ (VADriverContextP ctx, VASubpictureID subpicture,
938+ unsigned int chromakey_min,
939+ unsigned int chromakey_max,
940+ unsigned int chromakey_mask),
941+ (ctx, subpicture, chromakey_min, chromakey_max, chromakey_mask))
942+
943+DEFINE_VTABLE_ENTRY(
944+ VAStatus, SetSubpictureGlobalAlpha,
945+ (VADriverContextP ctx, VASubpictureID subpicture, float global_alpha),
946+ (ctx, subpicture, global_alpha))
947+
948+DEFINE_VTABLE_ENTRY(
949+ VAStatus, AssociateSubpicture,
950+ (VADriverContextP ctx, VASubpictureID subpicture,
951+ VASurfaceID *target_surfaces, int num_surfaces,
952+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
953+ short destx, short desty, unsigned short destw, unsigned short desth,
954+ unsigned int flags),
955+ (ctx, subpicture, target_surfaces, num_surfaces,
956+ srcx, srcy, srcw, srch, destx, desty, destw, desth, flags))
957+
958+DEFINE_VTABLE_ENTRY(
959+ VAStatus, DeassociateSubpicture,
960+ (VADriverContextP ctx, VASubpictureID subpicture,
961+ VASurfaceID *target_surfaces, int num_surfaces),
962+ (ctx, subpicture, target_surfaces, num_surfaces))
963+
964+DEFINE_VTABLE_ENTRY(
965+ VAStatus, QueryDisplayAttributes,
966+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int *num_attributes),
967+ (ctx, attr_list, num_attributes))
968+
969+DEFINE_VTABLE_ENTRY(
970+ VAStatus, GetDisplayAttributes,
971+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes),
972+ (ctx, attr_list, num_attributes))
973+
974+DEFINE_VTABLE_ENTRY(
975+ VAStatus, SetDisplayAttributes,
976+ (VADriverContextP ctx, VADisplayAttribute *attr_list, int num_attributes),
977+ (ctx, attr_list, num_attributes))
978+
979+DEFINE_VTABLE_ENTRY(
980+ VAStatus, CreateSurfaceFromCIFrame,
981+ (VADriverContextP ctx, unsigned long frame_id, VASurfaceID *surface),
982+ (ctx, frame_id, surface))
983+
984+DEFINE_VTABLE_ENTRY(
985+ VAStatus, CreateSurfaceFromV4L2Buf,
986+ (VADriverContextP ctx, int v4l2_fd,
987+ struct v4l2_format *v4l2_fmt, struct v4l2_buffer *v4l2_buf,
988+ VASurfaceID *surface),
989+ (ctx, v4l2_fd, v4l2_fmt, v4l2_buf, surface))
990+
991+DEFINE_VTABLE_ENTRY(
992+ VAStatus, CopySurfaceToBuffer,
993+ (VADriverContextP ctx, VASurfaceID surface, unsigned int *fourcc,
994+ unsigned int *luma_stride,
995+ unsigned int *chroma_u_stride, unsigned int *chroma_v_stride,
996+ unsigned int *luma_offset,
997+ unsigned int *chroma_u_offset, unsigned int *chroma_v_offset,
998+ void **buffer),
999+ (ctx, surface, fourcc,
1000+ luma_stride, chroma_u_stride, chroma_v_stride,
1001+ luma_offset, chroma_u_offset, chroma_v_offset,
1002+ buffer))
1003+
1004+DEFINE_VTABLE_ENTRY_(
1005+ VAStatus, SyncSurface_pre31,
1006+ (VADriverContextP ctx, VASurfaceID render_target),
1007+ SyncSurface_pre31,
1008+ (ctx, va_context_map_lookup(COMPAT_CTX(ctx), render_target), render_target),
1009+ {}, {})
1010+
1011+DEFINE_VTABLE_ENTRY_(
1012+ VAStatus, PutImage_pre31,
1013+ (VADriverContextP ctx, VASurfaceID surface, VAImageID image,
1014+ int srcx, int srcy, unsigned int srcw, unsigned int srch,
1015+ int destx, int desty, unsigned int destw, unsigned int desth),
1016+ PutImage2_pre31,
1017+ (ctx, surface, image, srcx, srcy, srcw, srch, destx, desty, destw, desth),
1018+ {}, {})
1019+
1020+DEFINE_VTABLE_ENTRY_(
1021+ VAStatus, AssociateSubpicture_pre31,
1022+ (VADriverContextP ctx, VASubpictureID subpicture,
1023+ VASurfaceID *target_surfaces, int num_surfaces,
1024+ short srcx, short srcy, unsigned short srcw, unsigned short srch,
1025+ short destx, short desty, unsigned short destw, unsigned short desth,
1026+ unsigned int flags),
1027+ AssociateSubpicture2_pre31,
1028+ (ctx, subpicture, target_surfaces, num_surfaces,
1029+ srcx, srcy, srcw, srch, destx, desty, destw, desth, flags),
1030+ {}, {})
1031+
1032+DEFINE_VTABLE_ENTRY_(
1033+ VAStatus, CreateContext_pre31,
1034+ (VADriverContextP ctx, VAConfigID config_id,
1035+ int picture_width, int picture_height, int flag,
1036+ VASurfaceID *render_targets, int num_render_targets, VAContextID *context),
1037+ CreateContext,
1038+ (ctx, config_id, picture_width, picture_height, flag,
1039+ render_targets, num_render_targets, context),
1040+ {}, {
1041+ VACompatContextP const compat_ctx = COMPAT_CTX(ctx);
1042+ int i;
1043+ for (i = 0; i < num_render_targets; i++)
1044+ va_context_map_add(compat_ctx, *context, render_targets[i]);
1045+ })
1046+
1047+DEFINE_VTABLE_ENTRY_(
1048+ VAStatus, DestroyContext_pre31,
1049+ (VADriverContextP ctx, VAContextID context),
1050+ DestroyContext,
1051+ (ctx, context),
1052+ {}, { va_context_map_remove(COMPAT_CTX(ctx), context); })
1053+
1054+#undef DEFINE_VTABLE_ENTRY
1055+#undef DEFINE_VTABLE_ENTRY_
1056+
1057+static void va_compat_init_VADriverVTable(VADriverContextP ctx, int compat_version)
1058+{
1059+#define INIT_VTABLE_(CTX, DST_PROC, SRC_PROC) \
1060+ (CTX)->vtable.va##DST_PROC = va_compat_##SRC_PROC
1061+#define INIT_VTABLE(CTX, PROC) \
1062+ INIT_VTABLE_(CTX, PROC, PROC)
1063+
1064+ INIT_VTABLE(ctx, Terminate);
1065+ INIT_VTABLE(ctx, QueryConfigProfiles);
1066+ INIT_VTABLE(ctx, QueryConfigEntrypoints);
1067+ INIT_VTABLE(ctx, GetConfigAttributes);
1068+ INIT_VTABLE(ctx, CreateConfig);
1069+ INIT_VTABLE(ctx, DestroyConfig);
1070+ INIT_VTABLE(ctx, QueryConfigAttributes);
1071+ INIT_VTABLE(ctx, CreateSurfaces);
1072+ INIT_VTABLE(ctx, DestroySurfaces);
1073+ INIT_VTABLE(ctx, CreateContext);
1074+ INIT_VTABLE(ctx, DestroyContext);
1075+ INIT_VTABLE(ctx, CreateBuffer);
1076+ INIT_VTABLE(ctx, BufferSetNumElements);
1077+ INIT_VTABLE(ctx, MapBuffer);
1078+ INIT_VTABLE(ctx, UnmapBuffer);
1079+ INIT_VTABLE(ctx, DestroyBuffer);
1080+ INIT_VTABLE(ctx, BeginPicture);
1081+ INIT_VTABLE(ctx, RenderPicture);
1082+ INIT_VTABLE(ctx, EndPicture);
1083+ INIT_VTABLE(ctx, SyncSurface);
1084+ INIT_VTABLE(ctx, QuerySurfaceStatus);
1085+ INIT_VTABLE(ctx, PutSurface);
1086+ INIT_VTABLE(ctx, QueryImageFormats);
1087+ INIT_VTABLE(ctx, CreateImage);
1088+ INIT_VTABLE(ctx, DeriveImage);
1089+ INIT_VTABLE(ctx, DestroyImage);
1090+ INIT_VTABLE(ctx, SetImagePalette);
1091+ INIT_VTABLE(ctx, GetImage);
1092+ INIT_VTABLE(ctx, PutImage);
1093+ INIT_VTABLE(ctx, QuerySubpictureFormats);
1094+ INIT_VTABLE(ctx, CreateSubpicture);
1095+ INIT_VTABLE(ctx, DestroySubpicture);
1096+ INIT_VTABLE(ctx, SetSubpictureImage);
1097+ INIT_VTABLE(ctx, SetSubpictureChromakey);
1098+ INIT_VTABLE(ctx, SetSubpictureGlobalAlpha);
1099+ INIT_VTABLE(ctx, AssociateSubpicture);
1100+ INIT_VTABLE(ctx, DeassociateSubpicture);
1101+ INIT_VTABLE(ctx, QueryDisplayAttributes);
1102+ INIT_VTABLE(ctx, GetDisplayAttributes);
1103+ INIT_VTABLE(ctx, SetDisplayAttributes);
1104+ INIT_VTABLE(ctx, CreateSurfaceFromCIFrame);
1105+ INIT_VTABLE(ctx, CreateSurfaceFromV4L2Buf);
1106+ INIT_VTABLE(ctx, CopySurfaceToBuffer);
1107+
1108+ if (compat_version && compat_version < 31) {
1109+ INIT_VTABLE_(ctx, CreateContext, CreateContext_pre31);
1110+ INIT_VTABLE_(ctx, DestroyContext, DestroyContext_pre31);
1111+ INIT_VTABLE_(ctx, SyncSurface, SyncSurface_pre31);
1112+ INIT_VTABLE_(ctx, PutImage, PutImage_pre31);
1113+ INIT_VTABLE_(ctx, AssociateSubpicture, AssociateSubpicture_pre31);
1114+ }
1115+
1116+#undef INIT_VTABLE
1117+#undef INIT_VTABLE__
1118+}
1119+
1120+VAStatus va_compat_init(VADisplay dpy, int compat_version, void *compat_ctx)
1121+{
1122+ VADisplayContextP pDisplayContext = (VADisplayContextP)dpy;
1123+ VADriverContextP ctx = CTX(dpy);
1124+ VADriverContextP_0_29 ctx_0_29;
1125+ VADriverContextP_0_30 ctx_0_30;
1126+ VACompatContextP compat;
1127+ VAStatus status;
1128+ char *driver_name;
1129+
1130+ ctx->compat = NULL;
1131+
1132+ if (compat_version == 0)
1133+ return VA_STATUS_SUCCESS;
1134+
1135+ ASSERT(compat_ctx);
1136+ if (compat_ctx == NULL)
1137+ return VA_STATUS_ERROR_UNKNOWN;
1138+
1139+ driver_name = NULL;
1140+ status = pDisplayContext->vaGetDriverName(pDisplayContext, &driver_name);
1141+ ASSERT(status == VA_STATUS_SUCCESS);
1142+ if (status != VA_STATUS_SUCCESS)
1143+ return status;
1144+
1145+ if ((compat = malloc(sizeof(*compat))) == NULL)
1146+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1147+ compat->buffers = NULL;
1148+ compat->buffers_count_max = 0;
1149+ compat->compat_version = compat_version;
1150+ compat->compat_ctx = NULL;
1151+ compat->driver_name = driver_name;
1152+ compat->context_map = NULL;
1153+ compat->last_context_map_match = NULL;
1154+ ctx->compat = compat;
1155+
1156+ if (strcmp(driver_name, "psb") == 0)
1157+ compat->driver_id = VA_DRIVER_ID_POULSBO;
1158+ else if (strcmp(driver_name, "iegd") == 0)
1159+ compat->driver_id = VA_DRIVER_ID_IEGD;
1160+ else
1161+ compat->driver_id = VA_DRIVER_ID_UNKNOWN;
1162+
1163+ switch (compat_version) {
1164+ case 29:
1165+ if ((ctx_0_29 = malloc(sizeof(*ctx_0_29))) == NULL)
1166+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1167+ memcpy(ctx_0_29, compat_ctx, sizeof(*ctx_0_29));
1168+ va_compat_translate_VADriverContext_0_29(compat, ctx_0_29);
1169+ compat->compat_ctx = ctx_0_29;
1170+ COPY_FIELD(ctx, ctx_0_29, version_major);
1171+ COPY_FIELD(ctx, ctx_0_29, version_minor);
1172+ COPY_FIELD(ctx, ctx_0_29, max_profiles);
1173+ COPY_FIELD(ctx, ctx_0_29, max_entrypoints);
1174+ COPY_FIELD(ctx, ctx_0_29, max_attributes);
1175+ COPY_FIELD(ctx, ctx_0_29, max_image_formats);
1176+ COPY_FIELD(ctx, ctx_0_29, max_subpic_formats);
1177+ COPY_FIELD(ctx, ctx_0_29, max_display_attributes);
1178+ COPY_FIELD(ctx, ctx_0_29, str_vendor);
1179+ break;
1180+ case 30:
1181+ if ((ctx_0_30 = malloc(sizeof(*ctx_0_30))) == NULL)
1182+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
1183+ memcpy(ctx_0_30, compat_ctx, sizeof(*ctx_0_30));
1184+ va_compat_translate_VADriverContext_0_30(compat, ctx_0_30);
1185+ compat->compat_ctx = ctx_0_30;
1186+ COPY_FIELD(ctx, ctx_0_30, version_major);
1187+ COPY_FIELD(ctx, ctx_0_30, version_minor);
1188+ COPY_FIELD(ctx, ctx_0_30, max_profiles);
1189+ COPY_FIELD(ctx, ctx_0_30, max_entrypoints);
1190+ COPY_FIELD(ctx, ctx_0_30, max_attributes);
1191+ COPY_FIELD(ctx, ctx_0_30, max_image_formats);
1192+ COPY_FIELD(ctx, ctx_0_30, max_subpic_formats);
1193+ COPY_FIELD(ctx, ctx_0_30, max_display_attributes);
1194+ COPY_FIELD(ctx, ctx_0_30, str_vendor);
1195+ break;
1196+ case VA_MINOR_VERSION:
1197+ va_compat_translate_VADriverContext(compat, compat_ctx);
1198+ compat->compat_ctx = compat_ctx;
1199+ break;
1200+ default:
1201+ ASSERT(compat_version == 0);
1202+ return VA_STATUS_ERROR_UNKNOWN;
1203+ }
1204+
1205+ va_compat_init_VADriverVTable(ctx, compat_version);
1206+ return VA_STATUS_SUCCESS;
1207+}
1208+
1209+VAStatus va_compat_fini(VADisplay dpy)
1210+{
1211+ VADriverContextP ctx = CTX(dpy);
1212+ VACompatContextP compat = ctx->compat;
1213+ int i;
1214+
1215+ if (compat == NULL)
1216+ return VA_STATUS_SUCCESS;
1217+
1218+ if (compat->driver_name)
1219+ {
1220+ free(compat->driver_name);
1221+ compat->driver_name = NULL;
1222+ }
1223+
1224+ if (compat->buffers)
1225+ {
1226+ for (i = 0; i < compat->buffers_count_max; i++)
1227+ {
1228+ if (compat->buffers[i].id)
1229+ va_DestroyBufferCompat(ctx, compat->buffers[i].id);
1230+ }
1231+ free(compat->buffers);
1232+ compat->buffers = NULL;
1233+ }
1234+
1235+ if (compat->compat_ctx && compat->compat_version != VA_MINOR_VERSION)
1236+ {
1237+ free(compat->compat_ctx);
1238+ compat->compat_ctx = NULL;
1239+ }
1240+
1241+ if (compat->context_map)
1242+ {
1243+ VAContextMapP d, m = compat->context_map;
1244+ while (m) {
1245+ d = m;
1246+ m = m->next;
1247+ free(d);
1248+ }
1249+ }
1250+ compat->last_context_map_match = NULL;
1251+
1252+ free(compat);
1253+ ctx->compat = NULL;
1254+ return VA_STATUS_SUCCESS;
1255+}
1256diff --git a/src/va_compat.h b/src/va_compat.h
1257new file mode 100644
1258index 0000000..2c9d801
1259--- /dev/null
1260+++ b/src/va_compat.h
1261@@ -0,0 +1,1467 @@
1262+/*
1263+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
1264+ *
1265+ * Permission is hereby granted, free of charge, to any person obtaining a
1266+ * copy of this software and associated documentation files (the
1267+ * "Software"), to deal in the Software without restriction, including
1268+ * without limitation the rights to use, copy, modify, merge, publish,
1269+ * distribute, sub license, and/or sell copies of the Software, and to
1270+ * permit persons to whom the Software is furnished to do so, subject to
1271+ * the following conditions:
1272+ *
1273+ * The above copyright notice and this permission notice (including the
1274+ * next paragraph) shall be included in all copies or substantial portions
1275+ * of the Software.
1276+ *
1277+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1278+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1279+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
1280+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
1281+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1282+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1283+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1284+ */
1285+
1286+#ifndef VA_COMPAT_H
1287+#define VA_COMPAT_H
1288+
1289+VAStatus va_compat_init(VADisplay dpy, int compat_version, void *compat_ctx);
1290+VAStatus va_compat_fini(VADisplay dpy);
1291+
1292+/* H.264 Picture (0.29) */
1293+typedef struct _VAPictureH264_0_29
1294+{
1295+ VASurfaceID picture_id;
1296+ unsigned int flags;
1297+ unsigned int TopFieldOrderCnt;
1298+ unsigned int BottomFieldOrderCnt;
1299+} VAPictureH264_0_29;
1300+
1301+/* H.264 Picture Parameter Buffer (0.29) */
1302+typedef struct _VAPictureParameterBufferH264_0_29
1303+{
1304+ VAPictureH264_0_29 CurrPic;
1305+ VAPictureH264_0_29 ReferenceFrames[16]; /* in DPB */
1306+ unsigned short picture_width_in_mbs_minus1;
1307+ unsigned short picture_height_in_mbs_minus1;
1308+ unsigned char bit_depth_luma_minus8;
1309+ unsigned char bit_depth_chroma_minus8;
1310+ unsigned char num_ref_frames;
1311+ union {
1312+ struct {
1313+ unsigned char chroma_format_idc : 2;
1314+ unsigned char residual_colour_transform_flag : 1;
1315+ unsigned char frame_mbs_only_flag : 1;
1316+ unsigned char mb_adaptive_frame_field_flag : 1;
1317+ unsigned char direct_8x8_inference_flag : 1;
1318+ unsigned char MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */
1319+ };
1320+ unsigned char seq_fields;
1321+ };
1322+ unsigned char num_slice_groups_minus1;
1323+ unsigned char slice_group_map_type;
1324+ signed char pic_init_qp_minus26;
1325+ signed char chroma_qp_index_offset;
1326+ signed char second_chroma_qp_index_offset;
1327+ union {
1328+ struct {
1329+ unsigned char entropy_coding_mode_flag : 1;
1330+ unsigned char weighted_pred_flag : 1;
1331+ unsigned char weighted_bipred_idc : 2;
1332+ unsigned char transform_8x8_mode_flag : 1;
1333+ unsigned char field_pic_flag : 1;
1334+ unsigned char constrained_intra_pred_flag : 1;
1335+ };
1336+ unsigned char pic_fields;
1337+ };
1338+ unsigned short frame_num;
1339+} VAPictureParameterBufferH264_0_29;
1340+
1341+/* H.264 Slice Parameter Buffer (0.29) */
1342+typedef struct _VASliceParameterBufferH264_0_29
1343+{
1344+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1345+ unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */
1346+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1347+ unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
1348+ unsigned short first_mb_in_slice;
1349+ unsigned char slice_type;
1350+ unsigned char direct_spatial_mv_pred_flag;
1351+ unsigned char num_ref_idx_l0_active_minus1;
1352+ unsigned char num_ref_idx_l1_active_minus1;
1353+ unsigned char cabac_init_idc;
1354+ char slice_qp_delta;
1355+ unsigned char disable_deblocking_filter_idc;
1356+ char slice_alpha_c0_offset_div2;
1357+ char slice_beta_offset_div2;
1358+ VAPictureH264_0_29 RefPicList0[32]; /* See 8.2.4.2 */
1359+ VAPictureH264_0_29 RefPicList1[32]; /* See 8.2.4.2 */
1360+ unsigned char luma_log2_weight_denom;
1361+ unsigned char chroma_log2_weight_denom;
1362+ unsigned char luma_weight_l0_flag;
1363+ short luma_weight_l0[32];
1364+ short luma_offset_l0[32];
1365+ unsigned char chroma_weight_l0_flag;
1366+ short chroma_weight_l0[32][2];
1367+ short chroma_offset_l0[32][2];
1368+ unsigned char luma_weight_l1_flag;
1369+ short luma_weight_l1[32];
1370+ short luma_offset_l1[32];
1371+ unsigned char chroma_weight_l1_flag;
1372+ short chroma_weight_l1[32][2];
1373+ short chroma_offset_l1[32][2];
1374+} VASliceParameterBufferH264_0_29;
1375+
1376+/* VC-1 Picture Parameter Buffer (0.29) */
1377+typedef struct _VAPictureParameterBufferVC1_0_29
1378+{
1379+ VASurfaceID forward_reference_picture;
1380+ VASurfaceID backward_reference_picture;
1381+ /* if out-of-loop post-processing is done on the render
1382+ target, then we need to keep the in-loop decoded
1383+ picture as a reference picture */
1384+ VASurfaceID inloop_decoded_picture;
1385+
1386+ /* sequence layer for AP or meta data for SP and MP */
1387+ union {
1388+ struct {
1389+ unsigned char interlace : 1; /* SEQUENCE_LAYER::INTERLACE */
1390+ unsigned char syncmarker : 1;/* METADATA::SYNCMARKER */
1391+ unsigned char overlap : 1;/* METADATA::OVERLAP */
1392+ };
1393+ unsigned char sequence_fields;
1394+ };
1395+
1396+ unsigned short coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */
1397+ unsigned short coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */
1398+ unsigned char closed_entry; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
1399+ unsigned char broken_link; /* ENTRY_POINT_LAYER::BROKEN_LINK */
1400+ unsigned char loopfilter; /* ENTRY_POINT_LAYER::LOOPFILTER */
1401+ unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
1402+ unsigned char fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */
1403+ union {
1404+ struct {
1405+ unsigned char range_mapping_luma_flag: 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
1406+ unsigned char range_mapping_luma: 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
1407+ unsigned char range_mapping_chroma_flag: 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
1408+ unsigned char range_mapping_chroma: 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
1409+ };
1410+ unsigned char range_mapping_fields;
1411+ };
1412+
1413+ unsigned char b_picture_fraction; /* PICTURE_LAYER::BFRACTION */
1414+ unsigned char cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */
1415+ unsigned char mb_mode_table; /* PICTURE_LAYER::MBMODETAB */
1416+ unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
1417+ unsigned char rounding_control; /* PICTURE_LAYER::RNDCTRL */
1418+ unsigned char post_processing; /* PICTURE_LAYER::POSTPROC */
1419+ unsigned char picture_resolution_index; /* PICTURE_LAYER::RESPIC */
1420+ unsigned char luma_scale; /* PICTURE_LAYER::LUMSCALE */
1421+ unsigned char luma_shift; /* PICTURE_LAYER::LUMSHIFT */
1422+ union {
1423+ struct {
1424+ unsigned char picture_type : 2; /* PICTURE_LAYER::PTYPE */
1425+ unsigned char frame_coding_mode : 3;/* PICTURE_LAYER::FCM */
1426+ unsigned char top_field_first : 1;/* PICTURE_LAYER::TFF */
1427+ unsigned char is_first_field : 1; /* set to 1 if it is the first field */
1428+ unsigned char intensity_compensation: 1;/* PICTURE_LAYER::INTCOMP */
1429+ };
1430+ unsigned char picture_fields;
1431+ };
1432+ union {
1433+ struct {
1434+ unsigned char mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1435+ unsigned char direct_mb : 1; /* PICTURE::DIRECTMB */
1436+ unsigned char skip_mb : 1; /* PICTURE::SKIPMB */
1437+ unsigned char field_tx : 1; /* PICTURE::FIELDTX */
1438+ unsigned char forward_mb : 1; /* PICTURE::FORWARDMB */
1439+ unsigned char ac_pred : 1; /* PICTURE::ACPRED */
1440+ unsigned char overflags : 1; /* PICTURE::OVERFLAGS */
1441+ };
1442+ unsigned char raw_coding_flag;
1443+ };
1444+ union {
1445+ struct {
1446+ unsigned char bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1447+ unsigned char bp_direct_mb : 1; /* PICTURE::DIRECTMB */
1448+ unsigned char bp_skip_mb : 1; /* PICTURE::SKIPMB */
1449+ unsigned char bp_field_tx : 1; /* PICTURE::FIELDTX */
1450+ unsigned char bp_forward_mb : 1; /* PICTURE::FORWARDMB */
1451+ unsigned char bp_ac_pred : 1; /* PICTURE::ACPRED */
1452+ unsigned char bp_overflags : 1; /* PICTURE::OVERFLAGS */
1453+ };
1454+ unsigned char bitplane_present_flag; /* signal what bitplane is being passed via the bitplane buffer */
1455+ };
1456+ union {
1457+ struct {
1458+ unsigned char reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
1459+ unsigned char reference_distance : 5;/* PICTURE_LAYER::REFDIST */
1460+ unsigned char num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
1461+ unsigned char reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */
1462+ };
1463+ unsigned short reference_fields;
1464+ };
1465+ union {
1466+ struct {
1467+ VAMvModeVC1 mv_mode : 3; /* PICTURE_LAYER::MVMODE */
1468+ VAMvModeVC1 mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */
1469+ unsigned char mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
1470+ unsigned char two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
1471+ unsigned char four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */
1472+ unsigned char four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
1473+ unsigned char extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
1474+ unsigned char extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */
1475+ unsigned char extended_dmv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
1476+ unsigned char extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */
1477+ };
1478+ unsigned int mv_fields;
1479+ };
1480+ union {
1481+ struct {
1482+ unsigned char dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */
1483+ unsigned char quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */
1484+ unsigned char half_qp : 1; /* PICTURE_LAYER::HALFQP */
1485+ unsigned char pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
1486+ unsigned char pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
1487+ unsigned char dq_frame : 1; /* VOPDQUANT::DQUANTFRM */
1488+ unsigned char dq_profile : 2; /* VOPDQUANT::DQPROFILE */
1489+ unsigned char dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */
1490+ unsigned char dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */
1491+ unsigned char dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */
1492+ unsigned char alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
1493+ };
1494+ unsigned long pic_quantizer_fields;
1495+ };
1496+ union {
1497+ struct {
1498+ unsigned char variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
1499+ unsigned char mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */
1500+ unsigned char frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */
1501+ unsigned char transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */
1502+ unsigned char transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */
1503+ unsigned char intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */
1504+ };
1505+ unsigned short transform_fields;
1506+ };
1507+} VAPictureParameterBufferVC1_0_29;
1508+
1509+/* MPEG-2 Picture Parameter Buffer (0.29) */
1510+typedef struct _VAPictureParameterBufferMPEG2_0_29
1511+{
1512+ unsigned short horizontal_size;
1513+ unsigned short vertical_size;
1514+ VASurfaceID forward_reference_picture;
1515+ VASurfaceID backward_reference_picture;
1516+ /* meanings of the following fields are the same as in the standard */
1517+ int picture_coding_type;
1518+ int f_code; /* pack all four fcode into this */
1519+ union {
1520+ struct {
1521+ unsigned char intra_dc_precision : 2;
1522+ unsigned char picture_structure : 2;
1523+ unsigned char top_field_first : 1;
1524+ unsigned char frame_pred_frame_dct : 1;
1525+ unsigned char concealment_motion_vectors : 1;
1526+ unsigned char q_scale_type : 1;
1527+ unsigned char intra_vlc_format : 1;
1528+ unsigned char alternate_scan : 1;
1529+ unsigned char repeat_first_field : 1;
1530+ unsigned char progressive_frame : 1;
1531+ unsigned char is_first_field : 1; /* indicate whether the current field
1532+ * is the first field for field picture
1533+ */
1534+ };
1535+ unsigned int picture_coding_extension;
1536+ };
1537+} VAPictureParameterBufferMPEG2_0_29;
1538+
1539+/* MPEG-2 Slice Parameter Buffer (0.29) */
1540+typedef struct _VASliceParameterBufferMPEG2_0_29
1541+{
1542+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1543+ unsigned int slice_data_offset;/* the offset to the first byte of slice data */
1544+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1545+ unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
1546+ unsigned int slice_vertical_position;
1547+ int quantiser_scale_code;
1548+ int intra_slice_flag;
1549+} VASliceParameterBufferMPEG2_0_29;
1550+
1551+/* MPEG-4 Picture Parameter Buffer (0.29) */
1552+typedef struct _VAPictureParameterBufferMPEG4_0_29
1553+{
1554+ unsigned short vop_width;
1555+ unsigned short vop_height;
1556+ VASurfaceID forward_reference_picture;
1557+ VASurfaceID backward_reference_picture;
1558+ union {
1559+ struct {
1560+ unsigned char short_video_header : 1;
1561+ unsigned char chroma_format : 2;
1562+ unsigned char interlaced : 1;
1563+ unsigned char obmc_disable : 1;
1564+ unsigned char sprite_enable : 2;
1565+ unsigned char sprite_warping_accuracy : 2;
1566+ unsigned char quant_type : 1;
1567+ unsigned char quarter_sample : 1;
1568+ unsigned char data_partitioned : 1;
1569+ unsigned char reversible_vlc : 1;
1570+ };
1571+ unsigned short vol_fields;
1572+ };
1573+ unsigned char no_of_sprite_warping_points;
1574+ short sprite_trajectory_du[3];
1575+ short sprite_trajectory_dv[3];
1576+ unsigned char quant_precision;
1577+ union {
1578+ struct {
1579+ unsigned char vop_coding_type : 2;
1580+ unsigned char backward_reference_vop_coding_type : 2;
1581+ unsigned char vop_rounding_type : 1;
1582+ unsigned char intra_dc_vlc_thr : 3;
1583+ unsigned char top_field_first : 1;
1584+ unsigned char alternate_vertical_scan_flag : 1;
1585+ };
1586+ unsigned short vop_fields;
1587+ };
1588+ unsigned char vop_fcode_forward;
1589+ unsigned char vop_fcode_backward;
1590+ /* short header related */
1591+ unsigned char num_gobs_in_vop;
1592+ unsigned char num_macroblocks_in_gob;
1593+ /* for direct mode prediction */
1594+ short TRB;
1595+ short TRD;
1596+} VAPictureParameterBufferMPEG4_0_29;
1597+
1598+/* H.264 Picture (0.30) */
1599+typedef struct _VAPictureH264_0_30
1600+{
1601+ VASurfaceID picture_id;
1602+ unsigned int flags;
1603+ unsigned int TopFieldOrderCnt;
1604+ unsigned int BottomFieldOrderCnt;
1605+} VAPictureH264_0_30;
1606+
1607+/* H.264 Picture Parameter Buffer (0.30) */
1608+typedef struct _VAPictureParameterBufferH264_0_30
1609+{
1610+ VAPictureH264 CurrPic;
1611+ VAPictureH264 ReferenceFrames[16]; /* in DPB */
1612+ unsigned short picture_width_in_mbs_minus1;
1613+ unsigned short picture_height_in_mbs_minus1;
1614+ unsigned char bit_depth_luma_minus8;
1615+ unsigned char bit_depth_chroma_minus8;
1616+ unsigned char num_ref_frames;
1617+ union {
1618+ struct {
1619+ unsigned char chroma_format_idc : 2;
1620+ unsigned char residual_colour_transform_flag : 1;
1621+ unsigned char frame_mbs_only_flag : 1;
1622+ unsigned char mb_adaptive_frame_field_flag : 1;
1623+ unsigned char direct_8x8_inference_flag : 1;
1624+ unsigned char MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */
1625+ } bits;
1626+ unsigned char value;
1627+ } seq_fields;
1628+ unsigned char num_slice_groups_minus1;
1629+ unsigned char slice_group_map_type;
1630+ signed char pic_init_qp_minus26;
1631+ signed char chroma_qp_index_offset;
1632+ signed char second_chroma_qp_index_offset;
1633+ union {
1634+ struct {
1635+ unsigned char entropy_coding_mode_flag : 1;
1636+ unsigned char weighted_pred_flag : 1;
1637+ unsigned char weighted_bipred_idc : 2;
1638+ unsigned char transform_8x8_mode_flag : 1;
1639+ unsigned char field_pic_flag : 1;
1640+ unsigned char constrained_intra_pred_flag : 1;
1641+ } bits;
1642+ unsigned char value;
1643+ } pic_fields;
1644+ unsigned short frame_num;
1645+} VAPictureParameterBufferH264_0_30;
1646+
1647+/* H.264 Slice Parameter Buffer (0.30) */
1648+typedef struct _VASliceParameterBufferH264_0_30
1649+{
1650+ unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1651+ unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */
1652+ unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1653+ unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
1654+ unsigned short first_mb_in_slice;
1655+ unsigned char slice_type;
1656+ unsigned char direct_spatial_mv_pred_flag;
1657+ unsigned char num_ref_idx_l0_active_minus1;
1658+ unsigned char num_ref_idx_l1_active_minus1;
1659+ unsigned char cabac_init_idc;
1660+ char slice_qp_delta;
1661+ unsigned char disable_deblocking_filter_idc;
1662+ char slice_alpha_c0_offset_div2;
1663+ char slice_beta_offset_div2;
1664+ VAPictureH264 RefPicList0[32]; /* See 8.2.4.2 */
1665+ VAPictureH264 RefPicList1[32]; /* See 8.2.4.2 */
1666+ unsigned char luma_log2_weight_denom;
1667+ unsigned char chroma_log2_weight_denom;
1668+ unsigned char luma_weight_l0_flag;
1669+ short luma_weight_l0[32];
1670+ short luma_offset_l0[32];
1671+ unsigned char chroma_weight_l0_flag;
1672+ short chroma_weight_l0[32][2];
1673+ short chroma_offset_l0[32][2];
1674+ unsigned char luma_weight_l1_flag;
1675+ short luma_weight_l1[32];
1676+ short luma_offset_l1[32];
1677+ unsigned char chroma_weight_l1_flag;
1678+ short chroma_weight_l1[32][2];
1679+ short chroma_offset_l1[32][2];
1680+} VASliceParameterBufferH264_0_30;
1681+
1682+/* VC-1 Picture Parameter Buffer (0.30) */
1683+typedef struct _VAPictureParameterBufferVC1_0_30
1684+{
1685+ VASurfaceID forward_reference_picture;
1686+ VASurfaceID backward_reference_picture;
1687+ /* if out-of-loop post-processing is done on the render
1688+ target, then we need to keep the in-loop decoded
1689+ picture as a reference picture */
1690+ VASurfaceID inloop_decoded_picture;
1691+
1692+ /* sequence layer for AP or meta data for SP and MP */
1693+ union {
1694+ struct {
1695+ unsigned char interlace : 1; /* SEQUENCE_LAYER::INTERLACE */
1696+ unsigned char syncmarker : 1;/* METADATA::SYNCMARKER */
1697+ unsigned char overlap : 1;/* METADATA::OVERLAP */
1698+ } bits;
1699+ unsigned char value;
1700+ } sequence_fields;
1701+
1702+ unsigned short coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */
1703+ unsigned short coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */
1704+ unsigned char closed_entry; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
1705+ unsigned char broken_link; /* ENTRY_POINT_LAYER::BROKEN_LINK */
1706+ unsigned char loopfilter; /* ENTRY_POINT_LAYER::LOOPFILTER */
1707+ unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
1708+ unsigned char fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */
1709+ union {
1710+ struct {
1711+ unsigned char luma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
1712+ unsigned char luma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
1713+ unsigned char chroma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
1714+ unsigned char chroma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
1715+ } bits;
1716+ unsigned char value;
1717+ } range_mapping_fields;
1718+
1719+ unsigned char b_picture_fraction; /* PICTURE_LAYER::BFRACTION */
1720+ unsigned char cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */
1721+ unsigned char mb_mode_table; /* PICTURE_LAYER::MBMODETAB */
1722+ unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
1723+ unsigned char rounding_control; /* PICTURE_LAYER::RNDCTRL */
1724+ unsigned char post_processing; /* PICTURE_LAYER::POSTPROC */
1725+ unsigned char picture_resolution_index; /* PICTURE_LAYER::RESPIC */
1726+ unsigned char luma_scale; /* PICTURE_LAYER::LUMSCALE */
1727+ unsigned char luma_shift; /* PICTURE_LAYER::LUMSHIFT */
1728+ union {
1729+ struct {
1730+ unsigned char picture_type : 2; /* PICTURE_LAYER::PTYPE */
1731+ unsigned char frame_coding_mode : 3; /* PICTURE_LAYER::FCM */
1732+ unsigned char top_field_first : 1; /* PICTURE_LAYER::TFF */
1733+ unsigned char is_first_field : 1; /* set to 1 if it is the first field */
1734+ unsigned char intensity_compensation : 1; /* PICTURE_LAYER::INTCOMP */
1735+ } bits;
1736+ unsigned char value;
1737+ } picture_fields;
1738+ union {
1739+ struct {
1740+ unsigned char mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1741+ unsigned char direct_mb : 1; /* PICTURE::DIRECTMB */
1742+ unsigned char skip_mb : 1; /* PICTURE::SKIPMB */
1743+ unsigned char field_tx : 1; /* PICTURE::FIELDTX */
1744+ unsigned char forward_mb : 1; /* PICTURE::FORWARDMB */
1745+ unsigned char ac_pred : 1; /* PICTURE::ACPRED */
1746+ unsigned char overflags : 1; /* PICTURE::OVERFLAGS */
1747+ } flags;
1748+ unsigned char value;
1749+ } raw_coding;
1750+ union {
1751+ struct {
1752+ unsigned char bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */
1753+ unsigned char bp_direct_mb : 1; /* PICTURE::DIRECTMB */
1754+ unsigned char bp_skip_mb : 1; /* PICTURE::SKIPMB */
1755+ unsigned char bp_field_tx : 1; /* PICTURE::FIELDTX */
1756+ unsigned char bp_forward_mb : 1; /* PICTURE::FORWARDMB */
1757+ unsigned char bp_ac_pred : 1; /* PICTURE::ACPRED */
1758+ unsigned char bp_overflags : 1; /* PICTURE::OVERFLAGS */
1759+ } flags;
1760+ unsigned char value;
1761+ } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
1762+ union {
1763+ struct {
1764+ unsigned char reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
1765+ unsigned char reference_distance : 5;/* PICTURE_LAYER::REFDIST */
1766+ unsigned char num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
1767+ unsigned char reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */
1768+ } bits;
1769+ unsigned short value;
1770+ } reference_fields;
1771+ union {
1772+ struct {
1773+ unsigned char mv_mode : 3; /* PICTURE_LAYER::MVMODE */
1774+ unsigned char mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */
1775+ unsigned char mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
1776+ unsigned char two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
1777+ unsigned char four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */
1778+ unsigned char four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
1779+ unsigned char extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
1780+ unsigned char extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */
1781+ unsigned char extended_dmv_flag : 1; /* ENTRY_POCHAR_LAYER::EXTENDED_DMV */
1782+ unsigned char extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */
1783+ } bits;
1784+ unsigned int value;
1785+ } mv_fields;
1786+ union {
1787+ struct {
1788+ unsigned char dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */
1789+ unsigned char quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */
1790+ unsigned char half_qp : 1; /* PICTURE_LAYER::HALFQP */
1791+ unsigned char pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
1792+ unsigned char pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
1793+ unsigned char dq_frame : 1; /* VOPDQUANT::DQUANTFRM */
1794+ unsigned char dq_profile : 2; /* VOPDQUANT::DQPROFILE */
1795+ unsigned char dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */
1796+ unsigned char dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */
1797+ unsigned char dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */
1798+ unsigned char alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
1799+ } bits;
1800+ unsigned long value;
1801+ } pic_quantizer_fields;
1802+ union {
1803+ struct {
1804+ unsigned char variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
1805+ unsigned char mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */
1806+ unsigned char frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */
1807+ unsigned char transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */
1808+ unsigned char transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */
1809+ unsigned char intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */
1810+ } bits;
1811+ unsigned short value;
1812+ } transform_fields;
1813+} VAPictureParameterBufferVC1_0_30;
1814+
1815+/* MPEG-2 Picture Parameter Buffer (0.30) */
1816+typedef struct _VAPictureParameterBufferMPEG2_0_30
1817+{
1818+ unsigned short horizontal_size;
1819+ unsigned short vertical_size;
1820+ VASurfaceID forward_reference_picture;
1821+ VASurfaceID backward_reference_picture;
1822+ /* meanings of the following fields are the same as in the standard */
1823+ int picture_coding_type;
1824+ int f_code; /* pack all four fcode into this */
1825+ union {
1826+ struct {
1827+ unsigned int intra_dc_precision : 2;
1828+ unsigned int picture_structure : 2;
1829+ unsigned int top_field_first : 1;
1830+ unsigned int frame_pred_frame_dct : 1;
1831+ unsigned int concealment_motion_vectors : 1;
1832+ unsigned int q_scale_type : 1;
1833+ unsigned int intra_vlc_format : 1;
1834+ unsigned int alternate_scan : 1;
1835+ unsigned int repeat_first_field : 1;
1836+ unsigned int progressive_frame : 1;
1837+ unsigned int is_first_field : 1; /* indicate whether the current field
1838+ * is the first field for field picture
1839+ */
1840+ } bits;
1841+ unsigned int value;
1842+ } picture_coding_extension;
1843+} VAPictureParameterBufferMPEG2_0_30;
1844+
1845+/* MPEG-2 Slice Parameter Buffer (0.29) */
1846+typedef VASliceParameterBufferMPEG2_0_29 VASliceParameterBufferMPEG2_0_30;
1847+
1848+/* MPEG-4 Picture Parameter Buffer (0.30) */
1849+typedef struct _VAPictureParameterBufferMPEG4_0_30
1850+{
1851+ unsigned short vop_width;
1852+ unsigned short vop_height;
1853+ VASurfaceID forward_reference_picture;
1854+ VASurfaceID backward_reference_picture;
1855+ union {
1856+ struct {
1857+ unsigned char short_video_header : 1;
1858+ unsigned char chroma_format : 2;
1859+ unsigned char interlaced : 1;
1860+ unsigned char obmc_disable : 1;
1861+ unsigned char sprite_enable : 2;
1862+ unsigned char sprite_warping_accuracy : 2;
1863+ unsigned char quant_type : 1;
1864+ unsigned char quarter_sample : 1;
1865+ unsigned char data_partitioned : 1;
1866+ unsigned char reversible_vlc : 1;
1867+ } bits;
1868+ unsigned short value;
1869+ } vol_fields;
1870+ unsigned char no_of_sprite_warping_points;
1871+ short sprite_trajectory_du[3];
1872+ short sprite_trajectory_dv[3];
1873+ unsigned char quant_precision;
1874+ union {
1875+ struct {
1876+ unsigned char vop_coding_type : 2;
1877+ unsigned char backward_reference_vop_coding_type : 2;
1878+ unsigned char vop_rounding_type : 1;
1879+ unsigned char intra_dc_vlc_thr : 3;
1880+ unsigned char top_field_first : 1;
1881+ unsigned char alternate_vertical_scan_flag : 1;
1882+ } bits;
1883+ unsigned short value;
1884+ } vop_fields;
1885+ unsigned char vop_fcode_forward;
1886+ unsigned char vop_fcode_backward;
1887+ /* short header related */
1888+ unsigned char num_gobs_in_vop;
1889+ unsigned char num_macroblocks_in_gob;
1890+ /* for direct mode prediction */
1891+ short TRB;
1892+ short TRD;
1893+} VAPictureParameterBufferMPEG4_0_30;
1894+
1895+/* Encode Slice Parameter Buffer (0.30) */
1896+typedef struct _VAEncSliceParameterBuffer_0_30
1897+{
1898+ unsigned int start_row_number; /* starting MB row number for this slice */
1899+ unsigned int slice_height; /* slice height measured in MB */
1900+ union {
1901+ struct {
1902+ unsigned char is_intra : 1;
1903+ unsigned char disable_deblocking_filter_idc : 2;
1904+ } bits;
1905+ unsigned char value;
1906+ } slice_flags;
1907+} VAEncSliceParameterBuffer_0_30;
1908+
1909+/* MPEG-4 Picture Parameter Buffer (0.31) */
1910+typedef struct _VAPictureParameterBufferMPEG4_0_31
1911+{
1912+ unsigned short vop_width;
1913+ unsigned short vop_height;
1914+ VASurfaceID forward_reference_picture;
1915+ VASurfaceID backward_reference_picture;
1916+ union {
1917+ struct {
1918+ unsigned int short_video_header : 1;
1919+ unsigned int chroma_format : 2;
1920+ unsigned int interlaced : 1;
1921+ unsigned int obmc_disable : 1;
1922+ unsigned int sprite_enable : 2;
1923+ unsigned int sprite_warping_accuracy : 2;
1924+ unsigned int quant_type : 1;
1925+ unsigned int quarter_sample : 1;
1926+ unsigned int data_partitioned : 1;
1927+ unsigned int reversible_vlc : 1;
1928+ } bits;
1929+ unsigned int value;
1930+ } vol_fields;
1931+ unsigned char no_of_sprite_warping_points;
1932+ short sprite_trajectory_du[3];
1933+ short sprite_trajectory_dv[3];
1934+ unsigned char quant_precision;
1935+ union {
1936+ struct {
1937+ unsigned int vop_coding_type : 2;
1938+ unsigned int backward_reference_vop_coding_type : 2;
1939+ unsigned int vop_rounding_type : 1;
1940+ unsigned int intra_dc_vlc_thr : 3;
1941+ unsigned int top_field_first : 1;
1942+ unsigned int alternate_vertical_scan_flag : 1;
1943+ } bits;
1944+ unsigned int value;
1945+ } vop_fields;
1946+ unsigned char vop_fcode_forward;
1947+ unsigned char vop_fcode_backward;
1948+ /* short header related */
1949+ unsigned char num_gobs_in_vop;
1950+ unsigned char num_macroblocks_in_gob;
1951+ /* for direct mode prediction */
1952+ short TRB;
1953+ short TRD;
1954+} VAPictureParameterBufferMPEG4_0_31;
1955+
1956+typedef struct VADriverContext_0_29 *VADriverContextP_0_29;
1957+
1958+/* Driver VTable (0.29) */
1959+struct VADriverVTable_0_29
1960+{
1961+ VAStatus (*vaTerminate) ( VADriverContextP_0_29 ctx );
1962+
1963+ VAStatus (*vaQueryConfigProfiles) (
1964+ VADriverContextP_0_29 ctx,
1965+ VAProfile *profile_list, /* out */
1966+ int *num_profiles /* out */
1967+ );
1968+
1969+ VAStatus (*vaQueryConfigEntrypoints) (
1970+ VADriverContextP_0_29 ctx,
1971+ VAProfile profile,
1972+ VAEntrypoint *entrypoint_list, /* out */
1973+ int *num_entrypoints /* out */
1974+ );
1975+
1976+ VAStatus (*vaGetConfigAttributes) (
1977+ VADriverContextP_0_29 ctx,
1978+ VAProfile profile,
1979+ VAEntrypoint entrypoint,
1980+ VAConfigAttrib *attrib_list, /* in/out */
1981+ int num_attribs
1982+ );
1983+
1984+ VAStatus (*vaCreateConfig) (
1985+ VADriverContextP_0_29 ctx,
1986+ VAProfile profile,
1987+ VAEntrypoint entrypoint,
1988+ VAConfigAttrib *attrib_list,
1989+ int num_attribs,
1990+ VAConfigID *config_id /* out */
1991+ );
1992+
1993+ VAStatus (*vaDestroyConfig) (
1994+ VADriverContextP_0_29 ctx,
1995+ VAConfigID config_id
1996+ );
1997+
1998+ VAStatus (*vaQueryConfigAttributes) (
1999+ VADriverContextP_0_29 ctx,
2000+ VAConfigID config_id,
2001+ VAProfile *profile, /* out */
2002+ VAEntrypoint *entrypoint, /* out */
2003+ VAConfigAttrib *attrib_list, /* out */
2004+ int *num_attribs /* out */
2005+ );
2006+
2007+ VAStatus (*vaCreateSurfaces) (
2008+ VADriverContextP_0_29 ctx,
2009+ int width,
2010+ int height,
2011+ int format,
2012+ int num_surfaces,
2013+ VASurfaceID *surfaces /* out */
2014+ );
2015+
2016+ VAStatus (*vaDestroySurfaces) (
2017+ VADriverContextP_0_29 ctx,
2018+ VASurfaceID *surface_list,
2019+ int num_surfaces
2020+ );
2021+
2022+ VAStatus (*vaCreateContext) (
2023+ VADriverContextP_0_29 ctx,
2024+ VAConfigID config_id,
2025+ int picture_width,
2026+ int picture_height,
2027+ int flag,
2028+ VASurfaceID *render_targets,
2029+ int num_render_targets,
2030+ VAContextID *context /* out */
2031+ );
2032+
2033+ VAStatus (*vaDestroyContext) (
2034+ VADriverContextP_0_29 ctx,
2035+ VAContextID context
2036+ );
2037+
2038+ VAStatus (*vaCreateBuffer) (
2039+ VADriverContextP_0_29 ctx,
2040+ VAContextID context, /* in */
2041+ VABufferType type, /* in */
2042+ unsigned int size, /* in */
2043+ unsigned int num_elements, /* in */
2044+ void *data, /* in */
2045+ VABufferID *buf_id /* out */
2046+ );
2047+
2048+ VAStatus (*vaBufferSetNumElements) (
2049+ VADriverContextP_0_29 ctx,
2050+ VABufferID buf_id, /* in */
2051+ unsigned int num_elements /* in */
2052+ );
2053+
2054+ VAStatus (*vaMapBuffer) (
2055+ VADriverContextP_0_29 ctx,
2056+ VABufferID buf_id, /* in */
2057+ void **pbuf /* out */
2058+ );
2059+
2060+ VAStatus (*vaUnmapBuffer) (
2061+ VADriverContextP_0_29 ctx,
2062+ VABufferID buf_id /* in */
2063+ );
2064+
2065+ VAStatus (*vaDestroyBuffer) (
2066+ VADriverContextP_0_29 ctx,
2067+ VABufferID buffer_id
2068+ );
2069+
2070+ VAStatus (*vaBeginPicture) (
2071+ VADriverContextP_0_29 ctx,
2072+ VAContextID context,
2073+ VASurfaceID render_target
2074+ );
2075+
2076+ VAStatus (*vaRenderPicture) (
2077+ VADriverContextP_0_29 ctx,
2078+ VAContextID context,
2079+ VABufferID *buffers,
2080+ int num_buffers
2081+ );
2082+
2083+ VAStatus (*vaEndPicture) (
2084+ VADriverContextP_0_29 ctx,
2085+ VAContextID context
2086+ );
2087+
2088+ VAStatus (*vaSyncSurface) (
2089+ VADriverContextP_0_29 ctx,
2090+ VAContextID context,
2091+ VASurfaceID render_target
2092+ );
2093+
2094+ VAStatus (*vaQuerySurfaceStatus) (
2095+ VADriverContextP_0_29 ctx,
2096+ VASurfaceID render_target,
2097+ VASurfaceStatus *status /* out */
2098+ );
2099+
2100+ VAStatus (*vaPutSurface) (
2101+ VADriverContextP_0_29 ctx,
2102+ VASurfaceID surface,
2103+ unsigned long draw, /* X Drawable */
2104+ short srcx,
2105+ short srcy,
2106+ unsigned short srcw,
2107+ unsigned short srch,
2108+ short destx,
2109+ short desty,
2110+ unsigned short destw,
2111+ unsigned short desth,
2112+ VARectangle *cliprects, /* client supplied clip list */
2113+ unsigned int number_cliprects, /* number of clip rects in the clip list */
2114+ unsigned int flags /* de-interlacing flags */
2115+ );
2116+
2117+ VAStatus (*vaQueryImageFormats) (
2118+ VADriverContextP_0_29 ctx,
2119+ VAImageFormat *format_list, /* out */
2120+ int *num_formats /* out */
2121+ );
2122+
2123+ VAStatus (*vaCreateImage) (
2124+ VADriverContextP_0_29 ctx,
2125+ VAImageFormat *format,
2126+ int width,
2127+ int height,
2128+ VAImage *image /* out */
2129+ );
2130+
2131+ VAStatus (*vaDeriveImage) (
2132+ VADriverContextP_0_29 ctx,
2133+ VASurfaceID surface,
2134+ VAImage *image /* out */
2135+ );
2136+
2137+ VAStatus (*vaDestroyImage) (
2138+ VADriverContextP_0_29 ctx,
2139+ VAImageID image
2140+ );
2141+
2142+ VAStatus (*vaSetImagePalette) (
2143+ VADriverContextP_0_29 ctx,
2144+ VAImageID image,
2145+ /*
2146+ * pointer to an array holding the palette data. The size of the array is
2147+ * num_palette_entries * entry_bytes in size. The order of the components
2148+ * in the palette is described by the component_order in VAImage struct
2149+ */
2150+ unsigned char *palette
2151+ );
2152+
2153+ VAStatus (*vaGetImage) (
2154+ VADriverContextP_0_29 ctx,
2155+ VASurfaceID surface,
2156+ int x, /* coordinates of the upper left source pixel */
2157+ int y,
2158+ unsigned int width, /* width and height of the region */
2159+ unsigned int height,
2160+ VAImageID image
2161+ );
2162+
2163+ VAStatus (*vaPutImage) (
2164+ VADriverContextP_0_29 ctx,
2165+ VASurfaceID surface,
2166+ VAImageID image,
2167+ int src_x,
2168+ int src_y,
2169+ unsigned int width,
2170+ unsigned int height,
2171+ int dest_x,
2172+ int dest_y
2173+ );
2174+
2175+ VAStatus (*vaPutImage2) (
2176+ VADriverContextP_0_29 ctx,
2177+ VASurfaceID surface,
2178+ VAImageID image,
2179+ int src_x,
2180+ int src_y,
2181+ unsigned int src_width,
2182+ unsigned int src_height,
2183+ int dest_x,
2184+ int dest_y,
2185+ unsigned int dest_width,
2186+ unsigned int dest_height
2187+ );
2188+
2189+ VAStatus (*vaQuerySubpictureFormats) (
2190+ VADriverContextP_0_29 ctx,
2191+ VAImageFormat *format_list, /* out */
2192+ unsigned int *flags, /* out */
2193+ unsigned int *num_formats /* out */
2194+ );
2195+
2196+ VAStatus (*vaCreateSubpicture) (
2197+ VADriverContextP_0_29 ctx,
2198+ VAImageID image,
2199+ VASubpictureID *subpicture /* out */
2200+ );
2201+
2202+ VAStatus (*vaDestroySubpicture) (
2203+ VADriverContextP_0_29 ctx,
2204+ VASubpictureID subpicture
2205+ );
2206+
2207+ VAStatus (*vaSetSubpictureImage) (
2208+ VADriverContextP_0_29 ctx,
2209+ VASubpictureID subpicture,
2210+ VAImageID image
2211+ );
2212+
2213+ VAStatus (*vaSetSubpicturePalette) (
2214+ VADriverContextP_0_29 ctx,
2215+ VASubpictureID subpicture,
2216+ /*
2217+ * pointer to an array holding the palette data. The size of the array is
2218+ * num_palette_entries * entry_bytes in size. The order of the components
2219+ * in the palette is described by the component_order in VASubpicture struct
2220+ */
2221+ unsigned char *palette
2222+ );
2223+
2224+ VAStatus (*vaSetSubpictureChromakey) (
2225+ VADriverContextP_0_29 ctx,
2226+ VASubpictureID subpicture,
2227+ unsigned int chromakey_min,
2228+ unsigned int chromakey_max,
2229+ unsigned int chromakey_mask
2230+ );
2231+
2232+ VAStatus (*vaSetSubpictureGlobalAlpha) (
2233+ VADriverContextP_0_29 ctx,
2234+ VASubpictureID subpicture,
2235+ float global_alpha
2236+ );
2237+
2238+ VAStatus (*vaAssociateSubpicture) (
2239+ VADriverContextP_0_29 ctx,
2240+ VASubpictureID subpicture,
2241+ VASurfaceID *target_surfaces,
2242+ int num_surfaces,
2243+ short src_x, /* upper left offset in subpicture */
2244+ short src_y,
2245+ short dest_x, /* upper left offset in surface */
2246+ short dest_y,
2247+ unsigned short width,
2248+ unsigned short height,
2249+ /*
2250+ * whether to enable chroma-keying or global-alpha
2251+ * see VA_SUBPICTURE_XXX values
2252+ */
2253+ unsigned int flags
2254+ );
2255+
2256+ VAStatus (*vaAssociateSubpicture2) (
2257+ VADriverContextP_0_29 ctx,
2258+ VASubpictureID subpicture,
2259+ VASurfaceID *target_surfaces,
2260+ int num_surfaces,
2261+ short src_x, /* upper left offset in subpicture */
2262+ short src_y,
2263+ unsigned short src_width,
2264+ unsigned short src_height,
2265+ short dest_x, /* upper left offset in surface */
2266+ short dest_y,
2267+ unsigned short dest_width,
2268+ unsigned short dest_height,
2269+ /*
2270+ * whether to enable chroma-keying or global-alpha
2271+ * see VA_SUBPICTURE_XXX values
2272+ */
2273+ unsigned int flags
2274+ );
2275+
2276+ VAStatus (*vaDeassociateSubpicture) (
2277+ VADriverContextP_0_29 ctx,
2278+ VASubpictureID subpicture,
2279+ VASurfaceID *target_surfaces,
2280+ int num_surfaces
2281+ );
2282+
2283+ VAStatus (*vaQueryDisplayAttributes) (
2284+ VADriverContextP_0_29 ctx,
2285+ VADisplayAttribute *attr_list, /* out */
2286+ int *num_attributes /* out */
2287+ );
2288+
2289+ VAStatus (*vaGetDisplayAttributes) (
2290+ VADriverContextP_0_29 ctx,
2291+ VADisplayAttribute *attr_list, /* in/out */
2292+ int num_attributes
2293+ );
2294+
2295+ VAStatus (*vaSetDisplayAttributes) (
2296+ VADriverContextP_0_29 ctx,
2297+ VADisplayAttribute *attr_list,
2298+ int num_attributes
2299+ );
2300+
2301+
2302+ VAStatus (*vaDbgCopySurfaceToBuffer) (
2303+ VADriverContextP_0_29 ctx,
2304+ VASurfaceID surface,
2305+ void **buffer, /* out */
2306+ unsigned int *stride /* out */
2307+ );
2308+};
2309+
2310+/* Driver context (0.29) */
2311+struct VADriverContext_0_29
2312+{
2313+ void *old_pNext; /* preserved for binary compatibility */
2314+
2315+ void *pDriverData;
2316+ struct VADriverVTable_0_29 vtable;
2317+
2318+ void *x11_dpy;
2319+ int x11_screen;
2320+
2321+ int version_major;
2322+ int version_minor;
2323+ int max_profiles;
2324+ int max_entrypoints;
2325+ int max_attributes;
2326+ int max_image_formats;
2327+ int max_subpic_formats;
2328+ int max_display_attributes;
2329+ const char *str_vendor;
2330+
2331+ void *handle; /* dlopen handle */
2332+};
2333+
2334+/* Forward declarations for VA API 0.30 */
2335+struct v4l2_format;
2336+struct v4l2_buffer;
2337+typedef struct VADriverContext_0_30 *VADriverContextP_0_30;
2338+
2339+/* Driver VTable (0.30) */
2340+struct VADriverVTable_0_30
2341+{
2342+ VAStatus (*vaTerminate) ( VADriverContextP_0_30 ctx );
2343+
2344+ VAStatus (*vaQueryConfigProfiles) (
2345+ VADriverContextP_0_30 ctx,
2346+ VAProfile *profile_list, /* out */
2347+ int *num_profiles /* out */
2348+ );
2349+
2350+ VAStatus (*vaQueryConfigEntrypoints) (
2351+ VADriverContextP_0_30 ctx,
2352+ VAProfile profile,
2353+ VAEntrypoint *entrypoint_list, /* out */
2354+ int *num_entrypoints /* out */
2355+ );
2356+
2357+ VAStatus (*vaGetConfigAttributes) (
2358+ VADriverContextP_0_30 ctx,
2359+ VAProfile profile,
2360+ VAEntrypoint entrypoint,
2361+ VAConfigAttrib *attrib_list, /* in/out */
2362+ int num_attribs
2363+ );
2364+
2365+ VAStatus (*vaCreateConfig) (
2366+ VADriverContextP_0_30 ctx,
2367+ VAProfile profile,
2368+ VAEntrypoint entrypoint,
2369+ VAConfigAttrib *attrib_list,
2370+ int num_attribs,
2371+ VAConfigID *config_id /* out */
2372+ );
2373+
2374+ VAStatus (*vaDestroyConfig) (
2375+ VADriverContextP_0_30 ctx,
2376+ VAConfigID config_id
2377+ );
2378+
2379+ VAStatus (*vaQueryConfigAttributes) (
2380+ VADriverContextP_0_30 ctx,
2381+ VAConfigID config_id,
2382+ VAProfile *profile, /* out */
2383+ VAEntrypoint *entrypoint, /* out */
2384+ VAConfigAttrib *attrib_list, /* out */
2385+ int *num_attribs /* out */
2386+ );
2387+
2388+ VAStatus (*vaCreateSurfaces) (
2389+ VADriverContextP_0_30 ctx,
2390+ int width,
2391+ int height,
2392+ int format,
2393+ int num_surfaces,
2394+ VASurfaceID *surfaces /* out */
2395+ );
2396+
2397+ VAStatus (*vaDestroySurfaces) (
2398+ VADriverContextP_0_30 ctx,
2399+ VASurfaceID *surface_list,
2400+ int num_surfaces
2401+ );
2402+
2403+ VAStatus (*vaCreateContext) (
2404+ VADriverContextP_0_30 ctx,
2405+ VAConfigID config_id,
2406+ int picture_width,
2407+ int picture_height,
2408+ int flag,
2409+ VASurfaceID *render_targets,
2410+ int num_render_targets,
2411+ VAContextID *context /* out */
2412+ );
2413+
2414+ VAStatus (*vaDestroyContext) (
2415+ VADriverContextP_0_30 ctx,
2416+ VAContextID context
2417+ );
2418+
2419+ VAStatus (*vaCreateBuffer) (
2420+ VADriverContextP_0_30 ctx,
2421+ VAContextID context, /* in */
2422+ VABufferType type, /* in */
2423+ unsigned int size, /* in */
2424+ unsigned int num_elements, /* in */
2425+ void *data, /* in */
2426+ VABufferID *buf_id /* out */
2427+ );
2428+
2429+ VAStatus (*vaBufferSetNumElements) (
2430+ VADriverContextP_0_30 ctx,
2431+ VABufferID buf_id, /* in */
2432+ unsigned int num_elements /* in */
2433+ );
2434+
2435+ VAStatus (*vaMapBuffer) (
2436+ VADriverContextP_0_30 ctx,
2437+ VABufferID buf_id, /* in */
2438+ void **pbuf /* out */
2439+ );
2440+
2441+ VAStatus (*vaUnmapBuffer) (
2442+ VADriverContextP_0_30 ctx,
2443+ VABufferID buf_id /* in */
2444+ );
2445+
2446+ VAStatus (*vaDestroyBuffer) (
2447+ VADriverContextP_0_30 ctx,
2448+ VABufferID buffer_id
2449+ );
2450+
2451+ VAStatus (*vaBeginPicture) (
2452+ VADriverContextP_0_30 ctx,
2453+ VAContextID context,
2454+ VASurfaceID render_target
2455+ );
2456+
2457+ VAStatus (*vaRenderPicture) (
2458+ VADriverContextP_0_30 ctx,
2459+ VAContextID context,
2460+ VABufferID *buffers,
2461+ int num_buffers
2462+ );
2463+
2464+ VAStatus (*vaEndPicture) (
2465+ VADriverContextP_0_30 ctx,
2466+ VAContextID context
2467+ );
2468+
2469+ VAStatus (*vaSyncSurface) (
2470+ VADriverContextP_0_30 ctx,
2471+ VAContextID context,
2472+ VASurfaceID render_target
2473+ );
2474+
2475+ VAStatus (*vaQuerySurfaceStatus) (
2476+ VADriverContextP_0_30 ctx,
2477+ VASurfaceID render_target,
2478+ VASurfaceStatus *status /* out */
2479+ );
2480+
2481+ VAStatus (*vaPutSurface) (
2482+ VADriverContextP_0_30 ctx,
2483+ VASurfaceID surface,
2484+ unsigned long draw, /* X Drawable */
2485+ short srcx,
2486+ short srcy,
2487+ unsigned short srcw,
2488+ unsigned short srch,
2489+ short destx,
2490+ short desty,
2491+ unsigned short destw,
2492+ unsigned short desth,
2493+ VARectangle *cliprects, /* client supplied clip list */
2494+ unsigned int number_cliprects, /* number of clip rects in the clip list */
2495+ unsigned int flags /* de-interlacing flags */
2496+ );
2497+
2498+ VAStatus (*vaQueryImageFormats) (
2499+ VADriverContextP_0_30 ctx,
2500+ VAImageFormat *format_list, /* out */
2501+ int *num_formats /* out */
2502+ );
2503+
2504+ VAStatus (*vaCreateImage) (
2505+ VADriverContextP_0_30 ctx,
2506+ VAImageFormat *format,
2507+ int width,
2508+ int height,
2509+ VAImage *image /* out */
2510+ );
2511+
2512+ VAStatus (*vaDeriveImage) (
2513+ VADriverContextP_0_30 ctx,
2514+ VASurfaceID surface,
2515+ VAImage *image /* out */
2516+ );
2517+
2518+ VAStatus (*vaDestroyImage) (
2519+ VADriverContextP_0_30 ctx,
2520+ VAImageID image
2521+ );
2522+
2523+ VAStatus (*vaSetImagePalette) (
2524+ VADriverContextP_0_30 ctx,
2525+ VAImageID image,
2526+ /*
2527+ * pointer to an array holding the palette data. The size of the array is
2528+ * num_palette_entries * entry_bytes in size. The order of the components
2529+ * in the palette is described by the component_order in VAImage struct
2530+ */
2531+ unsigned char *palette
2532+ );
2533+
2534+ VAStatus (*vaGetImage) (
2535+ VADriverContextP_0_30 ctx,
2536+ VASurfaceID surface,
2537+ int x, /* coordinates of the upper left source pixel */
2538+ int y,
2539+ unsigned int width, /* width and height of the region */
2540+ unsigned int height,
2541+ VAImageID image
2542+ );
2543+
2544+ VAStatus (*vaPutImage) (
2545+ VADriverContextP_0_30 ctx,
2546+ VASurfaceID surface,
2547+ VAImageID image,
2548+ int src_x,
2549+ int src_y,
2550+ unsigned int width,
2551+ unsigned int height,
2552+ int dest_x,
2553+ int dest_y
2554+ );
2555+
2556+ VAStatus (*vaPutImage2) (
2557+ VADriverContextP_0_30 ctx,
2558+ VASurfaceID surface,
2559+ VAImageID image,
2560+ int src_x,
2561+ int src_y,
2562+ unsigned int src_width,
2563+ unsigned int src_height,
2564+ int dest_x,
2565+ int dest_y,
2566+ unsigned int dest_width,
2567+ unsigned int dest_height
2568+ );
2569+
2570+ VAStatus (*vaQuerySubpictureFormats) (
2571+ VADriverContextP_0_30 ctx,
2572+ VAImageFormat *format_list, /* out */
2573+ unsigned int *flags, /* out */
2574+ unsigned int *num_formats /* out */
2575+ );
2576+
2577+ VAStatus (*vaCreateSubpicture) (
2578+ VADriverContextP_0_30 ctx,
2579+ VAImageID image,
2580+ VASubpictureID *subpicture /* out */
2581+ );
2582+
2583+ VAStatus (*vaDestroySubpicture) (
2584+ VADriverContextP_0_30 ctx,
2585+ VASubpictureID subpicture
2586+ );
2587+
2588+ VAStatus (*vaSetSubpictureImage) (
2589+ VADriverContextP_0_30 ctx,
2590+ VASubpictureID subpicture,
2591+ VAImageID image
2592+ );
2593+
2594+ VAStatus (*vaSetSubpictureChromakey) (
2595+ VADriverContextP_0_30 ctx,
2596+ VASubpictureID subpicture,
2597+ unsigned int chromakey_min,
2598+ unsigned int chromakey_max,
2599+ unsigned int chromakey_mask
2600+ );
2601+
2602+ VAStatus (*vaSetSubpictureGlobalAlpha) (
2603+ VADriverContextP_0_30 ctx,
2604+ VASubpictureID subpicture,
2605+ float global_alpha
2606+ );
2607+
2608+ VAStatus (*vaAssociateSubpicture) (
2609+ VADriverContextP_0_30 ctx,
2610+ VASubpictureID subpicture,
2611+ VASurfaceID *target_surfaces,
2612+ int num_surfaces,
2613+ short src_x, /* upper left offset in subpicture */
2614+ short src_y,
2615+ short dest_x, /* upper left offset in surface */
2616+ short dest_y,
2617+ unsigned short width,
2618+ unsigned short height,
2619+ /*
2620+ * whether to enable chroma-keying or global-alpha
2621+ * see VA_SUBPICTURE_XXX values
2622+ */
2623+ unsigned int flags
2624+ );
2625+
2626+ VAStatus (*vaAssociateSubpicture2) (
2627+ VADriverContextP_0_30 ctx,
2628+ VASubpictureID subpicture,
2629+ VASurfaceID *target_surfaces,
2630+ int num_surfaces,
2631+ short src_x, /* upper left offset in subpicture */
2632+ short src_y,
2633+ unsigned short src_width,
2634+ unsigned short src_height,
2635+ short dest_x, /* upper left offset in surface */
2636+ short dest_y,
2637+ unsigned short dest_width,
2638+ unsigned short dest_height,
2639+ /*
2640+ * whether to enable chroma-keying or global-alpha
2641+ * see VA_SUBPICTURE_XXX values
2642+ */
2643+ unsigned int flags
2644+ );
2645+
2646+ VAStatus (*vaDeassociateSubpicture) (
2647+ VADriverContextP_0_30 ctx,
2648+ VASubpictureID subpicture,
2649+ VASurfaceID *target_surfaces,
2650+ int num_surfaces
2651+ );
2652+
2653+ VAStatus (*vaQueryDisplayAttributes) (
2654+ VADriverContextP_0_30 ctx,
2655+ VADisplayAttribute *attr_list, /* out */
2656+ int *num_attributes /* out */
2657+ );
2658+
2659+ VAStatus (*vaGetDisplayAttributes) (
2660+ VADriverContextP_0_30 ctx,
2661+ VADisplayAttribute *attr_list, /* in/out */
2662+ int num_attributes
2663+ );
2664+
2665+ VAStatus (*vaSetDisplayAttributes) (
2666+ VADriverContextP_0_30 ctx,
2667+ VADisplayAttribute *attr_list,
2668+ int num_attributes
2669+ );
2670+
2671+ /* device specific */
2672+ VAStatus (*vaCreateSurfaceFromCIFrame) (
2673+ VADriverContextP_0_30 ctx,
2674+ unsigned long frame_id,
2675+ VASurfaceID *surface /* out */
2676+ );
2677+
2678+
2679+ VAStatus (*vaCreateSurfaceFromV4L2Buf) (
2680+ VADriverContextP_0_30 ctx,
2681+ int v4l2_fd, /* file descriptor of V4L2 device */
2682+ struct v4l2_format *v4l2_fmt, /* format of V4L2 */
2683+ struct v4l2_buffer *v4l2_buf, /* V4L2 buffer */
2684+ VASurfaceID *surface /* out */
2685+ );
2686+
2687+ VAStatus (*vaCopySurfaceToBuffer) (
2688+ VADriverContextP_0_30 ctx,
2689+ VASurfaceID surface,
2690+ unsigned int *fourcc, /* out for follow argument */
2691+ unsigned int *luma_stride,
2692+ unsigned int *chroma_u_stride,
2693+ unsigned int *chroma_v_stride,
2694+ unsigned int *luma_offset,
2695+ unsigned int *chroma_u_offset,
2696+ unsigned int *chroma_v_offset,
2697+ void **buffer
2698+ );
2699+};
2700+
2701+/* Driver context (0.30) */
2702+struct VADriverContext_0_30
2703+{
2704+ void *pDriverData;
2705+ struct VADriverVTable_0_30 vtable;
2706+
2707+ void *x11_dpy;
2708+ int x11_screen;
2709+ int version_major;
2710+ int version_minor;
2711+ int max_profiles;
2712+ int max_entrypoints;
2713+ int max_attributes;
2714+ int max_image_formats;
2715+ int max_subpic_formats;
2716+ int max_display_attributes;
2717+ const char *str_vendor;
2718+
2719+ void *handle; /* dlopen handle */
2720+
2721+ void *dri_state;
2722+};
2723+
2724+/* Driver VTable and context (0.31) */
2725+#define VADriverVTable_0_31 VADriverVTable
2726+#define VADriverContext_0_31 VADriverContext
2727+
2728+#endif /* VA_COMPAT_H */
2729diff --git a/src/va_compat_template.h b/src/va_compat_template.h
2730new file mode 100644
2731index 0000000..18349de
2732--- /dev/null
2733+++ b/src/va_compat_template.h
2734@@ -0,0 +1,539 @@
2735+/*
2736+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
2737+ *
2738+ * Permission is hereby granted, free of charge, to any person obtaining a
2739+ * copy of this software and associated documentation files (the
2740+ * "Software"), to deal in the Software without restriction, including
2741+ * without limitation the rights to use, copy, modify, merge, publish,
2742+ * distribute, sub license, and/or sell copies of the Software, and to
2743+ * permit persons to whom the Software is furnished to do so, subject to
2744+ * the following conditions:
2745+ *
2746+ * The above copyright notice and this permission notice (including the
2747+ * next paragraph) shall be included in all copies or substantial portions
2748+ * of the Software.
2749+ *
2750+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2751+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2752+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2753+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
2754+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2755+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2756+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2757+ */
2758+
2759+#undef CONCAT_
2760+#define CONCAT_(x, y) x##y
2761+#undef CONCAT
2762+#define CONCAT(x, y) CONCAT_(x, y)
2763+#undef MKCOMPAT_
2764+#define MKCOMPAT_(NAME,MINOR) CONCAT(CONCAT(NAME,_0_),MINOR)
2765+#undef MKCOMPAT
2766+#define MKCOMPAT(NAME) MKCOMPAT_(NAME,COMPAT_MINOR)
2767+#undef STRUCT
2768+#define STRUCT(BUFFER, CODEC) MKCOMPAT(VA##BUFFER##Buffer##CODEC)
2769+#undef TRANSLATE_1
2770+#define TRANSLATE_1(NAME) CONCAT(va_compat_translate_,NAME)
2771+#undef TRANSLATE_
2772+#define TRANSLATE_(NAME) TRANSLATE_1(MKCOMPAT(NAME))
2773+#undef TRANSLATE
2774+#define TRANSLATE(BUFFER, CODEC) TRANSLATE_1(STRUCT(BUFFER,CODEC))
2775+
2776+#undef COPY_ARRAY
2777+#define COPY_ARRAY(DST, SRC, ARRAY) \
2778+ memcpy((DST)->ARRAY, (SRC)->ARRAY, sizeof((DST)->ARRAY))
2779+
2780+#undef COPY_FIELD
2781+#define COPY_FIELD(DST, SRC, MEMBER) \
2782+ (DST)->MEMBER = (SRC)->MEMBER
2783+
2784+#undef COPY_VTABLE__
2785+#define COPY_VTABLE__(DST, DST_MEMBER, SRC, SRC_MEMBER) \
2786+ (DST##_vtable)->DST_MEMBER = (SRC##_vtable)->SRC_MEMBER
2787+
2788+#undef COPY_VTABLE_
2789+#define COPY_VTABLE_(DST, DST_SUFFIX, SRC, MEMBER) \
2790+ COPY_VTABLE__(DST, MEMBER##_##DST_SUFFIX, SRC, MEMBER)
2791+
2792+#undef COPY_VTABLE
2793+#define COPY_VTABLE(DST, SRC, MEMBER) \
2794+ COPY_VTABLE__(DST, MEMBER, SRC, MEMBER)
2795+
2796+/* 0.29 */
2797+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 29
2798+#undef BFV
2799+#define BFV(a, b) a
2800+#undef BFM
2801+#define BFM(a, b, c) c
2802+#undef COPY_BIT_FIELD
2803+#define COPY_BIT_FIELD(DST, SRC, FIELD, MEMBER) \
2804+ (DST)->MEMBER = (SRC)->FIELD.bits.MEMBER
2805+#undef COPY_BIT_FLAG
2806+#define COPY_BIT_FLAG(DST, SRC, FIELD, MEMBER) \
2807+ (DST)->MEMBER = (SRC)->FIELD.flags.MEMBER
2808+#endif
2809+
2810+/* 0.29 glue to match 0.30 names */
2811+#undef M_raw_coding
2812+#undef M_bitplane_present
2813+#undef M_luma_flag
2814+#undef M_luma
2815+#undef M_chroma_flag
2816+#undef M_chroma
2817+
2818+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 29
2819+#define M_raw_coding raw_coding_flag
2820+#define M_bitplane_present bitplane_present_flag
2821+#define M_luma_flag range_mapping_luma_flag
2822+#define M_luma range_mapping_luma
2823+#define M_chroma_flag range_mapping_chroma_flag
2824+#define M_chroma range_mapping_chroma
2825+#else
2826+#define M_raw_coding raw_coding
2827+#define M_bitplane_present bitplane_present
2828+#define M_luma_flag luma_flag
2829+#define M_luma luma
2830+#define M_chroma_flag chroma_flag
2831+#define M_chroma chroma
2832+#endif
2833+
2834+/* 0.30 */
2835+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
2836+#undef BFV
2837+#define BFV(a, b) a.b
2838+#undef BFM
2839+#define BFM(a, b, c) a.b.c
2840+#undef COPY_BIT_FIELD
2841+#define COPY_BIT_FIELD(DST, SRC, FIELD, MEMBER) \
2842+ (DST)->FIELD.bits.MEMBER = (SRC)->FIELD.bits.MEMBER
2843+#undef COPY_BIT_FLAG
2844+#define COPY_BIT_FLAG(DST, SRC, FIELD, MEMBER) \
2845+ (DST)->FIELD.flags.MEMBER = (SRC)->FIELD.flags.MEMBER
2846+#endif
2847+
2848+#if COMPAT_MAJOR == 0 && COMPAT_MINOR < 31
2849+static VAStatus TRANSLATE_(VAPictureH264)(
2850+ VACompatContextP ctx,
2851+ void *dest_pic,
2852+ const void *src_pic
2853+)
2854+{
2855+ MKCOMPAT(VAPictureH264) *dest = dest_pic;
2856+ const VAPictureH264 *src = src_pic;
2857+
2858+ COPY_FIELD(dest, src, picture_id);
2859+ COPY_FIELD(dest, src, flags);
2860+ COPY_FIELD(dest, src, TopFieldOrderCnt);
2861+ COPY_FIELD(dest, src, BottomFieldOrderCnt);
2862+
2863+ return VA_STATUS_SUCCESS;
2864+}
2865+
2866+static VAStatus TRANSLATE(PictureParameter,H264)(
2867+ VACompatContextP ctx,
2868+ void *dest_buffer,
2869+ const void *src_buffer
2870+)
2871+{
2872+ STRUCT(PictureParameter,H264) *dest = dest_buffer;
2873+ const VAPictureParameterBufferH264 *src = src_buffer;
2874+ VAStatus status;
2875+ int i;
2876+
2877+ status = TRANSLATE_(VAPictureH264)(ctx,
2878+ &dest->CurrPic, &src->CurrPic);
2879+ if (status != VA_STATUS_SUCCESS)
2880+ return status;
2881+
2882+ for (i = 0; i < 16; i++) {
2883+ status = TRANSLATE_(VAPictureH264)(ctx,
2884+ &dest->ReferenceFrames[i],
2885+ &src->ReferenceFrames[i]);
2886+ if (status != VA_STATUS_SUCCESS)
2887+ return status;
2888+ }
2889+
2890+ COPY_FIELD(dest, src, picture_width_in_mbs_minus1);
2891+ COPY_FIELD(dest, src, picture_height_in_mbs_minus1);
2892+ COPY_FIELD(dest, src, bit_depth_luma_minus8);
2893+ COPY_FIELD(dest, src, bit_depth_chroma_minus8);
2894+ COPY_FIELD(dest, src, num_ref_frames);
2895+ dest->BFV(seq_fields, value) = 0; /* reset all bits */
2896+ COPY_BIT_FIELD(dest, src, seq_fields, chroma_format_idc);
2897+ COPY_BIT_FIELD(dest, src, seq_fields, residual_colour_transform_flag);
2898+ COPY_BIT_FIELD(dest, src, seq_fields, frame_mbs_only_flag);
2899+ COPY_BIT_FIELD(dest, src, seq_fields, mb_adaptive_frame_field_flag);
2900+ COPY_BIT_FIELD(dest, src, seq_fields, direct_8x8_inference_flag);
2901+ COPY_BIT_FIELD(dest, src, seq_fields, MinLumaBiPredSize8x8);
2902+ COPY_FIELD(dest, src, num_slice_groups_minus1);
2903+ COPY_FIELD(dest, src, slice_group_map_type);
2904+ COPY_FIELD(dest, src, pic_init_qp_minus26);
2905+ COPY_FIELD(dest, src, chroma_qp_index_offset);
2906+ COPY_FIELD(dest, src, second_chroma_qp_index_offset);
2907+ dest->BFV(pic_fields, value) = 0; /* reset all bits */
2908+ COPY_BIT_FIELD(dest, src, pic_fields, entropy_coding_mode_flag);
2909+ COPY_BIT_FIELD(dest, src, pic_fields, weighted_pred_flag);
2910+ COPY_BIT_FIELD(dest, src, pic_fields, weighted_bipred_idc);
2911+ COPY_BIT_FIELD(dest, src, pic_fields, transform_8x8_mode_flag);
2912+ COPY_BIT_FIELD(dest, src, pic_fields, field_pic_flag);
2913+ COPY_BIT_FIELD(dest, src, pic_fields, constrained_intra_pred_flag);
2914+ COPY_FIELD(dest, src, frame_num);
2915+
2916+ return VA_STATUS_SUCCESS;
2917+}
2918+
2919+static VAStatus TRANSLATE(SliceParameter,H264)(
2920+ VACompatContextP ctx,
2921+ void *dest_buffer,
2922+ const void *src_buffer
2923+)
2924+{
2925+ STRUCT(SliceParameter,H264) *dest = dest_buffer;
2926+ const VASliceParameterBufferH264 *src = src_buffer;
2927+ VAStatus status;
2928+ int i;
2929+
2930+ COPY_FIELD(dest, src, slice_data_size);
2931+ COPY_FIELD(dest, src, slice_data_offset);
2932+ COPY_FIELD(dest, src, slice_data_flag);
2933+ COPY_FIELD(dest, src, slice_data_bit_offset);
2934+ COPY_FIELD(dest, src, first_mb_in_slice);
2935+ COPY_FIELD(dest, src, slice_type);
2936+ COPY_FIELD(dest, src, direct_spatial_mv_pred_flag);
2937+ COPY_FIELD(dest, src, num_ref_idx_l0_active_minus1);
2938+ COPY_FIELD(dest, src, num_ref_idx_l1_active_minus1);
2939+ COPY_FIELD(dest, src, cabac_init_idc);
2940+ COPY_FIELD(dest, src, slice_qp_delta);
2941+ COPY_FIELD(dest, src, disable_deblocking_filter_idc);
2942+ COPY_FIELD(dest, src, slice_alpha_c0_offset_div2);
2943+ COPY_FIELD(dest, src, slice_beta_offset_div2);
2944+ for (i = 0; i < 32; i++) {
2945+ status = TRANSLATE_(VAPictureH264)(ctx,
2946+ &dest->RefPicList0[i],
2947+ &src->RefPicList0[i]);
2948+ if (status != VA_STATUS_SUCCESS)
2949+ return status;
2950+ status = TRANSLATE_(VAPictureH264)(ctx,
2951+ &dest->RefPicList1[i],
2952+ &src->RefPicList1[i]);
2953+ if (status != VA_STATUS_SUCCESS)
2954+ return status;
2955+ }
2956+ COPY_FIELD(dest, src, luma_log2_weight_denom);
2957+ COPY_FIELD(dest, src, chroma_log2_weight_denom);
2958+ COPY_FIELD(dest, src, luma_weight_l0_flag);
2959+ COPY_ARRAY(dest, src, luma_weight_l0);
2960+ COPY_ARRAY(dest, src, luma_offset_l0);
2961+ COPY_FIELD(dest, src, chroma_weight_l0_flag);
2962+ COPY_ARRAY(dest, src, chroma_weight_l0);
2963+ COPY_ARRAY(dest, src, chroma_offset_l0);
2964+ COPY_FIELD(dest, src, luma_weight_l1_flag);
2965+ COPY_ARRAY(dest, src, luma_weight_l1);
2966+ COPY_ARRAY(dest, src, luma_offset_l1);
2967+ COPY_FIELD(dest, src, chroma_weight_l1_flag);
2968+ COPY_ARRAY(dest, src, chroma_weight_l1);
2969+ COPY_ARRAY(dest, src, chroma_offset_l1);
2970+
2971+ return VA_STATUS_SUCCESS;
2972+}
2973+
2974+static VAStatus TRANSLATE(PictureParameter,VC1)(
2975+ VACompatContextP ctx,
2976+ void *dest_buffer,
2977+ const void *src_buffer
2978+)
2979+{
2980+ STRUCT(PictureParameter,VC1) *dest = dest_buffer;
2981+ const VAPictureParameterBufferVC1 *src = src_buffer;
2982+
2983+ COPY_FIELD(dest, src, forward_reference_picture);
2984+ COPY_FIELD(dest, src, backward_reference_picture);
2985+ COPY_FIELD(dest, src, inloop_decoded_picture);
2986+ dest->BFV(sequence_fields, value) = 0; /* reset all bits */
2987+ COPY_BIT_FIELD(dest, src, sequence_fields, interlace);
2988+ COPY_BIT_FIELD(dest, src, sequence_fields, syncmarker);
2989+ COPY_BIT_FIELD(dest, src, sequence_fields, overlap);
2990+ COPY_FIELD(dest, src, coded_width);
2991+ COPY_FIELD(dest, src, coded_height);
2992+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
2993+ dest->closed_entry = src->entrypoint_fields.bits.closed_entry;
2994+ dest->broken_link = src->entrypoint_fields.bits.broken_link;
2995+ dest->loopfilter = src->entrypoint_fields.bits.loopfilter;
2996+#else
2997+ COPY_BIT_FIELD(dest, src, entrypoint_fields, closed_entry);
2998+ COPY_BIT_FIELD(dest, src, entrypoint_fields, broken_link);
2999+ COPY_BIT_FIELD(dest, src, entrypoint_fields, loopfilter);
3000+#endif
3001+ COPY_FIELD(dest, src, conditional_overlap_flag);
3002+ COPY_FIELD(dest, src, fast_uvmc_flag);
3003+ dest->BFV(range_mapping_fields, value) = 0; /* reset all bits */
3004+ dest->BFM(range_mapping_fields, bits, M_luma_flag) =
3005+ src->range_mapping_fields.bits.luma_flag;
3006+ dest->BFM(range_mapping_fields, bits, M_luma) =
3007+ src->range_mapping_fields.bits.luma;
3008+ dest->BFM(range_mapping_fields, bits, M_chroma_flag) =
3009+ src->range_mapping_fields.bits.chroma_flag;
3010+ dest->BFM(range_mapping_fields, bits, M_chroma) =
3011+ src->range_mapping_fields.bits.chroma;
3012+ COPY_FIELD(dest, src, b_picture_fraction);
3013+ COPY_FIELD(dest, src, cbp_table);
3014+ COPY_FIELD(dest, src, mb_mode_table);
3015+ COPY_FIELD(dest, src, range_reduction_frame);
3016+ COPY_FIELD(dest, src, rounding_control);
3017+ COPY_FIELD(dest, src, post_processing);
3018+ COPY_FIELD(dest, src, picture_resolution_index);
3019+ COPY_FIELD(dest, src, luma_scale);
3020+ COPY_FIELD(dest, src, luma_shift);
3021+ dest->BFV(picture_fields, value) = 0; /* reset all bits */
3022+ COPY_BIT_FIELD(dest, src, picture_fields, picture_type);
3023+ COPY_BIT_FIELD(dest, src, picture_fields, frame_coding_mode);
3024+ COPY_BIT_FIELD(dest, src, picture_fields, top_field_first);
3025+ COPY_BIT_FIELD(dest, src, picture_fields, is_first_field);
3026+ COPY_BIT_FIELD(dest, src, picture_fields, intensity_compensation);
3027+ dest->BFV(M_raw_coding, value) = 0; /* reset all bits */
3028+ COPY_BIT_FLAG(dest, src, raw_coding, mv_type_mb);
3029+ COPY_BIT_FLAG(dest, src, raw_coding, direct_mb);
3030+ COPY_BIT_FLAG(dest, src, raw_coding, skip_mb);
3031+ COPY_BIT_FLAG(dest, src, raw_coding, field_tx);
3032+ COPY_BIT_FLAG(dest, src, raw_coding, forward_mb);
3033+ COPY_BIT_FLAG(dest, src, raw_coding, ac_pred);
3034+ COPY_BIT_FLAG(dest, src, raw_coding, overflags);
3035+ dest->BFV(M_bitplane_present, value) = 0; /* reset all bits */
3036+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_mv_type_mb);
3037+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_direct_mb);
3038+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_skip_mb);
3039+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_field_tx);
3040+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_forward_mb);
3041+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_ac_pred);
3042+ COPY_BIT_FLAG(dest, src, bitplane_present, bp_overflags);
3043+ dest->BFV(reference_fields, value) = 0; /* reset all bits */
3044+ COPY_BIT_FIELD(dest, src, reference_fields, reference_distance_flag);
3045+ COPY_BIT_FIELD(dest, src, reference_fields, reference_distance);
3046+ COPY_BIT_FIELD(dest, src, reference_fields, num_reference_pictures);
3047+ COPY_BIT_FIELD(dest, src, reference_fields, reference_field_pic_indicator);
3048+ dest->BFV(mv_fields, value) = 0; /* reset all bits */
3049+ COPY_BIT_FIELD(dest, src, mv_fields, mv_mode);
3050+ COPY_BIT_FIELD(dest, src, mv_fields, mv_mode2);
3051+ COPY_BIT_FIELD(dest, src, mv_fields, mv_table);
3052+ COPY_BIT_FIELD(dest, src, mv_fields, two_mv_block_pattern_table);
3053+ COPY_BIT_FIELD(dest, src, mv_fields, four_mv_switch);
3054+ COPY_BIT_FIELD(dest, src, mv_fields, four_mv_block_pattern_table);
3055+ COPY_BIT_FIELD(dest, src, mv_fields, extended_mv_flag);
3056+ COPY_BIT_FIELD(dest, src, mv_fields, extended_mv_range);
3057+ COPY_BIT_FIELD(dest, src, mv_fields, extended_dmv_flag);
3058+ COPY_BIT_FIELD(dest, src, mv_fields, extended_dmv_range);
3059+ dest->BFV(pic_quantizer_fields, value) = 0; /* reset all bits */
3060+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dquant);
3061+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, quantizer);
3062+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, half_qp);
3063+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, pic_quantizer_scale);
3064+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, pic_quantizer_type);
3065+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_frame);
3066+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_profile);
3067+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_sb_edge);
3068+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_db_edge);
3069+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, dq_binary_level);
3070+ COPY_BIT_FIELD(dest, src, pic_quantizer_fields, alt_pic_quantizer);
3071+ dest->BFV(transform_fields, value) = 0; /* reset all bits */
3072+ COPY_BIT_FIELD(dest, src, transform_fields, variable_sized_transform_flag);
3073+ COPY_BIT_FIELD(dest, src, transform_fields, mb_level_transform_type_flag);
3074+ COPY_BIT_FIELD(dest, src, transform_fields, frame_level_transform_type);
3075+ COPY_BIT_FIELD(dest, src, transform_fields, transform_ac_codingset_idx1);
3076+ COPY_BIT_FIELD(dest, src, transform_fields, transform_ac_codingset_idx2);
3077+ COPY_BIT_FIELD(dest, src, transform_fields, intra_transform_dc_table);
3078+
3079+ if (src->picture_fields.bits.picture_type == 4) {
3080+ dest->BFM(picture_fields, bits, picture_type) = 1; /* P-frame */
3081+ ctx->skip_frame = 1;
3082+ }
3083+
3084+ return VA_STATUS_SUCCESS;
3085+}
3086+
3087+static VAStatus TRANSLATE(PictureParameter,MPEG2)(
3088+ VACompatContextP ctx,
3089+ void *dest_buffer,
3090+ const void *src_buffer
3091+)
3092+{
3093+ STRUCT(PictureParameter,MPEG2) *dest = dest_buffer;
3094+ const VAPictureParameterBufferMPEG2 *src = src_buffer;
3095+
3096+ COPY_FIELD(dest, src, horizontal_size);
3097+ COPY_FIELD(dest, src, vertical_size);
3098+ COPY_FIELD(dest, src, forward_reference_picture);
3099+ COPY_FIELD(dest, src, backward_reference_picture);
3100+ COPY_FIELD(dest, src, picture_coding_type);
3101+ COPY_FIELD(dest, src, f_code);
3102+ dest->BFV(picture_coding_extension, value) = 0; /* reset all bits */
3103+ COPY_BIT_FIELD(dest, src, picture_coding_extension, intra_dc_precision);
3104+ COPY_BIT_FIELD(dest, src, picture_coding_extension, picture_structure);
3105+ COPY_BIT_FIELD(dest, src, picture_coding_extension, top_field_first);
3106+ COPY_BIT_FIELD(dest, src, picture_coding_extension, frame_pred_frame_dct);
3107+ COPY_BIT_FIELD(dest, src, picture_coding_extension, concealment_motion_vectors);
3108+ COPY_BIT_FIELD(dest, src, picture_coding_extension, q_scale_type);
3109+ COPY_BIT_FIELD(dest, src, picture_coding_extension, intra_vlc_format);
3110+ COPY_BIT_FIELD(dest, src, picture_coding_extension, alternate_scan);
3111+ COPY_BIT_FIELD(dest, src, picture_coding_extension, repeat_first_field);
3112+ COPY_BIT_FIELD(dest, src, picture_coding_extension, progressive_frame);
3113+ COPY_BIT_FIELD(dest, src, picture_coding_extension, is_first_field);
3114+
3115+ return VA_STATUS_SUCCESS;
3116+}
3117+
3118+static VAStatus TRANSLATE(SliceParameter,MPEG2)(
3119+ VACompatContextP ctx,
3120+ void *dest_buffer,
3121+ const void *src_buffer
3122+)
3123+{
3124+ STRUCT(SliceParameter,MPEG2) *dest = dest_buffer;
3125+ const VASliceParameterBufferMPEG2 *src = src_buffer;
3126+
3127+ COPY_FIELD(dest, src, slice_data_size);
3128+ COPY_FIELD(dest, src, slice_data_offset);
3129+ COPY_FIELD(dest, src, slice_data_flag);
3130+ COPY_FIELD(dest, src, macroblock_offset);
3131+ COPY_FIELD(dest, src, slice_vertical_position);
3132+ COPY_FIELD(dest, src, quantiser_scale_code);
3133+ COPY_FIELD(dest, src, intra_slice_flag);
3134+
3135+ return VA_STATUS_SUCCESS;
3136+}
3137+#endif
3138+
3139+static VAStatus TRANSLATE(PictureParameter,MPEG4)(
3140+ VACompatContextP ctx,
3141+ void *dest_buffer,
3142+ const void *src_buffer
3143+)
3144+{
3145+ STRUCT(PictureParameter,MPEG4) *dest = dest_buffer;
3146+ const VAPictureParameterBufferMPEG4 *src = src_buffer;
3147+
3148+ COPY_FIELD(dest, src, vop_width);
3149+ COPY_FIELD(dest, src, vop_height);
3150+ COPY_FIELD(dest, src, forward_reference_picture);
3151+ COPY_FIELD(dest, src, backward_reference_picture);
3152+ dest->BFV(vol_fields, value) = 0; /* reset all bits */
3153+ COPY_BIT_FIELD(dest, src, vol_fields, short_video_header);
3154+ COPY_BIT_FIELD(dest, src, vol_fields, chroma_format);
3155+ COPY_BIT_FIELD(dest, src, vol_fields, interlaced);
3156+ COPY_BIT_FIELD(dest, src, vol_fields, obmc_disable);
3157+ COPY_BIT_FIELD(dest, src, vol_fields, sprite_enable);
3158+ COPY_BIT_FIELD(dest, src, vol_fields, sprite_warping_accuracy);
3159+ COPY_BIT_FIELD(dest, src, vol_fields, quant_type);
3160+ COPY_BIT_FIELD(dest, src, vol_fields, quarter_sample);
3161+ COPY_BIT_FIELD(dest, src, vol_fields, data_partitioned);
3162+ COPY_BIT_FIELD(dest, src, vol_fields, reversible_vlc);
3163+ COPY_FIELD(dest, src, no_of_sprite_warping_points);
3164+ COPY_ARRAY(dest, src, sprite_trajectory_du);
3165+ COPY_ARRAY(dest, src, sprite_trajectory_dv);
3166+ COPY_FIELD(dest, src, quant_precision);
3167+ dest->BFV(vop_fields, value) = 0; /* reset all bits */
3168+ COPY_BIT_FIELD(dest, src, vop_fields, vop_coding_type);
3169+ COPY_BIT_FIELD(dest, src, vop_fields, backward_reference_vop_coding_type);
3170+ COPY_BIT_FIELD(dest, src, vop_fields, vop_rounding_type);
3171+ COPY_BIT_FIELD(dest, src, vop_fields, intra_dc_vlc_thr);
3172+ COPY_BIT_FIELD(dest, src, vop_fields, top_field_first);
3173+ COPY_BIT_FIELD(dest, src, vop_fields, alternate_vertical_scan_flag);
3174+ COPY_FIELD(dest, src, vop_fcode_forward);
3175+ COPY_FIELD(dest, src, vop_fcode_backward);
3176+ COPY_FIELD(dest, src, num_gobs_in_vop);
3177+ COPY_FIELD(dest, src, num_macroblocks_in_gob);
3178+ COPY_FIELD(dest, src, TRB);
3179+ COPY_FIELD(dest, src, TRD);
3180+
3181+ return VA_STATUS_SUCCESS;
3182+}
3183+
3184+#if COMPAT_MAJOR == 0 && COMPAT_MINOR == 30
3185+static VAStatus TRANSLATE_(VAEncSliceParameterBuffer)(
3186+ VACompatContextP ctx,
3187+ void *dest_buffer,
3188+ const void *src_buffer
3189+)
3190+{
3191+ MKCOMPAT(VAEncSliceParameterBuffer) * const dest = dest_buffer;
3192+ const VAEncSliceParameterBuffer * const src = src_buffer;
3193+
3194+ COPY_FIELD(dest, src, start_row_number);
3195+ COPY_FIELD(dest, src, slice_height);
3196+ dest->BFV(slice_flags, value) = 0; /* reset all bits */
3197+ COPY_BIT_FIELD(dest, src, slice_flags, is_intra);
3198+ COPY_BIT_FIELD(dest, src, slice_flags, disable_deblocking_filter_idc);
3199+
3200+ return VA_STATUS_SUCCESS;
3201+}
3202+#endif
3203+
3204+static void TRANSLATE_(VADriverContext)(
3205+ VACompatContext *dest,
3206+ const struct MKCOMPAT(VADriverContext) *src
3207+)
3208+{
3209+ VACompatDriverVTable *dest_vtable = &dest->vtable;
3210+ const struct MKCOMPAT(VADriverVTable) *src_vtable = &src->vtable;
3211+
3212+ memset(dest_vtable, 0, sizeof(*dest_vtable));
3213+ COPY_VTABLE(dest, src, vaTerminate);
3214+ COPY_VTABLE(dest, src, vaQueryConfigProfiles);
3215+ COPY_VTABLE(dest, src, vaQueryConfigEntrypoints);
3216+ COPY_VTABLE(dest, src, vaGetConfigAttributes);
3217+ COPY_VTABLE(dest, src, vaCreateConfig);
3218+ COPY_VTABLE(dest, src, vaDestroyConfig);
3219+ COPY_VTABLE(dest, src, vaQueryConfigAttributes);
3220+ COPY_VTABLE(dest, src, vaCreateSurfaces);
3221+ COPY_VTABLE(dest, src, vaDestroySurfaces);
3222+ COPY_VTABLE(dest, src, vaCreateContext);
3223+ COPY_VTABLE(dest, src, vaDestroyContext);
3224+ COPY_VTABLE(dest, src, vaCreateBuffer);
3225+ COPY_VTABLE(dest, src, vaBufferSetNumElements);
3226+ COPY_VTABLE(dest, src, vaMapBuffer);
3227+ COPY_VTABLE(dest, src, vaUnmapBuffer);
3228+ COPY_VTABLE(dest, src, vaDestroyBuffer);
3229+ COPY_VTABLE(dest, src, vaBeginPicture);
3230+ COPY_VTABLE(dest, src, vaRenderPicture);
3231+ COPY_VTABLE(dest, src, vaEndPicture);
3232+ COPY_VTABLE(dest, src, vaQuerySurfaceStatus);
3233+ COPY_VTABLE(dest, src, vaPutSurface);
3234+ COPY_VTABLE(dest, src, vaQueryImageFormats);
3235+ COPY_VTABLE(dest, src, vaCreateImage);
3236+ COPY_VTABLE(dest, src, vaDeriveImage);
3237+ COPY_VTABLE(dest, src, vaDestroyImage);
3238+ COPY_VTABLE(dest, src, vaSetImagePalette);
3239+ COPY_VTABLE(dest, src, vaGetImage);
3240+ COPY_VTABLE(dest, src, vaQuerySubpictureFormats);
3241+ COPY_VTABLE(dest, src, vaCreateSubpicture);
3242+ COPY_VTABLE(dest, src, vaDestroySubpicture);
3243+ COPY_VTABLE(dest, src, vaSetSubpictureImage);
3244+ COPY_VTABLE(dest, src, vaSetSubpictureChromakey);
3245+ COPY_VTABLE(dest, src, vaSetSubpictureGlobalAlpha);
3246+ COPY_VTABLE(dest, src, vaDeassociateSubpicture);
3247+ COPY_VTABLE(dest, src, vaQueryDisplayAttributes);
3248+ COPY_VTABLE(dest, src, vaGetDisplayAttributes);
3249+ COPY_VTABLE(dest, src, vaSetDisplayAttributes);
3250+#if COMPAT_MAJOR == 0 && COMPAT_MINOR <= 29
3251+ COPY_VTABLE(dest, src, vaSetSubpicturePalette);
3252+ COPY_VTABLE(dest, src, vaDbgCopySurfaceToBuffer);
3253+#endif
3254+#if COMPAT_MAJOR == 0 && COMPAT_MINOR >= 30
3255+ COPY_VTABLE(dest, src, vaCreateSurfaceFromCIFrame);
3256+ COPY_VTABLE(dest, src, vaCreateSurfaceFromV4L2Buf);
3257+ COPY_VTABLE(dest, src, vaCopySurfaceToBuffer);
3258+#endif
3259+#if COMPAT_MAJOR == 0 && COMPAT_MINOR >= 31
3260+ COPY_VTABLE(dest, src, vaSyncSurface);
3261+ COPY_VTABLE(dest, src, vaPutImage);
3262+ COPY_VTABLE(dest, src, vaAssociateSubpicture);
3263+#else
3264+ COPY_VTABLE_(dest, pre31, src, vaSyncSurface);
3265+ COPY_VTABLE_(dest, pre31, src, vaPutImage);
3266+ COPY_VTABLE_(dest, pre31, src, vaPutImage2);
3267+ COPY_VTABLE_(dest, pre31, src, vaAssociateSubpicture);
3268+ COPY_VTABLE_(dest, pre31, src, vaAssociateSubpicture2);
3269+#endif
3270+}
3271+
3272+#undef COMPAT_MAJOR
3273+#undef COMPAT_MINOR
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/392_compat.dso.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/392_compat.dso.patch
deleted file mode 100644
index 57ae44f9..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/392_compat.dso.patch
+++ /dev/null
@@ -1,183 +0,0 @@
1commit 389323f728fb2d6392d266d967eddde40465fd93
2Author: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3Date: Fri Oct 16 12:35:27 2009 +0000
4
5 Fix compatibility with older programs linked against libva.so.0.
6
7diff --git a/src/Makefile.am b/src/Makefile.am
8index 232d8e8..2d696f1 100644
9--- a/src/Makefile.am
10+++ b/src/Makefile.am
11@@ -72,3 +72,8 @@ EXTRA_DIST = \
12 va_compat_template.h
13
14 va_compat.c: va_compat_template.h
15+
16+lib_LTLIBRARIES += libva-compat.la
17+libva_compat_la_SOURCES = va_compat_lib.c
18+libva_compat_la_LIBADD = libva-x11.la -ldl
19+libva_compat_la_DEPENDENCIES = libva-x11.la
20diff --git a/src/va_compat_lib.c b/src/va_compat_lib.c
21new file mode 100644
22index 0000000..b7e9ea5
23--- /dev/null
24+++ b/src/va_compat_lib.c
25@@ -0,0 +1,158 @@
26+/*
27+ * Copyright (C) 2009 Splitted-Desktop Systems. All Rights Reserved.
28+ *
29+ * Permission is hereby granted, free of charge, to any person obtaining a
30+ * copy of this software and associated documentation files (the
31+ * "Software"), to deal in the Software without restriction, including
32+ * without limitation the rights to use, copy, modify, merge, publish,
33+ * distribute, sub license, and/or sell copies of the Software, and to
34+ * permit persons to whom the Software is furnished to do so, subject to
35+ * the following conditions:
36+ *
37+ * The above copyright notice and this permission notice (including the
38+ * next paragraph) shall be included in all copies or substantial portions
39+ * of the Software.
40+ *
41+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
42+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
43+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
44+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
45+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
46+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
47+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
48+ */
49+
50+#define _GNU_SOURCE 1
51+#include <dlfcn.h>
52+#include <assert.h>
53+#include <stddef.h>
54+
55+typedef void *VADisplay;
56+typedef int VAStatus;
57+typedef unsigned int VAGenericID;
58+typedef VAGenericID VAContextID;
59+typedef VAGenericID VASurfaceID;
60+typedef VAGenericID VAImageID;
61+typedef VAGenericID VASubpictureID;
62+
63+#define PREPARE_FUNC(NAME, RET, ARGS) \
64+ static RET (*lib_##NAME) ARGS; \
65+ if (lib_##NAME == NULL) \
66+ lib_##NAME = dlsym(RTLD_NEXT, #NAME); \
67+ assert(lib_##NAME != NULL)
68+
69+VAStatus
70+vaSyncSurface(
71+ VADisplay dpy,
72+ VAContextID context,
73+ VASurfaceID render_target
74+)
75+{
76+ PREPARE_FUNC(vaSyncSurface, VAStatus, (VADisplay, VASurfaceID));
77+
78+ return lib_vaSyncSurface(dpy, render_target);
79+}
80+
81+VAStatus
82+vaPutImage(
83+ VADisplay dpy,
84+ VASurfaceID surface,
85+ VAImageID image,
86+ int src_x,
87+ int src_y,
88+ unsigned int width,
89+ unsigned int height,
90+ int dest_x,
91+ int dest_y
92+)
93+{
94+ PREPARE_FUNC(vaPutImage, VAStatus, (VADisplay, VASurfaceID, VAImageID,
95+ int, int, unsigned int, unsigned int,
96+ int, int, unsigned int, unsigned int));
97+
98+ return lib_vaPutImage(dpy, surface, image,
99+ src_x, src_y, width, height,
100+ dest_x, dest_y, width, height);
101+}
102+
103+VAStatus
104+vaPutImage2(
105+ VADisplay dpy,
106+ VASurfaceID surface,
107+ VAImageID image,
108+ int src_x,
109+ int src_y,
110+ unsigned int src_width,
111+ unsigned int src_height,
112+ int dest_x,
113+ int dest_y,
114+ unsigned int dest_width,
115+ unsigned int dest_height
116+)
117+{
118+ PREPARE_FUNC(vaPutImage, VAStatus, (VADisplay, VASurfaceID, VAImageID,
119+ int, int, unsigned int, unsigned int,
120+ int, int, unsigned int, unsigned int));
121+
122+ return lib_vaPutImage(dpy, surface, image,
123+ src_x, src_y, src_width, src_height,
124+ dest_x, dest_y, dest_width, dest_height);
125+}
126+
127+VAStatus
128+vaAssociateSubpicture(
129+ VADisplay dpy,
130+ VASubpictureID subpicture,
131+ VASurfaceID *target_surfaces,
132+ int num_surfaces,
133+ short src_x,
134+ short src_y,
135+ short dest_x,
136+ short dest_y,
137+ unsigned short width,
138+ unsigned short height,
139+ unsigned int flags
140+)
141+{
142+ PREPARE_FUNC(vaAssociateSubpicture,
143+ VAStatus, (VADisplay, VASubpictureID, VASurfaceID *, int,
144+ short, short, unsigned short, unsigned short,
145+ short, short, unsigned short, unsigned short,
146+ unsigned int));
147+
148+ return lib_vaAssociateSubpicture(dpy, subpicture,
149+ target_surfaces, num_surfaces,
150+ src_x, src_y, width, height,
151+ dest_x, dest_y, width, height,
152+ flags);
153+}
154+
155+VAStatus
156+vaAssociateSubpicture2(
157+ VADisplay dpy,
158+ VASubpictureID subpicture,
159+ VASurfaceID *target_surfaces,
160+ int num_surfaces,
161+ short src_x,
162+ short src_y,
163+ unsigned short src_width,
164+ unsigned short src_height,
165+ short dest_x,
166+ short dest_y,
167+ unsigned short dest_width,
168+ unsigned short dest_height,
169+ unsigned int flags
170+)
171+{
172+ PREPARE_FUNC(vaAssociateSubpicture,
173+ VAStatus, (VADisplay, VASubpictureID, VASurfaceID *, int,
174+ short, short, unsigned short, unsigned short,
175+ short, short, unsigned short, unsigned short,
176+ unsigned int));
177+
178+ return lib_vaAssociateSubpicture(dpy, subpicture,
179+ target_surfaces, num_surfaces,
180+ src_x, src_y, src_width, src_height,
181+ dest_x, dest_y, dest_width, dest_height,
182+ flags);
183+}
diff --git a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/libdrm-poulsbo.patch b/meta-emenlow/recipes-graphics/libva/libva-0.31.0/libdrm-poulsbo.patch
deleted file mode 100644
index ac38eceb..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva-0.31.0/libdrm-poulsbo.patch
+++ /dev/null
@@ -1,26 +0,0 @@
1# Make the libva depend on libdrm-poulsbo instead of libdrm so that the
2# emenlow libdrm can coexist with the normal libdrm.
3# jdike@linux.intel.com
4
5Index: libva-0.31.0/configure.ac
6===================================================================
7--- libva-0.31.0.orig/configure.ac
8+++ libva-0.31.0/configure.ac
9@@ -99,14 +99,14 @@ AC_SYS_LARGEFILE
10 PKG_CHECK_MODULES([X11], [x11])
11 PKG_CHECK_MODULES([XEXT],[xext])
12 PKG_CHECK_MODULES([XFIXES], [xfixes])
13-PKG_CHECK_MODULES([DRM], [libdrm])
14+PKG_CHECK_MODULES([DRM], [libdrm_poulsbo])
15
16 PKG_CHECK_MODULES(GEN4ASM, [intel-gen4asm >= 1.0], [gen4asm=yes], [gen4asm=no])
17 AM_CONDITIONAL(HAVE_GEN4ASM, test x$gen4asm = xyes)
18
19 # Check for libdrm >= 2.4 (needed for i965_drv_video.so)
20-if test x$enable_i965_driver = xyes && ! $PKG_CONFIG --atleast-version=2.4 libdrm; then
21- AC_MSG_WARN([libdrm < 2.4 found, disabling build of i965 video driver])
22+if test x$enable_i965_driver = xyes && ! $PKG_CONFIG --atleast-version=2.4 libdrm_poulsbo; then
23+ AC_MSG_WARN([libdrm_poulsbo < 2.4 found, disabling build of i965 video driver])
24 enable_i965_driver=no
25 fi
26 AM_CONDITIONAL(BUILD_I965_DRIVER, test x$enable_i965_driver = xyes)
diff --git a/meta-emenlow/recipes-graphics/libva/libva_0.31.0.bb b/meta-emenlow/recipes-graphics/libva/libva_0.31.0.bb
deleted file mode 100644
index cfdc71e6..00000000
--- a/meta-emenlow/recipes-graphics/libva/libva_0.31.0.bb
+++ /dev/null
@@ -1,43 +0,0 @@
1DESCRIPTION = "Video Acceleration (VA) API for Linux"
2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://COPYING;md5=efc13a0998e678466e556756613c582e"
4PR = "r1"
5DEPENDS = "libxfixes libxext"
6
7inherit autotools
8
9SRC_URI = "https://launchpad.net/~gma500/+archive/ppa/+files/libva_0.31.0-1+sds9.1ubuntu1.tar.gz \
10 file://033_g45_add_rgba_subpic.patch \
11 file://034_g45_fix_return_for_unimpl.patch \
12 file://035_g45_add_yv12_image_format.patch \
13 file://036_g45_add_vaGetImage.patch \
14 file://037_g45_add_vaPutImage.patch \
15 file://038_g45_vaPutSurface_cliprects.patch \
16 file://102_attribute_visibility.patch \
17 file://103_fix_vainfo_deps.patch \
18 file://104_fix_libva_pkgconfig_deps.patch \
19 file://105_dont_search_LIBGL_DRIVERS_PATH.patch \
20 file://108_drivers_path.patch \
21 file://203_fix_fglrx_detection.patch \
22 file://204_check_ATIFGLEXTENSION.patch \
23 file://300_sds_version.patch \
24 file://301_vdpau_mpeg4.patch \
25 file://320_move_vaPutSurface_flags_def.patch \
26 file://321_libva_glx.base.patch \
27 file://322_libva_glx.patch \
28 file://390_compat.base.patch \
29 file://391_compat.patch \
30 file://392_compat.dso.patch \
31 file://libdrm-poulsbo.patch"
32
33SRC_URI[md5sum] = "860f13e5a9d09511d7c6807b880e758b"
34SRC_URI[sha256sum] = "306468f87b9e13fdb3b6f0c6e2159b20198b33eed9eda4c31d7381a88911554f"
35
36export LDFLAGS="-Wl,-z,defs"
37
38EXTRA_OECONF = "--disable-i965-driver"
39
40FILES_${PN} += "${libdir}/va/drivers/*"
41
42COMPATIBLE_MACHINE = "emenlow"
43PACKAGE_ARCH = "${MACHINE_ARCH}"