userland: Implement dispmanx_wrap_buffer

Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Khem Raj 2016-03-26 16:59:37 +00:00 committed by Andrei Gherzan
parent d28692dc9e
commit e82417d33b
2 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,80 @@
implement buffer wrapping interface for dispmanx
Courtesy: Zan Dobersek
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>

View File

@ -34,6 +34,7 @@ SRC_URI = "\
file://0012-Fix-enum-conversion-warnings.patch \
file://0013-Fix-for-framerate-with-nested-composition.patch \
file://0014-Fix-errors-due-to-ignored-return-code.patch \
file://0015-wl-dispmanx-buffer-wrapping.patch \
"
S = "${WORKDIR}/git"