summaryrefslogtreecommitdiffstats
path: root/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch
diff options
context:
space:
mode:
Diffstat (limited to 'import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch')
-rw-r--r--import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch1861
1 files changed, 0 insertions, 1861 deletions
diff --git a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch b/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch
deleted file mode 100644
index 461350407..000000000
--- a/import-layers/meta-raspberrypi/recipes-graphics/userland/userland/0002-wayland-Add-support-for-the-Wayland-winsys.patch
+++ /dev/null
@@ -1,1861 +0,0 @@
-From 5608ec8002be8370e78c9dbb1e07cee4cfb18b58 Mon Sep 17 00:00:00 2001
-From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
-Date: Tue, 1 Oct 2013 13:19:20 +0200
-Subject: [PATCH 02/16] wayland: Add support for the Wayland winsys
-
-* Adds EGL_WL_bind_wayland_display extension
-* Adds wayland-egl library
-* Adds wl_dispmanx_buffer protocol extension
-
-TODO: Check that platform_get_dimensions() returning swapchain_count == 1 is correct
-
-TODO: Remove the requirement of passing a valid DispmanX element handle to
-the SwapBuffers and CreateSurface RPC calls. This will remove the need to open
-a DispmanX display from the clients.
-
-TODO: wl_dispmanx_server_buffer should probably be defined in a
-private header that can be included from EGL and vc_* instead of in
-vc_vchi_dispmanx.h
----
- .gitignore | 1 +
- CMakeLists.txt | 11 +
- README.md | 4 +
- buildme | 10 +-
- .../linux/apps/raspicam/CMakeLists.txt | 2 +-
- interface/khronos/CMakeLists.txt | 53 ++++-
- interface/khronos/common/khrn_client.c | 15 ++
- interface/khronos/common/khrn_client.h | 10 +
- interface/khronos/common/khrn_client_mangle.h | 3 +
- interface/khronos/common/khrn_client_platform.h | 8 +
- interface/khronos/common/khrn_client_unmangle.h | 3 +
- .../common/linux/khrn_client_platform_linux.c | 115 ++++++++--
- interface/khronos/common/linux/khrn_wayland.c | 215 ++++++++++++++++++
- .../common/linux/khrn_wayland.h} | 46 +---
- interface/khronos/egl/egl_client.c | 92 +++++---
- interface/khronos/egl/egl_client_get_proc.c | 11 +
- interface/khronos/egl/egl_client_surface.c | 42 +++-
- interface/khronos/egl/egl_client_surface.h | 38 +++-
- interface/khronos/egl/egl_int_impl.h | 2 +-
- interface/khronos/ext/egl_wayland.c | 246 +++++++++++++++++++++
- interface/khronos/include/EGL/eglext.h | 23 ++
- interface/khronos/wayland-egl/wayland-egl-priv.h | 53 +++++
- interface/khronos/wayland-egl/wayland-egl.c | 59 +++++
- interface/khronos/wayland-egl/wayland-egl.pc.in | 10 +
- interface/vmcs_host/CMakeLists.txt | 21 +-
- interface/vmcs_host/vc_dispmanx.h | 10 +
- interface/vmcs_host/vc_vchi_dispmanx.c | 42 ++++
- interface/vmcs_host/vc_vchi_dispmanx.h | 15 ++
- interface/wayland/dispmanx.xml | 123 +++++++++++
- makefiles/cmake/Wayland.cmake | 72 ++++++
- 30 files changed, 1257 insertions(+), 98 deletions(-)
- create mode 100644 interface/khronos/common/linux/khrn_wayland.c
- copy interface/{vmcs_host/vc_vchi_dispmanx.h => khronos/common/linux/khrn_wayland.h} (56%)
- create mode 100644 interface/khronos/ext/egl_wayland.c
- create mode 100644 interface/khronos/wayland-egl/wayland-egl-priv.h
- create mode 100644 interface/khronos/wayland-egl/wayland-egl.c
- create mode 100644 interface/khronos/wayland-egl/wayland-egl.pc.in
- create mode 100644 interface/wayland/dispmanx.xml
- create mode 100644 makefiles/cmake/Wayland.cmake
-
-Index: git/.gitignore
-===================================================================
---- git.orig/.gitignore
-+++ git/.gitignore
-@@ -30,3 +30,4 @@ build/
- *.pts
- *.ppm
- *.mkv
-+*~
-Index: git/CMakeLists.txt
-===================================================================
---- git.orig/CMakeLists.txt
-+++ git/CMakeLists.txt
-@@ -24,6 +24,17 @@ include(makefiles/cmake/global_settings.
- include(makefiles/cmake/arm-linux.cmake)
- include(makefiles/cmake/vmcs.cmake)
-
-+if (BUILD_WAYLAND)
-+ include(makefiles/cmake/Wayland.cmake)
-+
-+ # Find Wayland libraries
-+ find_package(PkgConfig)
-+ pkg_check_modules(WAYLAND_CLIENT wayland-client REQUIRED)
-+ pkg_check_modules(WAYLAND_SERVER wayland-server REQUIRED)
-+
-+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_WAYLAND")
-+endif()
-+
- enable_language(ASM)
-
- # Global include paths
-Index: git/README.md
-===================================================================
---- git.orig/README.md
-+++ git/README.md
-@@ -6,3 +6,7 @@ Use buildme to build. It requires cmake
- https://github.com/raspberrypi/tools/tree/master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
-
- Note that this repository does not contain the source for the edid_parser and vcdbg binaries due to licensing restrictions.
-+
-+To build support for the Wayland winsys in EGL, execute the buildme script like this:
-+
-+$ BUILD_WAYLAND=1 ./buildme.
-Index: git/buildme
-===================================================================
---- git.orig/buildme
-+++ git/buildme
-@@ -8,6 +8,10 @@ fi
-
- BUILDSUBDIR=`echo $BUILDTYPE | tr '[A-Z]' '[a-z]'`;
-
-+if [ -n "$BUILD_WAYLAND" ]; then
-+ WAYLAND_VARS="-DBUILD_WAYLAND=TRUE"
-+fi
-+
- if [ "armv6l" = `arch` ] || [ "armv7l" = `arch` ]; then
- # Native compile on the Raspberry Pi
- mkdir -p build/raspberry/$BUILDSUBDIR
-@@ -32,9 +36,13 @@ elif [ "$1" = "--native" ]; then
- make -j `nproc` $*
- else
- # Cross compile on a more capable machine
-+ if [ -n "$BUILD_WAYLAND" ]; then
-+ # Use wayland-scanner from the build platform
-+ WAYLAND_VARS+=" -DWAYLAND_SCANNER_EXECUTABLE:FILEPATH=/usr/bin/wayland-scanner"
-+ fi
- mkdir -p build/arm-linux/$BUILDSUBDIR
- pushd build/arm-linux/$BUILDSUBDIR
-- cmake -DCMAKE_TOOLCHAIN_FILE=../../../makefiles/cmake/toolchains/arm-linux-gnueabihf.cmake -DCMAKE_BUILD_TYPE=$BUILDTYPE ../../..
-+ cmake -DCMAKE_TOOLCHAIN_FILE=../../../makefiles/cmake/toolchains/arm-linux-gnueabihf.cmake -DCMAKE_BUILD_TYPE=$BUILDTYPE $WAYLAND_VARS ../../..
- make -j `nproc`
-
- if [ "$1" != "" ]; then
-Index: git/host_applications/linux/apps/raspicam/CMakeLists.txt
-===================================================================
---- git.orig/host_applications/linux/apps/raspicam/CMakeLists.txt
-+++ git/host_applications/linux/apps/raspicam/CMakeLists.txt
-@@ -28,7 +28,7 @@ add_executable(raspividyuv ${COMMON_SOU
-
- set (MMAL_LIBS mmal_core mmal_util mmal_vc_client)
-
--target_link_libraries(raspistill ${MMAL_LIBS} vcos bcm_host brcmGLESv2 brcmEGL m)
-+target_link_libraries(raspistill ${MMAL_LIBS} vcos bcm_host brcmGLESv2 brcmEGL m ${WAYLAND_SERVER_LIBRARIES} ${WAYLAND_CLIENT_LIBRARIES})
- target_link_libraries(raspiyuv ${MMAL_LIBS} vcos bcm_host)
- target_link_libraries(raspivid ${MMAL_LIBS} vcos bcm_host)
- target_link_libraries(raspividyuv ${MMAL_LIBS} vcos bcm_host)
-Index: git/interface/khronos/CMakeLists.txt
-===================================================================
---- git.orig/interface/khronos/CMakeLists.txt
-+++ git/interface/khronos/CMakeLists.txt
-@@ -6,6 +6,12 @@
- # have quite a few circular dependencies, and so the only way
- # to make it work seems to be to have everything static.
-
-+if (BUILD_WAYLAND)
-+include_directories(
-+ ${WAYLAND_SERVER_INCLUDE_DIRS}
-+)
-+endif ()
-+
- set(EGL_SOURCE
- egl/egl_client_config.c
- egl/egl_client_context.c
-@@ -55,12 +61,55 @@ set(CLIENT_SOURCE
- common/khrn_int_hash_asm.s
- common/khrn_client_cache.c)
-
-+set(EGL_LIBS
-+ khrn_client
-+ vchiq_arm
-+ vcos
-+ bcm_host)
-+
-+if (BUILD_WAYLAND)
-+ set(EGL_SOURCE
-+ ${EGL_SOURCE}
-+ ext/egl_wayland.c
-+ common/linux/khrn_wayland.c)
-+
-+ set(EGL_LIBS
-+ ${EGL_LIBS}
-+ wayland-client
-+ wayland-server)
-+
-+ set(WAYLAND_EGL_SOURCE
-+ wayland-egl/wayland-egl.c)
-+
-+ wayland_add_protocol_server(
-+ EGL_SOURCE
-+ ../../interface/wayland/dispmanx.xml
-+ dispmanx
-+ )
-+
-+ wayland_add_protocol_client(
-+ EGL_SOURCE
-+ ../../interface/wayland/dispmanx.xml
-+ dispmanx
-+ )
-+
-+ add_library(wayland-egl ${SHARED} ${WAYLAND_EGL_SOURCE})
-+ install(TARGETS wayland-egl DESTINATION lib)
-+
-+ configure_file ("wayland-egl/wayland-egl.pc.in" "wayland-egl/wayland-egl.pc" @ONLY)
-+ install (FILES "${CMAKE_CURRENT_BINARY_DIR}/wayland-egl/wayland-egl.pc"
-+ DESTINATION lib/pkgconfig)
-+endif ()
-+
- add_library(EGL ${SHARED} ${EGL_SOURCE})
- add_library(GLESv2 ${SHARED} ${GLES_SOURCE})
- add_library(OpenVG ${SHARED} ${VG_SOURCE})
- add_library(WFC ${SHARED} ${WFC_SOURCE})
- add_library(khrn_client ${CLIENT_SOURCE})
-
-+set_target_properties(EGL PROPERTIES SOVERSION 1 VERSION 1.0.0)
-+set_target_properties(GLESv2 PROPERTIES SOVERSION 2 VERSION 2.0.0)
-+
- # TODO do we need EGL_static and GLESv2_static now that khrn_static exists?
- add_library(EGL_static STATIC ${EGL_SOURCE})
- add_library(GLESv2_static STATIC ${GLES_SOURCE})
-@@ -72,8 +121,7 @@ include_directories (../../host_applicat
- set(VCSM_LIBS vcsm)
- add_definitions(-DKHRONOS_HAVE_VCSM)
- endif()
--
--target_link_libraries(EGL khrn_client vchiq_arm vcos bcm_host ${VCSM_LIBS} -lm)
-+target_link_libraries(EGL ${EGL_LIBS} ${VCSM_LIBS} -lm)
- target_link_libraries(GLESv2 EGL khrn_client vcos)
- target_link_libraries(WFC EGL)
- target_link_libraries(OpenVG EGL)
-@@ -87,7 +135,7 @@ add_library(brcmGLESv2 ${SHARED} ${GLES_
- add_library(brcmOpenVG ${SHARED} ${VG_SOURCE})
- add_library(brcmWFC ${SHARED} ${WFC_SOURCE})
-
--target_link_libraries(brcmEGL khrn_client vchiq_arm vcos bcm_host ${VCSM_LIBS} -lm)
-+target_link_libraries(brcmEGL ${EGL_LIBS} ${VCSM_LIBS} -lm)
- target_link_libraries(brcmGLESv2 brcmEGL khrn_client vcos)
- target_link_libraries(brcmWFC brcmEGL)
- target_link_libraries(brcmOpenVG brcmEGL)
-Index: git/interface/khronos/common/khrn_client.c
-===================================================================
---- git.orig/interface/khronos/common/khrn_client.c
-+++ git/interface/khronos/common/khrn_client.c
-@@ -54,6 +54,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #include "applications/vmcs/khronos/khronos_server.h"
- #endif
-
-+#ifdef BUILD_WAYLAND
-+#include "interface/khronos/common/linux/khrn_wayland.h"
-+#endif
-+
- VCOS_LOG_CAT_T khrn_client_log = VCOS_LOG_INIT("khrn_client", VCOS_LOG_WARN);
-
- /*
-@@ -142,6 +146,10 @@ void client_try_unload_server(CLIENT_PRO
- bool client_process_state_init(CLIENT_PROCESS_STATE_T *process)
- {
- if (!process->inited) {
-+#ifdef BUILD_WAYLAND
-+ process->wl_global = NULL;
-+#endif
-+
- if (!khrn_pointer_map_init(&process->contexts, 64))
- return false;
-
-@@ -194,6 +202,13 @@ bool client_process_state_init(CLIENT_PR
- }
- #endif
-
-+#ifdef BUILD_WAYLAND
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+ if (wl_display)
-+ if (!init_process_wayland(process))
-+ return false;
-+#endif
-+
- process->inited = true;
- }
-
-Index: git/interface/khronos/common/khrn_client.h
-===================================================================
---- git.orig/interface/khronos/common/khrn_client.h
-+++ git/interface/khronos/common/khrn_client.h
-@@ -310,6 +310,16 @@ struct CLIENT_PROCESS_STATE {
- #ifdef RPC_LIBRARY
- KHRONOS_SERVER_CONNECTION_T khrn_connection;
- #endif
-+
-+#ifdef BUILD_WAYLAND
-+ /* Client-side Wayland state */
-+ struct wl_registry *wl_registry;
-+ struct wl_dispmanx *wl_dispmanx;
-+ struct wl_event_queue *wl_queue;
-+
-+ /* Compositor-side Wayland state */
-+ struct wl_global *wl_global;
-+#endif
- };
-
- extern bool client_process_state_init(CLIENT_PROCESS_STATE_T *process);
-Index: git/interface/khronos/common/khrn_client_mangle.h
-===================================================================
---- git.orig/interface/khronos/common/khrn_client_mangle.h
-+++ git/interface/khronos/common/khrn_client_mangle.h
-@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #define eglReleaseGlobalImageBRCM mangled_eglReleaseGlobalImageBRCM
- #define eglInitGlobalImageBRCM mangled_eglInitGlobalImageBRCM
- #define eglTermGlobalImageBRCM mangled_eglTermGlobalImageBRCM
-+#define eglBindWaylandDisplayWL mangled_eglBindWaylandDisplayWL
-+#define eglUnbindWaylandDisplayWL mangled_eglUnbindWaylandDisplayWL
-+#define eglQueryWaylandBufferWL mangled_eglQueryWaylandBufferWL
-
- /* OpenGL ES 1.1 and 2.0 functions */
-
-Index: git/interface/khronos/common/khrn_client_platform.h
-===================================================================
---- git.orig/interface/khronos/common/khrn_client_platform.h
-+++ git/interface/khronos/common/khrn_client_platform.h
-@@ -48,6 +48,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #include "interface/khronos/common/vcos/khrn_client_platform_filler_vcos.h"
- #endif
-
-+#ifdef BUILD_WAYLAND
-+#include <wayland-client.h>
-+#endif
-+
- #ifdef __cplusplus
- extern "C" {
- #endif
-@@ -328,4 +332,8 @@ typedef struct
-
- void *platform_wfc_bounce_thread(void *param);
-
-+#ifdef BUILD_WAYLAND
-+struct wl_display *khrn_platform_get_wl_display();
-+#endif
-+
- #endif // KHRN_CLIENT_PLATFORM_H
-Index: git/interface/khronos/common/khrn_client_unmangle.h
-===================================================================
---- git.orig/interface/khronos/common/khrn_client_unmangle.h
-+++ git/interface/khronos/common/khrn_client_unmangle.h
-@@ -83,6 +83,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #undef eglReleaseGlobalImageBRCM
- #undef eglInitGlobalImageBRCM
- #undef eglTermGlobalImageBRCM
-+#undef eglBindWaylandDisplayWL
-+#undef eglUnbindWaylandDisplayWL
-+#undef eglQueryWaylandBufferWL
-
- /* OpenGL ES 1.1 and 2.0 functions */
-
-Index: git/interface/khronos/common/linux/khrn_client_platform_linux.c
-===================================================================
---- git.orig/interface/khronos/common/linux/khrn_client_platform_linux.c
-+++ git/interface/khronos/common/linux/khrn_client_platform_linux.c
-@@ -37,6 +37,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #include "X11/Xlib.h"
- #endif
-
-+#ifdef BUILD_WAYLAND
-+#include <wayland-client.h>
-+#include "interface/khronos/wayland-egl/wayland-egl-priv.h"
-+#endif
-+
- extern VCOS_LOG_CAT_T khrn_client_log;
-
- extern void vc_vchi_khronos_init();
-@@ -464,14 +469,37 @@ EGLDisplay khrn_platform_set_display_id(
- return EGL_NO_DISPLAY;
- }
- #else
-+
-+#ifdef BUILD_WAYLAND
-+static struct wl_display *hacky_display = NULL;
-+#endif
-+
- EGLDisplay khrn_platform_set_display_id(EGLNativeDisplayType display_id)
- {
- if (display_id == EGL_DEFAULT_DISPLAY)
- return (EGLDisplay)1;
-- else
-- return EGL_NO_DISPLAY;
-+ else {
-+#ifdef BUILD_WAYLAND
-+ void *first_pointer = *(void **) display_id;
-+
-+ /* wl_display is a wl_proxy, which is a wl_object.
-+ * wl_object's first element points to the interfacetype. */
-+ if (first_pointer == &wl_display_interface) {
-+ hacky_display = (struct wl_display*)display_id;
-+ return (EGLDisplay)1;
-+ } else
-+#endif
-+ return EGL_NO_DISPLAY;
-+ }
-+}
-+
-+#ifdef BUILD_WAYLAND
-+struct wl_display *khrn_platform_get_wl_display()
-+{
-+ return hacky_display;
- }
- #endif
-+#endif
-
- #ifdef WANT_X
- static void dump_hierarchy(Window w, Window thisw, Window look, int level)
-@@ -805,22 +833,81 @@ static EGL_DISPMANX_WINDOW_T *check_defa
- void platform_get_dimensions(EGLDisplay dpy, EGLNativeWindowType win,
- uint32_t *width, uint32_t *height, uint32_t *swapchain_count)
- {
-- EGL_DISPMANX_WINDOW_T *dwin = check_default(win);
-- vcos_assert(dwin);
-- vcos_assert(dwin->width < 1<<16); // sanity check
-- vcos_assert(dwin->height < 1<<16); // sanity check
-- *width = dwin->width;
-- *height = dwin->height;
-- *swapchain_count = 0;
-+#ifdef BUILD_WAYLAND
-+ if(khrn_platform_get_wl_display()) {
-+ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win;
-+ *width = wl_egl_window->width;
-+ *height = wl_egl_window->height;
-+ /* This seems to be used for sync'ing with the VC on buffer creation, but
-+ we are managing them on the CPU side */
-+ *swapchain_count = 1;
-+ } else {
-+#endif
-+ EGL_DISPMANX_WINDOW_T *dwin = check_default(win);
-+ vcos_assert(dwin);
-+ vcos_assert(dwin->width < 1<<16); // sanity check
-+ vcos_assert(dwin->height < 1<<16); // sanity check
-+ *width = dwin->width;
-+ *height = dwin->height;
-+ *swapchain_count = 0;
-+#ifdef BUILD_WAYLAND
-+ }
-+#endif
-+}
-+
-+#ifdef BUILD_WAYLAND
-+static DISPMANX_ELEMENT_HANDLE_T create_dummy_element()
-+{
-+ DISPMANX_DISPLAY_HANDLE_T display = vc_dispmanx_display_open(0);
-+ DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0);
-+ DISPMANX_ELEMENT_HANDLE_T element;
-+ VC_DISPMANX_ALPHA_T alpha = {DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 255, 0};
-+ VC_RECT_T src_rect;
-+ VC_RECT_T dst_rect;
-+
-+ src_rect.x = 0;
-+ src_rect.y = 0;
-+ src_rect.width = 1 << 16;
-+ src_rect.height = 1 << 16;
-+
-+ dst_rect.x = 0;
-+ dst_rect.y = 0;
-+ dst_rect.width = 1;
-+ dst_rect.height = 1;
-+
-+ element = vc_dispmanx_element_add(update, display, 0/*layer*/, &dst_rect,
-+ 0/*src*/, &src_rect,
-+ DISPMANX_PROTECTION_NONE, &alpha,
-+ 0/*clamp*/, 0/*transform*/);
-+
-+ vc_dispmanx_update_submit_sync(update);
-+
-+ vc_dispmanx_display_close(display);
-+
-+ return element;
- }
-+#endif
-
- uint32_t platform_get_handle(EGLDisplay dpy, EGLNativeWindowType win)
- {
-- EGL_DISPMANX_WINDOW_T *dwin = check_default(win);
-- vcos_assert(dwin);
-- vcos_assert(dwin->width < 1<<16); // sanity check
-- vcos_assert(dwin->height < 1<<16); // sanity check
-- return dwin->element;
-+#ifdef BUILD_WAYLAND
-+ if(khrn_platform_get_wl_display()) {
-+ struct wl_egl_window *wl_egl_window = (struct wl_egl_window*)win;
-+
-+ if (wl_egl_window->dummy_element == PLATFORM_WIN_NONE)
-+ wl_egl_window->dummy_element = create_dummy_element();
-+
-+ return wl_egl_window->dummy_element;
-+ } else {
-+#endif
-+ EGL_DISPMANX_WINDOW_T *dwin = check_default(win);
-+ vcos_assert(dwin);
-+ vcos_assert(dwin->width < 1<<16); // sanity check
-+ vcos_assert(dwin->height < 1<<16); // sanity check
-+ return dwin->element;
-+#ifdef BUILD_WAYLAND
-+ }
-+#endif
- }
-
- #endif
-Index: git/interface/khronos/common/linux/khrn_wayland.c
-===================================================================
---- /dev/null
-+++ git/interface/khronos/common/linux/khrn_wayland.c
-@@ -0,0 +1,215 @@
-+/*
-+Copyright (c) 2013, Raspberry Pi Foundation
-+All rights reserved.
-+
-+Redistribution and use in source and binary forms, with or without
-+modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ * Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ * Neither the name of the copyright holder nor the
-+ names of its contributors may be used to endorse or promote products
-+ derived from this software without specific prior written permission.
-+
-+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
-+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+*/
-+
-+#define VCOS_LOG_CATEGORY (&khrn_client_log)
-+
-+#include "interface/khronos/common/linux/khrn_wayland.h"
-+#include "interface/khronos/wayland-dispmanx-client-protocol.h"
-+#include "interface/khronos/wayland-egl/wayland-egl-priv.h"
-+
-+extern VCOS_LOG_CAT_T khrn_client_log;
-+
-+static void handle_dispmanx_format(void *data, struct wl_dispmanx *dispmanx,
-+ uint32_t format)
-+{
-+}
-+
-+static void handle_dispmanx_allocated(void *data, struct wl_dispmanx *dispmanx,
-+ struct wl_buffer *wl_buffer,
-+ uint32_t resource_handle)
-+{
-+ struct wl_dispmanx_client_buffer *buffer = wl_buffer_get_user_data(wl_buffer);
-+
-+ buffer->pending_allocation = 0;
-+ buffer->resource = resource_handle;
-+}
-+
-+static const struct wl_dispmanx_listener dispmanx_listener = {
-+ handle_dispmanx_format,
-+ handle_dispmanx_allocated,
-+};
-+
-+static void
-+sync_callback(void *data, struct wl_callback *callback, uint32_t serial)
-+{
-+ int *done = data;
-+
-+ *done = 1;
-+
-+ wl_callback_destroy(callback);
-+}
-+
-+static const struct wl_callback_listener sync_listener = {
-+ sync_callback
-+};
-+
-+static int
-+roundtrip(CLIENT_PROCESS_STATE_T *process)
-+{
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+ struct wl_callback *callback;
-+ int done = 0, ret = 0;
-+
-+ callback = wl_display_sync(wl_display);
-+ wl_callback_add_listener(callback, &sync_listener, &done);
-+ wl_proxy_set_queue((struct wl_proxy *) callback, process->wl_queue);
-+ while (ret != -1 && !done)
-+ ret = wl_display_dispatch_queue(wl_display, process->wl_queue);
-+
-+ if (!done)
-+ wl_callback_destroy(callback);
-+
-+ return ret;
-+}
-+
-+int do_wl_roundtrip()
-+{
-+ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE();
-+ return roundtrip(process);
-+}
-+
-+static void
-+registry_handle_global(void *data, struct wl_registry *registry,
-+ uint32_t name, const char *interface, uint32_t version)
-+{
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+ CLIENT_PROCESS_STATE_T *process = (CLIENT_PROCESS_STATE_T *)data;
-+
-+ if (strcmp(interface, "wl_dispmanx") == 0) {
-+ process->wl_dispmanx = wl_registry_bind(registry, name,
-+ &wl_dispmanx_interface, 1);
-+
-+ wl_proxy_set_queue((struct wl_proxy *) process->wl_dispmanx,
-+ process->wl_queue);
-+ wl_dispmanx_add_listener(process->wl_dispmanx, &dispmanx_listener, wl_display);
-+ roundtrip(process);
-+ }
-+}
-+
-+static void
-+registry_handle_global_remove(void *data, struct wl_registry *registry,
-+ uint32_t name)
-+{
-+}
-+
-+static const struct wl_registry_listener registry_listener = {
-+ registry_handle_global,
-+ registry_handle_global_remove
-+};
-+
-+int
-+init_process_wayland(CLIENT_PROCESS_STATE_T *process)
-+{
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+
-+ process->wl_queue = wl_display_create_queue(wl_display);
-+ if (!process->wl_queue) {
-+ vcos_log_error("wl_display_create_queue failed\n");
-+ return false;
-+ }
-+ wl_display_dispatch_pending(wl_display);
-+
-+ process->wl_registry = wl_display_get_registry(wl_display);
-+ if (!process->wl_registry) {
-+ vcos_log_error("wl_display_get_registry failed\n");
-+ return false;
-+ }
-+
-+ wl_proxy_set_queue((struct wl_proxy *) process->wl_registry,
-+ process->wl_queue);
-+
-+ wl_registry_add_listener(process->wl_registry, &registry_listener, process);
-+
-+ if (roundtrip(process) < 0 || process->wl_dispmanx == NULL) {
-+ vcos_log_error("failed to get wl_dispmanx\n");
-+ return false;
-+ }
-+
-+ return true;
-+}
-+
-+#ifndef ALIGN_UP
-+#define ALIGN_UP(x,y) ((x + (y)-1) & ~((y)-1))
-+#endif
-+
-+static void handle_buffer_release(void *data, struct wl_buffer *buffer_wl)
-+{
-+ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer = data;
-+ wl_dispmanx_client_buffer->in_use = 0;
-+}
-+
-+static const struct wl_buffer_listener buffer_listener = {
-+ handle_buffer_release
-+};
-+
-+struct wl_dispmanx_client_buffer *
-+allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color)
-+{
-+ CLIENT_PROCESS_STATE_T *process = CLIENT_GET_PROCESS_STATE();
-+ struct wl_dispmanx_client_buffer *wl_dispmanx_client_buffer;
-+ struct wl_buffer *wl_buffer;
-+ uint32_t stride = ALIGN_UP(window->width * 4, 16);
-+ uint32_t buffer_height = ALIGN_UP(window->height, 16);
-+ enum wl_dispmanx_format color_format;
-+ int ret = 0;
-+
-+ switch (color) {
-+ case ABGR_8888:
-+ color_format = WL_DISPMANX_FORMAT_ABGR8888;
-+ break;
-+ case XBGR_8888:
-+ color_format = WL_DISPMANX_FORMAT_XBGR8888;
-+ break;
-+ case RGB_565:
-+ color_format = WL_DISPMANX_FORMAT_RGB565;
-+ break;
-+ default:
-+ vcos_log_error("unknown KHRN_IMAGE_FORMAT_T 0x%x\n", color);
-+ return NULL;
-+ }
-+
-+ wl_buffer = wl_dispmanx_create_buffer(process->wl_dispmanx, window->width,
-+ window->height, stride, buffer_height,
-+ color_format);
-+ if (wl_buffer == NULL)
-+ return NULL;
-+
-+ wl_dispmanx_client_buffer = calloc(1, sizeof(struct wl_dispmanx_client_buffer));
-+ wl_dispmanx_client_buffer->wl_buffer = wl_buffer;
-+ wl_dispmanx_client_buffer->in_use = 0;
-+ wl_dispmanx_client_buffer->pending_allocation = 1;
-+ wl_dispmanx_client_buffer->width = window->width;
-+ wl_dispmanx_client_buffer->height = window->height;
-+
-+ wl_proxy_set_queue((struct wl_proxy *) wl_buffer, process->wl_queue);
-+ wl_buffer_add_listener(wl_buffer, &buffer_listener, wl_dispmanx_client_buffer);
-+
-+ while (ret != -1 && wl_dispmanx_client_buffer->pending_allocation)
-+ ret = do_wl_roundtrip();
-+
-+ return wl_dispmanx_client_buffer;
-+}
-Index: git/interface/vmcs_host/vc_vchi_dispmanx.h
-===================================================================
---- git.orig/interface/vmcs_host/vc_vchi_dispmanx.h
-+++ git/interface/vmcs_host/vc_vchi_dispmanx.h
-@@ -66,4 +66,19 @@ typedef struct {
- #define ELEMENT_CHANGE_MASK_RESOURCE (1<<4)
- #define ELEMENT_CHANGE_TRANSFORM (1<<5)
-
-+#ifdef BUILD_WAYLAND
-+/* XXX: This should be in a private header that can be included from EGL and vc_* */
-+#include <wayland-server.h>
-+#include "interface/vmcs_host/wayland-dispmanx-server-protocol.h"
-+struct wl_dispmanx_server_buffer {
-+ struct wl_resource *resource;
-+ struct wl_dispmanx *dispmanx;
-+ enum wl_dispmanx_format format;
-+ DISPMANX_RESOURCE_HANDLE_T handle;
-+ int32_t width;
-+ int32_t height;
-+ int in_use;
-+};
-+#endif
-+
- #endif
-Index: git/interface/khronos/common/linux/khrn_wayland.h
-===================================================================
---- /dev/null
-+++ git/interface/khronos/common/linux/khrn_wayland.h
-@@ -0,0 +1,33 @@
-+/*
-+Copyright (c) 2013, Raspberry Pi Foundation
-+All rights reserved.
-+
-+Redistribution and use in source and binary forms, with or without
-+modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ * Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ * Neither the name of the copyright holder nor the
-+ names of its contributors may be used to endorse or promote products
-+ derived from this software without specific prior written permission.
-+
-+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
-+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+*/
-+
-+#include "interface/khronos/common/khrn_client.h"
-+
-+int init_process_wayland(CLIENT_PROCESS_STATE_T *process);
-+int do_wl_roundtrip();
-+
-+struct wl_dispmanx_client_buffer *allocate_wl_buffer(struct wl_egl_window *window, KHRN_IMAGE_FORMAT_T color);
-Index: git/interface/khronos/egl/egl_client.c
-===================================================================
---- git.orig/interface/khronos/egl/egl_client.c
-+++ git/interface/khronos/egl/egl_client.c
-@@ -153,6 +153,10 @@ by an attribute value"
- #include <stdlib.h>
- #include <string.h>
-
-+#ifdef BUILD_WAYLAND
-+#include "interface/khronos/wayland-egl/wayland-egl-priv.h"
-+#include "interface/khronos/common/linux/khrn_wayland.h"
-+#endif
-
- #include "interface/khronos/egl/egl_client_cr.c"
-
-@@ -162,17 +166,6 @@ static void egl_current_release(CLIENT_P
- void egl_gl_flush_callback(bool wait);
- void egl_vg_flush_callback(bool wait);
-
--#include "interface/vmcs_host/vc_dispmanx_types.h"
--/**HACKHACK - give us the ability to inject a DispmanX
-- * resource handle into the CreateWindowSurface and
-- * SwapBuffers calls */
--static DISPMANX_RESOURCE_HANDLE_T next_resource_handle;
--
--EGLAPI EGLBoolean EGLAPIENTRY eglSetNextResourceHandle(DISPMANX_RESOURCE_HANDLE_T handle)
--{
-- next_resource_handle = handle;
--}
--
- /*
- TODO: do an RPC call to make sure the Khronos vll is loaded (and that it stays loaded until eglTerminate)
- Also affects global image (and possibly others?)
-@@ -451,6 +444,9 @@ EGLAPI const char EGLAPIENTRY * eglQuery
- "EGL_KHR_fence_sync "
- #endif
- #endif
-+#if EGL_WL_bind_wayland_display
-+ "EGL_WL_bind_wayland_display "
-+#endif
- ;
- break;
- case EGL_VENDOR:
-@@ -655,8 +651,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateW
- false,
- EGL_NO_TEXTURE,
- EGL_NO_TEXTURE,
-- 0, 0,
-- next_resource_handle);
-+ 0, 0);
-
- if (surface) {
- if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
-@@ -901,7 +896,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateP
- mipmap_texture,
- texture_format,
- texture_target,
-- 0, 0, 0);
-+ 0, 0);
-
- if (surface) {
- if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
-@@ -1043,7 +1038,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateP
- false,
- EGL_NO_TEXTURE,
- EGL_NO_TEXTURE,
-- pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle, 0);
-+ pixmap, ((server_handle[0] == 0) && (server_handle[1] == (uint32_t)(-1))) ? NULL : server_handle);
-
- if (surface) {
- if (khrn_pointer_map_insert(&process->surfaces, process->next_surface, surface)) {
-@@ -2245,6 +2240,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuf
- CLIENT_THREAD_STATE_T *thread;
- CLIENT_PROCESS_STATE_T *process;
- EGLBoolean result;
-+#ifdef BUILD_WAYLAND
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+#endif
-
- vcos_log_trace("eglSwapBuffers start. dpy=%d. surf=%d.", (int)dpy, (int)surf);
-
-@@ -2315,18 +2313,58 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuf
-
- vcos_log_trace("eglSwapBuffers server call");
-
-- if (next_resource_handle)
-- RPC_CALL7(eglIntSwapBuffers_impl,
-- thread,
-- EGLINTSWAPBUFFERS_ID_V2,
-- RPC_UINT(surface->serverbuffer),
-- RPC_UINT(surface->width),
-- RPC_UINT(surface->height),
-- RPC_UINT(surface->internal_handle),
-- RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0),
-- RPC_UINT(khrn_platform_get_window_position(surface->win)),
-- RPC_INT(next_resource_handle));
-- else
-+#ifdef BUILD_WAYLAND
-+ if (wl_display) {
-+ struct wl_egl_window *wl_egl_window = surface->wl_egl_window;
-+ struct wl_dispmanx_client_buffer *buffer_temp;
-+ uint32_t configid;
-+ KHRN_IMAGE_FORMAT_T color;
-+ int ret = 0;
-+
-+ buffer_temp = surface->front_wl_buffer;
-+ surface->front_wl_buffer = surface->back_wl_buffer;
-+ surface->back_wl_buffer = buffer_temp;
-+
-+ configid = egl_config_to_id(surface->config);
-+ color = egl_config_get_color_format(configid);
-+
-+ if (surface->back_wl_buffer == NULL)
-+ surface->back_wl_buffer = allocate_wl_buffer(wl_egl_window, color);
-+ else if (surface->back_wl_buffer->width != width ||
-+ surface->back_wl_buffer->height != height) {
-+
-+ struct wl_dispmanx_client_buffer *buffer;
-+
-+ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer);
-+ free(surface->back_wl_buffer);
-+
-+ buffer = allocate_wl_buffer(wl_egl_window, color);
-+ surface->back_wl_buffer = buffer;
-+ }
-+
-+ RPC_CALL7(eglIntSwapBuffers_impl,
-+ thread,
-+ EGLINTSWAPBUFFERS_ID_V2,
-+ RPC_UINT(surface->serverbuffer),
-+ RPC_UINT(surface->width),
-+ RPC_UINT(surface->height),
-+ RPC_UINT(surface->internal_handle),
-+ RPC_UINT(surface->swap_behavior == EGL_BUFFER_PRESERVED ? 1 : 0),
-+ RPC_UINT(khrn_platform_get_window_position(surface->win)),
-+ RPC_INT(surface->back_wl_buffer->resource));
-+
-+ surface->front_wl_buffer->in_use = 1;
-+ wl_surface_attach(wl_egl_window->wl_surface,
-+ surface->front_wl_buffer->wl_buffer,
-+ 0, 0);
-+ wl_surface_damage(wl_egl_window->wl_surface, 0, 0,
-+ surface->width, surface->height);
-+ wl_surface_commit(wl_egl_window->wl_surface);
-+
-+ while(ret != -1 && surface->back_wl_buffer->in_use)
-+ ret = wl_display_dispatch_queue(wl_display, process->wl_queue);
-+ } else
-+#endif
- RPC_CALL6(eglIntSwapBuffers_impl,
- thread,
- EGLINTSWAPBUFFERS_ID,
-Index: git/interface/khronos/egl/egl_client_get_proc.c
-===================================================================
---- git.orig/interface/khronos/egl/egl_client_get_proc.c
-+++ git/interface/khronos/egl/egl_client_get_proc.c
-@@ -254,6 +254,17 @@ EGLAPI void EGLAPIENTRY (* eglGetProcAdd
- return (void(*)(void))eglQueryGlobalImageBRCM;
- #endif
-
-+#ifdef BUILD_WAYLAND
-+#if EGL_WL_bind_wayland_display
-+ if (!strcmp(procname, "eglBindWaylandDisplayWL"))
-+ return (void(*)(void))eglBindWaylandDisplayWL;
-+ if (!strcmp(procname, "eglUnbindWaylandDisplayWL"))
-+ return (void(*)(void))eglUnbindWaylandDisplayWL;
-+ if (!strcmp(procname, "eglQueryWaylandBufferWL"))
-+ return (void(*)(void))eglQueryWaylandBufferWL;
-+#endif
-+#endif
-+
- return (void(*)(void)) NULL;
- }
-
-Index: git/interface/khronos/egl/egl_client_surface.c
-===================================================================
---- git.orig/interface/khronos/egl/egl_client_surface.c
-+++ git/interface/khronos/egl/egl_client_surface.c
-@@ -46,6 +46,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #include "interface/khronos/egl/egl_int_impl.h"
- #endif
-
-+#ifdef BUILD_WAYLAND
-+#include "interface/khronos/wayland-egl/wayland-egl-priv.h"
-+#include "interface/khronos/common/linux/khrn_wayland.h"
-+#endif
-+
- #include <stdlib.h>
-
-
-@@ -314,8 +319,7 @@ EGL_SURFACE_T *egl_surface_create(
- EGLenum texture_format,
- EGLenum texture_target,
- EGLNativePixmapType pixmap,
-- const uint32_t *pixmap_server_handle,
-- DISPMANX_RESOURCE_HANDLE_T next_resource_handle)
-+ const uint32_t *pixmap_server_handle)
- {
- KHRN_IMAGE_FORMAT_T color;
- KHRN_IMAGE_FORMAT_T depth;
-@@ -326,6 +330,10 @@ EGL_SURFACE_T *egl_surface_create(
- EGLint config_depth_bits;
- EGLint config_stencil_bits;
- CLIENT_THREAD_STATE_T *thread = CLIENT_GET_THREAD_STATE();
-+#ifdef BUILD_WAYLAND
-+ struct wl_display *wl_display = khrn_platform_get_wl_display();
-+ DISPMANX_RESOURCE_HANDLE_T resource;
-+#endif
-
- EGL_SURFACE_T *surface = egl_surface_pool_alloc();
-
-@@ -390,6 +398,18 @@ EGL_SURFACE_T *egl_surface_create(
-
- vcos_assert(color != IMAGE_FORMAT_INVALID);
-
-+#ifdef BUILD_WAYLAND
-+ if (type == WINDOW && wl_display) {
-+ surface->wl_egl_window = (struct wl_egl_window*)win;
-+ surface->back_wl_buffer = allocate_wl_buffer(
-+ surface->wl_egl_window, color);
-+ resource = surface->back_wl_buffer->resource;
-+ } else {
-+ surface->wl_egl_window = NULL;
-+ resource = DISPMANX_NO_HANDLE;
-+ }
-+#endif
-+
- #ifdef KHRONOS_EGL_PLATFORM_OPENWFC
- // Create stream for this window
- if(type != PBUFFER)
-@@ -474,7 +494,8 @@ EGL_SURFACE_T *egl_surface_create(
- #endif
- uint32_t results[3];
-
-- if (next_resource_handle)
-+#ifdef BUILD_WAYLAND
-+ if (resource != DISPMANX_NO_HANDLE)
- RPC_CALL16_OUT_CTRL(eglIntCreateSurface_impl,
- thread,
- EGLINTCREATESURFACE_ID_V2,
-@@ -492,9 +513,10 @@ EGL_SURFACE_T *egl_surface_create(
- RPC_UINT(config_stencil_bits),
- RPC_UINT(sem_name),
- RPC_UINT(type),
-- RPC_INT(next_resource_handle),
-+ RPC_INT(resource),
- results);
- else
-+#endif
- RPC_CALL15_OUT_CTRL(eglIntCreateSurface_impl,
- thread,
- EGLINTCREATESURFACE_ID,
-@@ -663,6 +685,18 @@ void egl_surface_free(EGL_SURFACE_T *sur
- if( surface->type == WINDOW ) {
- vcos_log_trace("egl_surface_free: calling platform_destroy_winhandle...");
- platform_destroy_winhandle( surface->win, surface->internal_handle );
-+
-+#ifdef BUILD_WAYLAND
-+ if (surface->back_wl_buffer) {
-+ wl_buffer_destroy(surface->back_wl_buffer->wl_buffer);
-+ free(surface->back_wl_buffer);
-+ }
-+
-+ if (surface->front_wl_buffer) {
-+ wl_buffer_destroy(surface->front_wl_buffer->wl_buffer);
-+ free(surface->front_wl_buffer);
-+ }
-+#endif
- }
- /* return value ignored -- read performed to ensure blocking. we want this to
- * block so clients can safely destroy the surface's window as soon as the
-Index: git/interface/khronos/egl/egl_client_surface.h
-===================================================================
---- git.orig/interface/khronos/egl/egl_client_surface.h
-+++ git/interface/khronos/egl/egl_client_surface.h
-@@ -288,6 +288,41 @@ typedef struct {
- type == PIXMAP
- */
- bool server_owned;
-+
-+#ifdef BUILD_WAYLAND
-+ /*
-+ wl_egl_window
-+
-+ Validity:
-+ type == WINDOW
-+
-+ Invariant:
-+ wayland EGL window
-+ */
-+ struct wl_egl_window *wl_egl_window;
-+
-+ /*
-+ front_wl_buffer
-+
-+ Validity:
-+ type == WINDOW
-+
-+ Invariant:
-+ client-side information about the wl_buffer in the front
-+ */
-+ struct wl_dispmanx_client_buffer *front_wl_buffer;
-+
-+ /*
-+ back_wl_buffer
-+
-+ Validity:
-+ type == WINDOW
-+
-+ Invariant:
-+ client-side information about the wl_buffer in the back
-+ */
-+ struct wl_dispmanx_client_buffer *back_wl_buffer;
-+#endif
- } EGL_SURFACE_T;
-
- extern bool egl_surface_check_attribs(
-@@ -322,8 +357,7 @@ extern EGL_SURFACE_T *egl_surface_create
- EGLenum texture_format,
- EGLenum texture_target,
- EGLNativePixmapType pixmap,
-- const uint32_t *pixmap_server_handle,
-- DISPMANX_RESOURCE_HANDLE_T next_resource_handle);
-+ const uint32_t *pixmap_server_handle);
- extern EGL_SURFACE_T *egl_surface_from_vg_image(
- VGImage vg_handle,
- EGLSurface name,
-Index: git/interface/khronos/egl/egl_int_impl.h
-===================================================================
---- git.orig/interface/khronos/egl/egl_int_impl.h
-+++ git/interface/khronos/egl/egl_int_impl.h
-@@ -57,7 +57,7 @@ FN(int, eglIntCreateSurface_impl, (
- uint32_t sem,
- uint32_t type,
- uint32_t *results,
-- DISPMANX_RESOURCE_HANDLE_T next_resource_handle))
-+ DISPMANX_RESOURCE_HANDLE_T resource_handle))
-
- FN(int, eglIntCreatePbufferFromVGImage_impl, (
- VGImage vg_handle,
-Index: git/interface/khronos/ext/egl_wayland.c
-===================================================================
---- /dev/null
-+++ git/interface/khronos/ext/egl_wayland.c
-@@ -0,0 +1,246 @@
-+/*
-+Copyright (c) 2013, Raspberry Pi Foundation
-+All rights reserved.
-+
-+Redistribution and use in source and binary forms, with or without
-+modification, are permitted provided that the following conditions are met:
-+ * Redistributions of source code must retain the above copyright
-+ notice, this list of conditions and the following disclaimer.
-+ * Redistributions in binary form must reproduce the above copyright
-+ notice, this list of conditions and the following disclaimer in the
-+ documentation and/or other materials provided with the distribution.
-+ * Neither the name of the copyright holder nor the
-+ names of its contributors may be used to endorse or promote products
-+ derived from this software without specific prior written permission.
-+
-+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
-+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+*/
-+
-+#include "interface/khronos/common/khrn_client_mangle.h"
-+#include "interface/khronos/common/khrn_client_rpc.h"
-+
-+#include "interface/khronos/ext/egl_khr_sync_client.h"
-+#include "interface/khronos/include/EGL/egl.h"
-+#include "interface/khronos/include/EGL/eglext.h"
-+
-+#include "interface/vmcs_host/vc_vchi_dispmanx.h"
-+
-+#include <wayland-server.h>
-+#include "interface/khronos/wayland-dispmanx-server-protocol.h"
-+
-+static void
-+destroy_buffer(struct wl_resource *resource)
-+{
-+ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(resource);
-+
-+ if(!buffer->in_use)
-+ vc_dispmanx_resource_delete(buffer->handle);
-+
-+ free(buffer);
-+}
-+
-+static void
-+buffer_destroy(struct wl_client *client, struct wl_resource *resource)
-+{
-+ wl_resource_destroy(resource);
-+}
-+
-+static const struct wl_buffer_interface dispmanx_buffer_interface = {
-+ buffer_destroy
-+};
-+
-+static VC_IMAGE_TYPE_T
-+get_vc_format(enum wl_dispmanx_format format)
-+{
-+ /* XXX: The app is likely to have been premultiplying in its shaders,
-+ * but the VC scanout hardware on the RPi cannot mix premultiplied alpha
-+ * channel with the element's alpha.
-+ */
-+ switch (format) {
-+ case WL_DISPMANX_FORMAT_ABGR8888:
-+ return VC_IMAGE_RGBA32;
-+ case WL_DISPMANX_FORMAT_XBGR8888:
-+ return VC_IMAGE_BGRX8888;
-+ case WL_DISPMANX_FORMAT_RGB565:
-+ return VC_IMAGE_RGB565;
-+ default:
-+ /* invalid format */
-+ return VC_IMAGE_MIN;
-+ }
-+}
-+
-+static void
-+dispmanx_create_buffer(struct wl_client *client, struct wl_resource *resource,
-+ uint32_t id, 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 = vc_dispmanx_resource_create(vc_format,
-+ width | (stride << 16),
-+ height | (buffer_height << 16),
-+ &dummy);
-+ if(buffer->handle == DISPMANX_NO_HANDLE) {
-+ wl_resource_post_error(resource,
-+ WL_DISPMANX_ERROR_ALLOC_FAILED,
-+ "allocation failed");
-+ free(buffer);
-+ return;
-+ }
-+
-+ 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);
-+
-+ wl_dispmanx_send_buffer_allocated(resource, buffer->resource,
-+ buffer->handle);
-+}
-+
-+static const struct wl_dispmanx_interface dispmanx_interface = {
-+ dispmanx_create_buffer,
-+};
-+
-+static void
-+bind_dispmanx(struct wl_client *client, void *data, uint32_t version, uint32_t id)
-+{
-+ struct wl_resource *resource;
-+
-+ resource = wl_resource_create(client, &wl_dispmanx_interface, 1, id);
-+ wl_resource_set_implementation(resource, &dispmanx_interface, NULL, NULL);
-+
-+ wl_resource_post_event(resource, WL_DISPMANX_FORMAT,
-+ WL_DISPMANX_FORMAT_ARGB8888);
-+
-+ wl_resource_post_event(resource, WL_DISPMANX_FORMAT,
-+ WL_DISPMANX_FORMAT_XRGB8888);
-+
-+ wl_resource_post_event(resource, WL_DISPMANX_FORMAT,
-+ WL_DISPMANX_FORMAT_ABGR8888);
-+
-+ wl_resource_post_event(resource, WL_DISPMANX_FORMAT,
-+ WL_DISPMANX_FORMAT_XBGR8888);
-+
-+ wl_resource_post_event(resource, WL_DISPMANX_FORMAT,
-+ WL_DISPMANX_FORMAT_RGB565);
-+}
-+
-+EGLBoolean EGLAPIENTRY
-+eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
-+{
-+ CLIENT_THREAD_STATE_T *thread;
-+ CLIENT_PROCESS_STATE_T *process;
-+
-+ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process))
-+ return EGL_FALSE;
-+
-+ if (process->wl_global != NULL)
-+ goto error;
-+
-+ process->wl_global = wl_global_create(display, &wl_dispmanx_interface, 1,
-+ NULL, bind_dispmanx);
-+ if (process->wl_global == NULL)
-+ goto error;
-+
-+ return EGL_TRUE;
-+
-+error:
-+ CLIENT_UNLOCK();
-+ return EGL_FALSE;
-+}
-+
-+EGLBoolean EGLAPIENTRY
-+eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
-+{
-+ CLIENT_THREAD_STATE_T *thread;
-+ CLIENT_PROCESS_STATE_T *process;
-+
-+ if (!CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process))
-+ return EGL_FALSE;
-+
-+ wl_global_destroy(process->wl_global);
-+ process->wl_global = NULL;
-+
-+ CLIENT_UNLOCK();
-+
-+ return EGL_TRUE;
-+}
-+
-+static int
-+get_egl_format(enum wl_dispmanx_format format)
-+{
-+ switch (format) {
-+ case WL_DISPMANX_FORMAT_ABGR8888:
-+ return EGL_TEXTURE_RGBA;
-+ case WL_DISPMANX_FORMAT_XBGR8888:
-+ return EGL_TEXTURE_RGB;
-+ case WL_DISPMANX_FORMAT_RGB565:
-+ return EGL_TEXTURE_RGB;
-+ default:
-+ /* invalid format */
-+ return EGL_NO_TEXTURE;
-+ }
-+}
-+
-+EGLBoolean EGLAPIENTRY
-+eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *_buffer,
-+ EGLint attribute, EGLint *value)
-+{
-+ struct wl_dispmanx_server_buffer *buffer = wl_resource_get_user_data(_buffer);
-+
-+ if (wl_resource_instance_of(_buffer, &wl_dispmanx_interface,
-+ &dispmanx_buffer_interface))
-+ return EGL_FALSE;
-+
-+ switch (attribute) {
-+ case EGL_TEXTURE_FORMAT:
-+ *value = get_egl_format(buffer->format);
-+ if (*value == EGL_NO_TEXTURE)
-+ return EGL_FALSE;
-+ return EGL_TRUE;
-+ case EGL_WIDTH:
-+ *value = buffer->width;
-+ return EGL_TRUE;
-+ case EGL_HEIGHT:
-+ *value = buffer->height;
-+ return EGL_TRUE;
-+ }
-+
-+ return EGL_FALSE;
-+}
-Index: git/interface/khronos/include/EGL/eglext.h
-===================================================================
---- git.orig/interface/khronos/include/EGL/eglext.h
-+++ git/interface/khronos/include/EGL/eglext.h
-@@ -191,6 +191,29 @@ typedef EGLBoolean (EGLAPIENTRYP PFNEGLG
- #endif
-
-
-+#ifndef EGL_WL_bind_wayland_display
-+#define EGL_WL_bind_wayland_display 1
-+
-+#define EGL_WAYLAND_BUFFER_WL 0x31D5 /* eglCreateImageKHR target */
-+#define EGL_WAYLAND_PLANE_WL 0x31D6 /* eglCreateImageKHR target */
-+#define EGL_TEXTURE_Y_U_V_WL 0x31D7
-+#define EGL_TEXTURE_Y_UV_WL 0x31D8
-+#define EGL_TEXTURE_Y_XUXV_WL 0x31D9
-+
-+struct wl_display;
-+struct wl_resource;
-+#ifdef EGL_EGLEXT_PROTOTYPES
-+EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
-+EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display);
-+EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
-+#endif
-+typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
-+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWL) (EGLDisplay dpy, struct wl_display *display);
-+typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWL) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
-+
-+#endif
-+
-+
- #ifdef __cplusplus
- }
- #endif
-Index: git/interface/khronos/wayland-egl/wayland-egl-priv.h
-===================================================================
---- /dev/null
-+++ git/interface/khronos/wayland-egl/wayland-egl-priv.h
-@@ -0,0 +1,53 @@
-+/* Copied from Mesa */
-+
-+#ifndef _WAYLAND_EGL_PRIV_H
-+#define _WAYLAND_EGL_PRIV_H
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/* GCC visibility */
-+#if defined(__GNUC__) && __GNUC__ >= 4
-+#define WL_EGL_EXPORT __attribute__ ((visibility("default")))
-+#else
-+#define WL_EGL_EXPORT
-+#endif
-+
-+#include "interface/vmcs_host/vc_dispmanx.h"
-+#include "interface/khronos/egl/egl_client_surface.h"
-+
-+#include <wayland-client.h>
-+
-+struct wl_dispmanx_client_buffer {
-+ struct wl_buffer *wl_buffer;
-+ DISPMANX_RESOURCE_HANDLE_T resource;
-+
-+ int pending_allocation;
-+ int in_use;
-+ int width;
-+ int height;
-+};
-+
-+struct wl_egl_window {
-+ struct wl_surface *wl_surface;
-+
-+ int width;
-+ int height;
-+ int dx;
-+ int dy;
-+
-+ int attached_width;
-+ int attached_height;
-+
-+ /* XXX: The VC side seems to expect a valid element handle to be
-+ passed to eglIntCreateSurface_impl and/or eglIntSwapBuffers_impl,
-+ even for host-managed surfaces. */
-+ DISPMANX_ELEMENT_HANDLE_T dummy_element;
-+};
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
-Index: git/interface/khronos/wayland-egl/wayland-egl.c
-===================================================================
---- /dev/null
-+++ git/interface/khronos/wayland-egl/wayland-egl.c
-@@ -0,0 +1,59 @@
-+/* Copied from Mesa */
-+
-+#include <stdlib.h>
-+
-+#include <wayland-client.h>
-+#include <wayland-egl.h>
-+#include "wayland-egl-priv.h"
-+
-+WL_EGL_EXPORT void
-+wl_egl_window_resize(struct wl_egl_window *egl_window,
-+ int width, int height,
-+ int dx, int dy)
-+{
-+ if (egl_window->width == width &&
-+ egl_window->height == height &&
-+ egl_window->dx == dx &&
-+ egl_window->dy == dy)
-+ return;
-+
-+ egl_window->width = width;
-+ egl_window->height = height;
-+ egl_window->dx = dx;
-+ egl_window->dy = dy;
-+}
-+
-+WL_EGL_EXPORT struct wl_egl_window *
-+wl_egl_window_create(struct wl_surface *surface,
-+ int width, int height)
-+{
-+ struct wl_egl_window *egl_window;
-+
-+ egl_window = calloc(1, sizeof *egl_window);
-+ if (!egl_window)
-+ return NULL;
-+
-+ egl_window->wl_surface = surface;
-+ wl_egl_window_resize(egl_window, width, height, 0, 0);
-+ egl_window->attached_width = 0;
-+ egl_window->attached_height = 0;
-+ egl_window->dummy_element = PLATFORM_WIN_NONE;
-+
-+ return egl_window;
-+}
-+
-+WL_EGL_EXPORT void
-+wl_egl_window_destroy(struct wl_egl_window *egl_window)
-+{
-+ free(egl_window);
-+}
-+
-+WL_EGL_EXPORT void
-+wl_egl_window_get_attached_size(struct wl_egl_window *egl_window,
-+ int *width, int *height)
-+{
-+ if (width)
-+ *width = egl_window->attached_width;
-+ if (height)
-+ *height = egl_window->attached_height;
-+}
-Index: git/interface/khronos/wayland-egl/wayland-egl.pc.in
-===================================================================
---- /dev/null
-+++ git/interface/khronos/wayland-egl/wayland-egl.pc.in
-@@ -0,0 +1,10 @@
-+prefix=@CMAKE_INSTALL_PREFIX@
-+exec_prefix=${prefix}
-+libdir=${exec_prefix}/lib
-+includedir=${prefix}/include
-+
-+Name: wayland-egl
-+Description: VideoCore wayland-egl library
-+Version: @PROJECT_APIVER@
-+Libs: -L${libdir} -lwayland-egl
-+Cflags: -I${includedir}
-Index: git/interface/vmcs_host/CMakeLists.txt
-===================================================================
---- git.orig/interface/vmcs_host/CMakeLists.txt
-+++ git/interface/vmcs_host/CMakeLists.txt
-@@ -9,13 +9,24 @@ add_definitions(-fno-strict-aliasing)
-
- include_directories(${VMCS_TARGET}/vcfiled)
-
--add_library(vchostif
-- ${VMCS_TARGET}/vcfilesys.c ${VMCS_TARGET}/vcmisc.c
-- vc_vchi_gencmd.c vc_vchi_filesys.c vc_vchi_gpuserv.c
-- vc_vchi_tvservice.c vc_vchi_cecservice.c
-- vc_vchi_dispmanx.c vc_service_common.c)
-+set(VCHOSTIF_SOURCE
-+ ${VMCS_TARGET}/vcfilesys.c ${VMCS_TARGET}/vcmisc.c
-+ vc_vchi_gencmd.c vc_vchi_filesys.c vc_vchi_gpuserv.c
-+ vc_vchi_tvservice.c vc_vchi_cecservice.c
-+ vc_vchi_dispmanx.c vc_service_common.c)
- # ${VMCS_TARGET}/vmcs_main.c
- # vc_vchi_haud.c
-+
-+if (BUILD_WAYLAND)
-+wayland_add_protocol_server(
-+ VCHOSTIF_SOURCE
-+ ../../interface/wayland/dispmanx.xml
-+ dispmanx
-+)
-+endif ()
-+
-+add_library(vchostif ${VCHOSTIF_SOURCE})
-+
- #add_library(bufman vc_vchi_bufman.c )
-
- # OpenMAX/IL component service
-Index: git/interface/vmcs_host/vc_dispmanx.h
-===================================================================
---- git.orig/interface/vmcs_host/vc_dispmanx.h
-+++ git/interface/vmcs_host/vc_dispmanx.h
-@@ -39,6 +39,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBI
- #ifdef __cplusplus
- extern "C" {
- #endif
-+
-+#ifdef BUILD_WAYLAND
-+struct wl_resource;
-+#endif
-+
- // Same function as above, to aid migration of code.
- VCHPRE_ int VCHPOST_ vc_dispman_init( void );
- // Stop the service from being used
-@@ -135,6 +140,11 @@ VCHPRE_ int VCHPOST_ vc_dispmanx_resourc
- // Start triggering callbacks synced to vsync
- VCHPRE_ int VCHPOST_ vc_dispmanx_vsync_callback( DISPMANX_DISPLAY_HANDLE_T display, DISPMANX_CALLBACK_FUNC_T cb_func, void *cb_arg );
-
-+#ifdef BUILD_WAYLAND
-+VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer );
-+
-+VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use );
-+#endif
- #ifdef __cplusplus
- }
- #endif
-Index: git/interface/vmcs_host/vc_vchi_dispmanx.c
-===================================================================
---- git.orig/interface/vmcs_host/vc_vchi_dispmanx.c
-+++ git/interface/vmcs_host/vc_vchi_dispmanx.c
-@@ -1319,3 +1319,45 @@ static void *dispmanx_notify_func( void
- }
- return 0;
- }
-+
-+
-+#ifdef BUILD_WAYLAND
-+/***********************************************************
-+ * Name: vc_dispmanx_get_handle_from_wl_buffer
-+ *
-+ * Arguments:
-+ * struct wl_resource *_buffer
-+ *
-+ * Description: Return the handle of the resource associated to this Wayland buffer
-+ *
-+ * Returns: A resource handle
-+ *
-+ ***********************************************************/
-+VCHPRE_ DISPMANX_RESOURCE_HANDLE_T VCHPOST_ vc_dispmanx_get_handle_from_wl_buffer( struct wl_resource *_buffer )
-+{
-+ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data;
-+ if (!buffer)
-+ return DISPMANX_NO_HANDLE;
-+
-+ return buffer->handle;
-+}
-+
-+/***********************************************************
-+ * Name: vc_dispmanx_set_wl_buffer_in_use
-+ *
-+ * Arguments:
-+ * struct wl_resource *_buffer
-+ * int in_use
-+ *
-+ * Description: Mark this Wayland buffer as being in use by the compositor
-+ *
-+ ***********************************************************/
-+VCHPRE_ void VCHPOST_ vc_dispmanx_set_wl_buffer_in_use( struct wl_resource *_buffer, int in_use )
-+{
-+ struct wl_dispmanx_server_buffer *buffer = (struct wl_dispmanx_server_buffer*)_buffer->data;
-+ if (!buffer)
-+ return;
-+
-+ buffer->in_use = in_use;
-+}
-+#endif
-Index: git/interface/wayland/dispmanx.xml
-===================================================================
---- /dev/null
-+++ git/interface/wayland/dispmanx.xml
-@@ -0,0 +1,123 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<protocol name="dispmanx">
-+
-+ <copyright>
-+ Copyright © 2008-2011 Kristian Høgsberg
-+ Copyright © 2010-2011 Intel Corporation
-+ Copyright © 2013 Raspberry Pi Foundation
-+
-+ Permission to use, copy, modify, distribute, and sell this
-+ software and its documentation for any purpose is hereby granted
-+ without fee, provided that\n the above copyright notice appear in
-+ all copies and that both that copyright notice and this permission
-+ notice appear in supporting documentation, and that the name of
-+ the copyright holders not be used in advertising or publicity
-+ pertaining to distribution of the software without specific,
-+ written prior permission. The copyright holders make no
-+ representations about the suitability of this software for any
-+ purpose. It is provided "as is" without express or implied
-+ warranty.
-+
-+ THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
-+ SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-+ FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
-+ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-+ AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-+ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-+ THIS SOFTWARE.
-+ </copyright>
-+
-+ <!-- DispManX support. This object is created by the server and published
-+ using the display's global event. -->
-+ <interface name="wl_dispmanx" version="1">
-+ <enum name="error">
-+ <entry name="alloc_failed" value="0"/>
-+ <entry name="invalid_format" value="1"/>
-+ </enum>
-+
-+ <enum name="format">
-+ <!-- The pixel format codes match the #defines in drm_fourcc.h.
-+ The formats actually supported by the compositor will be
-+ reported by the format event. -->
-+ <entry name="c8" value="0x20203843"/>
-+ <entry name="rgb332" value="0x38424752"/>
-+ <entry name="bgr233" value="0x38524742"/>
-+ <entry name="xrgb4444" value="0x32315258"/>
-+ <entry name="xbgr4444" value="0x32314258"/>
-+ <entry name="rgbx4444" value="0x32315852"/>
-+ <entry name="bgrx4444" value="0x32315842"/>
-+ <entry name="argb4444" value="0x32315241"/>
-+ <entry name="abgr4444" value="0x32314241"/>
-+ <entry name="rgba4444" value="0x32314152"/>
-+ <entry name="bgra4444" value="0x32314142"/>
-+ <entry name="xrgb1555" value="0x35315258"/>
-+ <entry name="xbgr1555" value="0x35314258"/>
-+ <entry name="rgbx5551" value="0x35315852"/>
-+ <entry name="bgrx5551" value="0x35315842"/>
-+ <entry name="argb1555" value="0x35315241"/>
-+ <entry name="abgr1555" value="0x35314241"/>
-+ <entry name="rgba5551" value="0x35314152"/>
-+ <entry name="bgra5551" value="0x35314142"/>
-+ <entry name="rgb565" value="0x36314752"/>
-+ <entry name="bgr565" value="0x36314742"/>
-+ <entry name="rgb888" value="0x34324752"/>
-+ <entry name="bgr888" value="0x34324742"/>
-+ <entry name="xrgb8888" value="0x34325258"/>
-+ <entry name="xbgr8888" value="0x34324258"/>
-+ <entry name="rgbx8888" value="0x34325852"/>
-+ <entry name="bgrx8888" value="0x34325842"/>
-+ <entry name="argb8888" value="0x34325241"/>
-+ <entry name="abgr8888" value="0x34324241"/>
-+ <entry name="rgba8888" value="0x34324152"/>
-+ <entry name="bgra8888" value="0x34324142"/>
-+ <entry name="xrgb2101010" value="0x30335258"/>
-+ <entry name="xbgr2101010" value="0x30334258"/>
-+ <entry name="rgbx1010102" value="0x30335852"/>
-+ <entry name="bgrx1010102" value="0x30335842"/>
-+ <entry name="argb2101010" value="0x30335241"/>
-+ <entry name="abgr2101010" value="0x30334241"/>
-+ <entry name="rgba1010102" value="0x30334152"/>
-+ <entry name="bgra1010102" value="0x30334142"/>
-+ <entry name="yuyv" value="0x56595559"/>
-+ <entry name="yvyu" value="0x55595659"/>
-+ <entry name="uyvy" value="0x59565955"/>
-+ <entry name="vyuy" value="0x59555956"/>
-+ <entry name="ayuv" value="0x56555941"/>
-+ <entry name="nv12" value="0x3231564e"/>
-+ <entry name="nv21" value="0x3132564e"/>
-+ <entry name="nv16" value="0x3631564e"/>
-+ <entry name="nv61" value="0x3136564e"/>
-+ <entry name="yuv410" value="0x39565559"/>
-+ <entry name="yvu410" value="0x39555659"/>
-+ <entry name="yuv411" value="0x31315559"/>
-+ <entry name="yvu411" value="0x31315659"/>
-+ <entry name="yuv420" value="0x32315559"/>
-+ <entry name="yvu420" value="0x32315659"/>
-+ <entry name="yuv422" value="0x36315559"/>
-+ <entry name="yvu422" value="0x36315659"/>
-+ <entry name="yuv444" value="0x34325559"/>
-+ <entry name="yvu444" value="0x34325659"/>
-+ </enum>
-+
-+ <event name="format">
-+ <arg name="format" type="uint"/>
-+ </event>
-+
-+ <!-- Create a wayland buffer for the DispManX resource. -->
-+ <request name="create_buffer">
-+ <arg name="id" type="new_id" interface="wl_buffer"/>
-+ <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>
-+
-+ <event name="buffer_allocated">
-+ <arg name="buffer" type="object" interface="wl_buffer"/>
-+ <arg name="handle" type="uint"/>
-+ </event>
-+ </interface>
-+
-+</protocol>
-Index: git/makefiles/cmake/Wayland.cmake
-===================================================================
---- /dev/null
-+++ git/makefiles/cmake/Wayland.cmake
-@@ -0,0 +1,72 @@
-+#=============================================================================
-+# Copyright (C) 2012-2013 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
-+# All rights reserved.
-+#
-+# Redistribution and use in source and binary forms, with or without
-+# modification, are permitted provided that the following conditions
-+# are met:
-+#
-+# * Redistributions of source code must retain the above copyright
-+# notice, this list of conditions and the following disclaimer.
-+#
-+# * Redistributions in binary form must reproduce the above copyright
-+# notice, this list of conditions and the following disclaimer in the
-+# documentation and/or other materials provided with the distribution.
-+#
-+# * Neither the name of Pier Luigi Fiorini nor the names of his
-+# contributors may be used to endorse or promote products derived
-+# from this software without specific prior written permission.
-+#
-+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+#=============================================================================
-+
-+find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
-+
-+# wayland_add_protocol_client(outfiles inputfile basename)
-+function(WAYLAND_ADD_PROTOCOL_CLIENT _sources _protocol _basename)
-+ if(NOT WAYLAND_SCANNER_EXECUTABLE)
-+ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.")
-+ endif()
-+
-+ get_filename_component(_infile ${_protocol} ABSOLUTE)
-+ set(_client_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-client-protocol.h")
-+ set(_code "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-protocol.c")
-+
-+ add_custom_command(OUTPUT "${_client_header}"
-+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header < ${_infile} > ${_client_header}
-+ DEPENDS ${_infile} VERBATIM)
-+
-+ add_custom_command(OUTPUT "${_code}"
-+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} code < ${_infile} > ${_code}
-+ DEPENDS ${_infile} VERBATIM)
-+
-+ list(APPEND ${_sources} "${_client_header}" "${_code}")
-+ set(${_sources} ${${_sources}} PARENT_SCOPE)
-+endfunction()
-+
-+# wayland_add_protocol_server(outfiles inputfile basename)
-+function(WAYLAND_ADD_PROTOCOL_SERVER _sources _protocol _basename)
-+ if(NOT WAYLAND_SCANNER_EXECUTABLE)
-+ message(FATAL "The wayland-scanner executable has nto been found on your system. You must install it.")
-+ endif()
-+
-+ get_filename_component(_infile ${_protocol} ABSOLUTE)
-+ set(_server_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${_basename}-server-protocol.h")
-+
-+ add_custom_command(OUTPUT "${_server_header}"
-+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} server-header < ${_infile} > ${_server_header}
-+ DEPENDS ${_infile} VERBATIM)
-+
-+ list(APPEND ${_sources} "${_server_header}")
-+ set(${_sources} ${${_sources}} PARENT_SCOPE)
-+endfunction()
OpenPOWER on IntegriCloud