aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-graphics/userland/files/0012-implement-buffer-wrapping-interface-for-dispmanx.patch
blob: 40666fde97ee5bed34d7285948d2d743ee9963dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
From 27194bc05a7a488827590208285a8757164edcef Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Sat, 2 Apr 2016 10:54:59 -0700
Subject: [PATCH 12/18] implement buffer wrapping interface for dispmanx

Courtesy: Zan Dobersek

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 interface/khronos/ext/egl_wayland.c | 42 +++++++++++++++++++++++++++++
 interface/wayland/dispmanx.xml      | 10 +++++++
 2 files changed, 52 insertions(+)

diff --git a/interface/khronos/ext/egl_wayland.c b/interface/khronos/ext/egl_wayland.c
index 5730743..9ef89cd 100644
--- a/interface/khronos/ext/egl_wayland.c
+++ b/interface/khronos/ext/egl_wayland.c
@@ -133,8 +133,50 @@ dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource,
                                      buffer->handle);
 }
 
+static void
+dispmanx_wrap_buffer(struct wl_client *client, struct wl_resource *resource,
+                     uint32_t id, uint32_t handle, int32_t width, int32_t height,
+                     uint32_t stride, uint32_t buffer_height, uint32_t format)
+{
+   struct wl_dispmanx_server_buffer *buffer;
+   VC_IMAGE_TYPE_T vc_format = get_vc_format(format);
+   uint32_t dummy;
+
+   if(vc_format == VC_IMAGE_MIN) {
+      wl_resource_post_error(resource,
+                             WL_DISPMANX_ERROR_INVALID_FORMAT,
+                             "invalid format");
+      return;
+   }
+
+   buffer = calloc(1, sizeof *buffer);
+   if (buffer == NULL) {
+      wl_resource_post_no_memory(resource);
+      return;
+   }
+
+   buffer->handle = handle;
+   buffer->width = width;
+   buffer->height = height;
+   buffer->format = format;
+
+   buffer->resource = wl_resource_create(resource->client, &wl_buffer_interface,
+                                         1, id);
+   if (!buffer->resource) {
+      wl_resource_post_no_memory(resource);
+      vc_dispmanx_resource_delete(buffer->handle);
+      free(buffer);
+      return;
+   }
+
+   wl_resource_set_implementation(buffer->resource,
+				       (void (**)(void)) &dispmanx_buffer_interface,
+				       buffer, destroy_buffer);
+}
+
 static const struct wl_dispmanx_interface dispmanx_interface = {
    dispmanx_create_buffer,
+   dispmanx_wrap_buffer,
 };
 
 static void
diff --git a/interface/wayland/dispmanx.xml b/interface/wayland/dispmanx.xml
index c18626d..11ed1ef 100644
--- a/interface/wayland/dispmanx.xml
+++ b/interface/wayland/dispmanx.xml
@@ -118,6 +118,16 @@
       <arg name="buffer" type="object" interface="wl_buffer"/>
       <arg name="handle" type="uint"/>
     </event>
+
+    <request name="wrap_buffer">
+      <arg name="id" type="new_id" interface="wl_buffer"/>
+      <arg name="handle" type="uint"/>
+      <arg name="width" type="int"/>
+      <arg name="height" type="int"/>
+      <arg name="stride" type="uint"/>
+      <arg name="buffer_height" type="uint"/>
+      <arg name="format" type="uint"/>
+    </request>
   </interface>
 
 </protocol>
-- 
2.20.1