diff --git a/Makefile.am b/Makefile.am
index 016bb760..332f9b46 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = src protocol
+SUBDIRS = src protocol doc
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
diff --git a/configure.ac b/configure.ac
index fc623e82..b709e3c1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -51,8 +51,13 @@ fi
AC_PATH_PROG(XSLTPROC, xsltproc)
AM_CONDITIONAL([HAVE_XSLTPROC], [test $XSLTPROC != ""])
+AC_PATH_PROG(PUBLICAN, publican)
+AM_CONDITIONAL([HAVE_PUBLICAN], [test $PUBLICAN != ""])
+
AC_CONFIG_FILES([Makefile
wayland-scanner.m4
+ doc/Makefile
+ doc/Wayland/Makefile
src/Makefile
src/wayland-server.pc
src/wayland-client.pc
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 00000000..f8046e78
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = Wayland
diff --git a/doc/Wayland/.gitignore b/doc/Wayland/.gitignore
new file mode 100644
index 00000000..cf787546
--- /dev/null
+++ b/doc/Wayland/.gitignore
@@ -0,0 +1,2 @@
+Wayland
+en-US/Protocol.xml
diff --git a/doc/Wayland/Makefile.am b/doc/Wayland/Makefile.am
new file mode 100644
index 00000000..0ac9fff9
--- /dev/null
+++ b/doc/Wayland/Makefile.am
@@ -0,0 +1,54 @@
+if HAVE_PUBLICAN
+noinst_DATA = Wayland
+
+publican_sources = \
+ $(srcdir)/en-US/Wayland.ent \
+ $(srcdir)/en-US/Architecture.xml \
+ $(srcdir)/en-US/Author_Group.xml \
+ $(srcdir)/en-US/Book_Info.xml \
+ $(srcdir)/en-US/Chapter.xml \
+ $(srcdir)/en-US/Preface.xml \
+ $(srcdir)/en-US/Wayland.xml \
+ $(srcdir)/en-US/Revision_History.xml \
+ $(srcdir)/en-US/images/icon.svg \
+ $(srcdir)/en-US/images/wayland-architecture.png \
+ $(srcdir)/en-US/images/wayland.png \
+ $(srcdir)/en-US/images/x-architecture.png
+
+# publican does not support out-of-tree builds and during make distcheck the
+# source tree is read-only so we can't chdir and/or dump the protocol there
+# copy the tree into _build, leaving a marker file to clean up after
+# distclean
+# See https://bugzilla.redhat.com/show_bug.cgi?id=798484 for the chmod
+copy-sources:
+ if ! test -e "en-US/"; then \
+ mkdir en-US/; \
+ touch en-US/need-distclean; \
+ cp -r $(srcdir)/en-US/* en-US; \
+ chmod u+w en-US/images; \
+ fi
+
+Wayland: docbook-xsl publican.cfg $(publican_sources)
+ publican build --config=$(srcdir)/publican.cfg --lang en-US --format html,pdf
+
+# This must be run befor the publican run
+docbook-xsl: copy-sources $(top_srcdir)/protocol/wayland.xml $(srcdir)/protocol-to-docbook.xsl
+ $(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol-to-docbook.xsl $(top_srcdir)/protocol/wayland.xml > $(builddir)/en-US/Protocol.xml
+
+clean-local:
+ -rm -rf Wayland
+ if test -e "en-US/need-distclean"; then \
+ rm -rf en-US; \
+ fi
+
+install-data-local:
+ $(MKDIR_P) $(DESTDIR)$(docdir)
+ cp -R $(builddir)/Wayland $(DESTDIR)$(docdir)
+
+uninstall-local:
+ -rm -rf $(DESTDIR)$(docdir)/Wayland/*
+ -rmdir $(DESTDIR)$(docdir)/Wayland
+
+EXTRA_DIST = $(publican_sources) publican.cfg protocol-to-docbook.xsl
+
+endif
diff --git a/doc/Wayland/en-US/Architecture.xml b/doc/Wayland/en-US/Architecture.xml
new file mode 100644
index 00000000..d10260a8
--- /dev/null
+++ b/doc/Wayland/en-US/Architecture.xml
@@ -0,0 +1,318 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+ Wayland Architecture
+
+ X vs. Wayland Architecture
+
+ A good way to understand the wayland architecture
+ and how it is different from X is to follow an event
+ from the input device to the point where the change
+ it affects appears on screen.
+
+
+ This is where we are now with X:
+
+
+
+
+
+
+
+
+
+
+ The kernel gets an event from an input
+ device and sends it to X through the evdev
+ input driver. The kernel does all the hard
+ work here by driving the device and
+ translating the different device specific
+ event protocols to the linux evdev input
+ event standard.
+
+
+
+
+ The X server determines which window the
+ event affects and sends it to the clients
+ that have selected for the event in question
+ on that window. The X server doesn't
+ actually know how to do this right, since
+ the window location on screen is controlled
+ by the compositor and may be transformed in
+ a number of ways that the X server doesn't
+ understand (scaled down, rotated, wobbling,
+ etc).
+
+
+
+
+ The client looks at the event and decides
+ what to do. Often the UI will have to change
+ in response to the event - perhaps a check
+ box was clicked or the pointer entered a
+ button that must be highlighted. Thus the
+ client sends a rendering request back to the
+ X server.
+
+
+
+
+ When the X server receives the rendering
+ request, it sends it to the driver to let it
+ program the hardware to do the rendering.
+ The X server also calculates the bounding
+ region of the rendering, and sends that to
+ the compositor as a damage event.
+
+
+
+
+ The damage event tells the compositor that
+ something changed in the window and that it
+ has to recomposite the part of the screen
+ where that window is visible. The compositor
+ is responsible for rendering the entire
+ screen contents based on its scenegraph and
+ the contents of the X windows. Yet, it has
+ to go through the X server to render this.
+
+
+
+
+ The X server receives the rendering requests
+ from the compositor and either copies the
+ compositor back buffer to the front buffer
+ or does a pageflip. In the general case, the
+ X server has to do this step so it can
+ account for overlapping windows, which may
+ require clipping and determine whether or
+ not it can page flip. However, for a
+ compositor, which is always fullscreen, this
+ is another unnecessary context switch.
+
+
+
+
+
+ As suggested above, there are a few problems with this
+ approach. The X server doesn't have the information to
+ decide which window should receive the event, nor can it
+ transform the screen coordinates to window local
+ coordinates. And even though X has handed responsibility for
+ the final painting of the screen to the compositing manager,
+ X still controls the front buffer and modesetting. Most of
+ the complexity that the X server used to handle is now
+ available in the kernel or self contained libraries (KMS,
+ evdev, mesa, fontconfig, freetype, cairo, Qt etc). In
+ general, the X server is now just a middle man that
+ introduces an extra step between applications and the
+ compositor and an extra step between the compositor and the
+ hardware.
+
+
+ In wayland the compositor is the display server. We transfer
+ the control of KMS and evdev to the compositor. The wayland
+ protocol lets the compositor send the input events directly
+ to the clients and lets the client send the damage event
+ directly to the compositor:
+
+
+
+
+
+
+
+
+
+
+ The kernel gets an event and sends
+ it to the compositor. This
+ is similar to the X case, which is
+ great, since we get to reuse all the
+ input drivers in the kernel.
+
+
+
+
+ The compositor looks through its
+ scenegraph to determine which window
+ should receive the event. The
+ scenegraph corresponds to what's on
+ screen and the compositor
+ understands the transformations that
+ it may have applied to the elements
+ in the scenegraph. Thus, the
+ compositor can pick the right window
+ and transform the screen coordinates
+ to window local coordinates, by
+ applying the inverse
+ transformations. The types of
+ transformation that can be applied
+ to a window is only restricted to
+ what the compositor can do, as long
+ as it can compute the inverse
+ transformation for the input events.
+
+
+
+
+ As in the X case, when the client
+ receives the event, it updates the
+ UI in response. But in the wayland
+ case, the rendering happens in the
+ client, and the client just sends a
+ request to the compositor to
+ indicate the region that was
+ updated.
+
+
+
+
+ The compositor collects damage
+ requests from its clients and then
+ recomposites the screen. The
+ compositor can then directly issue
+ an ioctl to schedule a pageflip with
+ KMS.
+
+
+
+
+
+
+
+
+ Wayland Rendering
+
+ One of the details I left out in the above overview
+ is how clients actually render under wayland. By
+ removing the X server from the picture we also
+ removed the mechanism by which X clients typically
+ render. But there's another mechanism that we're
+ already using with DRI2 under X: direct rendering.
+ With direct rendering, the client and the server
+ share a video memory buffer. The client links to a
+ rendering library such as OpenGL that knows how to
+ program the hardware and renders directly into the
+ buffer. The compositor in turn can take the buffer
+ and use it as a texture when it composites the
+ desktop. After the initial setup, the client only
+ needs to tell the compositor which buffer to use and
+ when and where it has rendered new content into it.
+
+
+
+ This leaves an application with two ways to update its window contents:
+
+
+
+
+
+ Render the new content into a new buffer and tell the compositor
+ to use that instead of the old buffer. The application can
+ allocate a new buffer every time it needs to update the window
+ contents or it can keep two (or more) buffers around and cycle
+ between them. The buffer management is entirely under
+ application control.
+
+
+
+
+ Render the new content into the buffer that it previously
+ told the compositor to to use. While it's possible to just
+ render directly into the buffer shared with the compositor,
+ this might race with the compositor. What can happen is that
+ repainting the window contents could be interrupted by the
+ compositor repainting the desktop. If the application gets
+ interrupted just after clearing the window but before
+ rendering the contents, the compositor will texture from a
+ blank buffer. The result is that the application window will
+ flicker between a blank window or half-rendered content. The
+ traditional way to avoid this is to render the new content
+ into a back buffer and then copy from there into the
+ compositor surface. The back buffer can be allocated on the
+ fly and just big enough to hold the new content, or the
+ application can keep a buffer around. Again, this is under
+ application control.
+
+
+
+
+
+ In either case, the application must tell the compositor
+ which area of the surface holds new contents. When the
+ application renders directly the to shared buffer, the
+ compositor needs to be noticed that there is new content.
+ But also when exchanging buffers, the compositor doesn't
+ assume anything changed, and needs a request from the
+ application before it will repaint the desktop. The idea
+ that even if an application passes a new buffer to the
+ compositor, only a small part of the buffer may be
+ different, like a blinking cursor or a spinner.
+ Hardware Enabling for Wayland
+
+
+ Typically, hardware enabling includes modesetting/display
+ and EGL/GLES2. On top of that Wayland needs a way to share
+ buffers efficiently between processes. There are two sides
+ to that, the client side and the server side.
+
+
+ On the client side we've defined a Wayland EGL platform. In
+ the EGL model, that consists of the native types
+ (EGLNativeDisplayType, EGLNativeWindowType and
+ EGLNativePixmapType) and a way to create those types. In
+ other words, it's the glue code that binds the EGL stack and
+ its buffer sharing mechanism to the generic Wayland API. The
+ EGL stack is expected to provide an implementation of the
+ Wayland EGL platform. The full API is in the wayland-egl.h
+ header. The open source implementation in the mesa EGL stack
+ is in wayland-egl.c and platform_wayland.c.
+
+
+ Under the hood, the EGL stack is expected to define a
+ vendor-specific protocol extension that lets the client side
+ EGL stack communicate buffer details with the compositor in
+ order to share buffers. The point of the wayland-egl.h API
+ is to abstract that away and just let the client create an
+ EGLSurface for a Wayland surface and start rendering. The
+ open source stack uses the drm Wayland extension, which lets
+ the client discover the drm device to use and authenticate
+ and then share drm (GEM) buffers with the compositor.
+
+
+ The server side of Wayland is the compositor and core UX for
+ the vertical, typically integrating task switcher, app
+ launcher, lock screen in one monolithic application. The
+ server runs on top of a modesetting API (kernel modesetting,
+ OpenWF Display or similar) and composites the final UI using
+ a mix of EGL/GLES2 compositor and hardware overlays if
+ available. Enabling modesetting, EGL/GLES2 and overlays is
+ something that should be part of standard hardware bringup.
+ The extra requirement for Wayland enabling is the
+ EGL_WL_bind_wayland_display extension that lets the
+ compositor create an EGLImage from a generic Wayland shared
+ buffer. It's similar to the EGL_KHR_image_pixmap extension
+ to create an EGLImage from an X pixmap.
+
+
+ The extension has a setup step where you have to bind the
+ EGL display to a Wayland display. Then as the compositor
+ receives generic Wayland buffers from the clients (typically
+ when the client calls eglSwapBuffers), it will be able to
+ pass the struct wl_buffer pointer to eglCreateImageKHR as
+ the EGLClientBuffer argument and with EGL_WAYLAND_BUFFER_WL
+ as the target. This will create an EGLImage, which can then
+ be used by the compositor as a texture or passed to the
+ modesetting code to use as an overlay plane. Again, this is
+ implemented by the vendor specific protocol extension, which
+ on the server side will receive the driver specific details
+ about the shared buffer and turn that into an EGL image when
+ the user calls eglCreateImageKHR.
+
+
+
diff --git a/doc/Wayland/en-US/Author_Group.xml b/doc/Wayland/en-US/Author_Group.xml
new file mode 100644
index 00000000..7a707604
--- /dev/null
+++ b/doc/Wayland/en-US/Author_Group.xml
@@ -0,0 +1,16 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+ Kristian
+ Høgsberg
+
+ Intel Corporation
+
+ krh@bitplanet.net
+
+
+
diff --git a/doc/Wayland/en-US/Book_Info.xml b/doc/Wayland/en-US/Book_Info.xml
new file mode 100644
index 00000000..4b134eb0
--- /dev/null
+++ b/doc/Wayland/en-US/Book_Info.xml
@@ -0,0 +1,34 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+ Wayland
+ The Wayland display server
+ Documentation
+ 0.1
+ 0
+ 0
+
+
+ Wayland is a protocol for a compositor to talk to
+ its clients as well as a C library implementation of
+ that protocol. The compositor can be a standalone
+ display server running on Linux kernel modesetting
+ and evdev input devices, an X application, or a
+ wayland client itself. The clients can be
+ traditional applications, X servers (rootless or
+ fullscreen) or other display servers.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/Wayland/en-US/Chapter.xml b/doc/Wayland/en-US/Chapter.xml
new file mode 100644
index 00000000..f89f28b2
--- /dev/null
+++ b/doc/Wayland/en-US/Chapter.xml
@@ -0,0 +1,32 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+ Test Chapter
+
+ This is a test paragraph
+
+
+ Test Section 1
+
+ This is a test paragraph in a section
+
+
+
+
+ Test Section 2
+
+ This is a test paragraph in Section 2
+
+
+
+ listitem text
+
+
+
+
+
+
+
diff --git a/doc/Wayland/en-US/Preface.xml b/doc/Wayland/en-US/Preface.xml
new file mode 100644
index 00000000..610170af
--- /dev/null
+++ b/doc/Wayland/en-US/Preface.xml
@@ -0,0 +1,12 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+ Preface
+
+
+
+
+
diff --git a/doc/Wayland/en-US/Revision_History.xml b/doc/Wayland/en-US/Revision_History.xml
new file mode 100644
index 00000000..ef0907a5
--- /dev/null
+++ b/doc/Wayland/en-US/Revision_History.xml
@@ -0,0 +1,26 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+ Revision History
+
+
+
+ 0-0
+ Thu Feb 23 2012
+
+ Dude
+ McPants
+ Dude.McPants@example.com
+
+
+
+ Initial creation of book by publican
+
+
+
+
+
+
diff --git a/doc/Wayland/en-US/Wayland.ent b/doc/Wayland/en-US/Wayland.ent
new file mode 100644
index 00000000..da18a952
--- /dev/null
+++ b/doc/Wayland/en-US/Wayland.ent
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/doc/Wayland/en-US/Wayland.xml b/doc/Wayland/en-US/Wayland.xml
new file mode 100644
index 00000000..829d362d
--- /dev/null
+++ b/doc/Wayland/en-US/Wayland.xml
@@ -0,0 +1,19 @@
+
+
+%BOOK_ENTITIES;
+]>
+
+
+
+
+
+
+
+
+
diff --git a/doc/Wayland/en-US/images/icon.svg b/doc/Wayland/en-US/images/icon.svg
new file mode 100644
index 00000000..b2f16d0f
--- /dev/null
+++ b/doc/Wayland/en-US/images/icon.svg
@@ -0,0 +1,19 @@
+
+
diff --git a/doc/Wayland/en-US/images/wayland-architecture.png b/doc/Wayland/en-US/images/wayland-architecture.png
new file mode 100644
index 00000000..4f92e0fb
Binary files /dev/null and b/doc/Wayland/en-US/images/wayland-architecture.png differ
diff --git a/doc/Wayland/en-US/images/wayland.png b/doc/Wayland/en-US/images/wayland.png
new file mode 100644
index 00000000..c9937928
Binary files /dev/null and b/doc/Wayland/en-US/images/wayland.png differ
diff --git a/doc/Wayland/en-US/images/x-architecture.png b/doc/Wayland/en-US/images/x-architecture.png
new file mode 100644
index 00000000..098205b5
Binary files /dev/null and b/doc/Wayland/en-US/images/x-architecture.png differ
diff --git a/doc/Wayland/protocol-to-docbook.xsl b/doc/Wayland/protocol-to-docbook.xsl
new file mode 100644
index 00000000..e50d80d9
--- /dev/null
+++ b/doc/Wayland/protocol-to-docbook.xsl
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+%BOOK_ENTITIES;
+]>
+]]>
+
+
+ Wayland Protocol Specification
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ protocol--
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+ Requests provided by
+
+
+
+
+
+ Events provided by events
+
+
+
+
+
+ Enums provided by enums
+
+
+
+
+
+
+
+
+
+
+
+
+ Type:
+
+
+ Value:
+
+
+
+
+
+
+
+
+
+
+
+ protocol-interface---
+
+ ::
+
+ -
+
+
+
+
+
+ :: arguments
+
+
+
+
+
+ :: values
+
+
+
+
+
+
+
+
diff --git a/doc/Wayland/publican.cfg b/doc/Wayland/publican.cfg
new file mode 100644
index 00000000..810c7358
--- /dev/null
+++ b/doc/Wayland/publican.cfg
@@ -0,0 +1,8 @@
+# Config::Simple 4.59
+# Fri Feb 24 09:36:50 2012
+
+xml_lang: "en-US"
+type: Book
+brand: common
+tmp_dir: Wayland
+
diff --git a/protocol/Makefile.am b/protocol/Makefile.am
index 9c6cc49e..49395576 100644
--- a/protocol/Makefile.am
+++ b/protocol/Makefile.am
@@ -1,7 +1,8 @@
if HAVE_XSLTPROC
-doc_DATA = wayland.html wayland-protocol.css
+dist_doc_DATA = wayland.html wayland-protocol.css wayland.xml
-wayland.html: wayland.xml protocol.xsl
- $(AM_V_GEN)$(XSLTPROC) protocol.xsl wayland.xml > $@
+wayland.html: $(srcdir)/wayland.xml $(srcdir)/protocol.xsl
+ $(AM_V_GEN)$(XSLTPROC) $(srcdir)/protocol.xsl $(srcdir)/wayland.xml > $@
+CLEANFILES = wayland.html
endif