Name WL_bind_wayland_display Name Strings EGL_WL_bind_wayland_display Contact Kristian Høgsberg <krh@bitplanet.net> Benjamin Franzke <benjaminfranzke@googlemail.com> Status Proposal Version Version 5, July 16, 2013 Number EGL Extension #not assigned Dependencies Requires EGL 1.4 or later. This extension is written against the wording of the EGL 1.4 specification. EGL_KHR_base_image is required. Overview This extension provides entry points for binding and unbinding the wl_display of a Wayland compositor to an EGLDisplay. Binding a wl_display means that the EGL implementation should provide one or more interfaces in the Wayland protocol to allow clients to create wl_buffer objects. On the server side, this extension also provides a new target for eglCreateImageKHR, to create an EGLImage from a wl_buffer Adding an implementation specific wayland interface, allows the EGL implementation to define specific wayland requests and events, needed for buffer sharing in an EGL wayland platform. IP Status Open-source; freely implementable. New Procedures and Functions EGLBoolean eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); EGLBoolean eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); EGLBoolean eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); New Tokens Accepted as <target> in eglCreateImageKHR EGL_WAYLAND_BUFFER_WL 0x31D5 Accepted in the <attrib_list> parameter of eglCreateImageKHR: EGL_WAYLAND_PLANE_WL 0x31D6 Possible values for EGL_TEXTURE_FORMAT: EGL_TEXTURE_Y_U_V_WL 0x31D7 EGL_TEXTURE_Y_UV_WL 0x31D8 EGL_TEXTURE_Y_XUXV_WL 0x31D9 EGL_TEXTURE_EXTERNAL_WL 0x31DA Accepted in the <attribute> parameter of eglQueryWaylandBufferWL: EGL_TEXTURE_FORMAT 0x3080 EGL_WAYLAND_Y_INVERTED_WL 0x31DB Additions to the EGL 1.4 Specification: To bind a server side wl_display to an EGLDisplay, call EGLBoolean eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); To unbind a server side wl_display from an EGLDisplay, call EGLBoolean eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display); eglBindWaylandDisplayWL returns EGL_FALSE when there is already a wl_display bound to EGLDisplay otherwise EGL_TRUE. eglUnbindWaylandDisplayWL returns EGL_FALSE when there is no wl_display bound to the EGLDisplay currently otherwise EGL_TRUE. A wl_buffer can have several planes, typically in case of planar YUV formats. Depending on the exact YUV format in use, the compositor will have to create one or more EGLImages for the various planes. The eglQueryWaylandBufferWL function should be used to first query the wl_buffer texture format using EGL_TEXTURE_FORMAT as the attribute. If the wl_buffer object is not an EGL wl_buffer (wl_shm and other wayland extensions can create wl_buffer objects of different types), this query will return EGL_FALSE. In that case the wl_buffer can not be used with EGL and the compositor should have another way to get the buffer contents. If eglQueryWaylandBufferWL succeeds, the returned value will be one of EGL_TEXTURE_RGB, EGL_TEXTURE_RGBA, EGL_TEXTURE_Y_U_V_WL, EGL_TEXTURE_Y_UV_WL, EGL_TEXTURE_Y_XUXV_WL. The value returned describes how many EGLImages must be used, which components will be sampled from each EGLImage and how they map to rgba components in the shader. The naming conventions separates planes by _ and within each plane, the order or R, G, B, A, Y, U, and V indicates how those components map to the rgba value returned by the sampler. X indicates that the corresponding component in the rgba value isn't used. RGB and RGBA buffer types: EGL_TEXTURE_RGB One plane, samples RGB from the texture to rgb in the shader. Alpha channel is not valid. EGL_TEXTURE_RGBA One plane, samples RGBA from the texture to rgba in the shader. YUV buffer types: EGL_TEXTURE_Y_U_V_WL Three planes, samples Y from the first plane to r in the shader, U from the second plane to r, and V from the third plane to r. EGL_TEXTURE_Y_UV_WL Two planes, samples Y from the first plane to r in the shader, U and V from the second plane to rg. EGL_TEXTURE_Y_XUXV_WL Two planes, samples Y from the first plane to r in the shader, U and V from the second plane to g and a. EGL_TEXTURE_EXTERNAL_WL Treated as a single plane texture, but sampled with samplerExternalOES according to OES_EGL_image_external After querying the wl_buffer layout, create EGLImages for the planes by calling eglCreateImageKHR with wl_buffer as EGLClientBuffer, EGL_WAYLAND_BUFFER_WL as the target, NULL context. If no attributes are given, an EGLImage will be created for the first plane. For multi-planar buffers, specify the plane to create the EGLImage for by using the EGL_WAYLAND_PLANE_WL attribute. The value of the attribute is the index of the plane, as defined by the buffer format. Writing to an EGLImage created from a wl_buffer in any way (such as glTexImage2D, binding the EGLImage as a renderbuffer etc) will result in undefined behavior. Further, eglQueryWaylandBufferWL accepts attributes EGL_WIDTH and EGL_HEIGHT to query the width and height of the wl_buffer. Also, eglQueryWaylandBufferWL may accept EGL_WAYLAND_Y_INVERTED_WL attribute to query orientation of wl_buffer. If EGL_WAYLAND_Y_INVERTED_WL is supported eglQueryWaylandBufferWL returns EGL_TRUE and value is a boolean that tells if wl_buffer is y-inverted or not. If EGL_WAYLAND_Y_INVERTED_WL is not supported eglQueryWaylandBufferWL returns EGL_FALSE, in that case wl_buffer should be treated as if value of EGL_WAYLAND_Y_INVERTED_WL was EGL_TRUE. Issues Revision History Version 1, March 1, 2011 Initial draft (Benjamin Franzke) Version 2, July 5, 2012 Add EGL_WAYLAND_PLANE_WL attribute to allow creating an EGLImage for different planes of planar buffer. (Kristian Høgsberg) Version 3, July 10, 2012 Add eglQueryWaylandBufferWL and the various buffer formats. (Kristian Høgsberg) Version 4, July 19, 2012 Use EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB, and EGL_TEXTURE_RGBA, and just define the new YUV texture formats. Add support for EGL_WIDTH and EGL_HEIGHT in the query attributes (Kristian Høgsberg) Version 5, July 16, 2013 Change eglQueryWaylandBufferWL to take a resource pointer to the buffer instead of a pointer to a struct wl_buffer, as the latter has been deprecated. (Ander Conselvan de Oliveira) Version 6, September 16, 2013 Add EGL_WAYLAND_Y_INVERTED_WL attribute to allow specifying wl_buffer's orientation.