[yocto] [PATCH 2/6] meta-intel: add xserver-xf86-dri-lite_1.9.3 to common

Darren Hart dvhart at linux.intel.com
Wed Jun 1 13:21:40 PDT 2011


Hi Tom,

A quick glance suggests most of these patches need the upstream status
fields added to them.

http://wiki.yoctoproject.org/wiki/Best_Known_Methods_%28BKMs%29_for_Package_Updating#Patch_Comments

Per Saul's email to the poky list on 04/05/2011 "Patch Comments and
Upstream-Status"

--
Darren

On 06/01/2011 12:55 PM, tom.zanussi at intel.com wrote:
> From: Tom Zanussi <tom.zanussi at intel.com>
> 
> emgd 1.6 requires xserver 1.9.3, which is no longer in meta, and it
> needs to be shared by multiple BSPs, so add it to common.
> 
> Signed-off-by: Tom Zanussi <tom.zanussi at intel.com>
> ---
>  .../cache-xkbcomp-output-for-fast-start-up.patch   |  358 ++++++++++++++++++++
>  .../xserver-xf86-dri-lite/crosscompile.patch       |   20 ++
>  .../xserver-xf86-dri-lite/doublefix.patch          |   13 +
>  .../xserver-xf86-dri-lite/drmfix.patch             |   13 +
>  .../xserver-xf86-dri-lite/fix_macros.patch         |   21 ++
>  .../xserver-xf86-dri-lite/fix_macros1.patch        |   22 ++
>  .../fix_open_max_preprocessor_error.patch          |   13 +
>  .../libdri-xinerama-symbol.patch                   |   50 +++
>  .../xserver-xf86-dri-lite/macro_tweak.patch        |   28 ++
>  .../xserver-xf86-dri-lite/nodolt.patch             |   12 +
>  .../xorg-server-disable-dri_sarea.patch            |   12 +
>  .../xorg-server-enable-dri2.patch                  |   23 ++
>  .../xserver-1.5.0-bg-none-root.patch               |  156 +++++++++
>  .../xserver-DRI2Swapbuffer.patch                   |  179 ++++++++++
>  .../xserver-xf86-dri-lite/xserver-boottime.patch   |   38 ++
>  .../xserver-xf86-dri-lite/xserver-no-root-2.patch  |  105 ++++++
>  .../xorg-xserver/xserver-xf86-dri-lite_1.9.3.bb    |   19 +
>  17 files changed, 1082 insertions(+), 0 deletions(-)
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/cache-xkbcomp-output-for-fast-start-up.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/crosscompile.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/doublefix.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/drmfix.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros1.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_open_max_preprocessor_error.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/libdri-xinerama-symbol.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/macro_tweak.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/nodolt.patch
>  create mode 100755 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-disable-dri_sarea.patch
>  create mode 100755 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-enable-dri2.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-1.5.0-bg-none-root.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-DRI2Swapbuffer.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-boottime.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-no-root-2.patch
>  create mode 100644 common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite_1.9.3.bb
> 
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/cache-xkbcomp-output-for-fast-start-up.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/cache-xkbcomp-output-for-fast-start-up.patch
> new file mode 100644
> index 0000000..b121bba
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/cache-xkbcomp-output-for-fast-start-up.patch
> @@ -0,0 +1,358 @@
> +From 0f70ba9d3412b17ac4e08e33e1be3c226c06ea54 Mon Sep 17 00:00:00 2001
> +From: Yan Li <yan.i.li at intel.com>
> +Date: Tue, 12 May 2009 17:49:07 +0800
> +Subject: [PATCH] XKB: cache xkbcomp output for fast start-up v5 for 1.6.1
> +Organization: Intel
> +
> +xkbcomp outputs will be cached in files with hashed keymap as
> +names. This saves boot time for around 1s on commodity netbooks.
> +
> +Signed-off-by: Yan Li <yan.i.li at intel.com>
> +---
> + configure.ac        |    6 +-
> + xkb/README.compiled |    8 +-
> + xkb/ddxLoad.c       |  192 +++++++++++++++++++++++++++++++++++++++++---------
> + 3 files changed, 164 insertions(+), 42 deletions(-)
> +
> +diff --git a/configure.ac b/configure.ac
> +index 4c4c797..7a5020a 100644
> +--- a/configure.ac
> ++++ b/configure.ac
> +@@ -476,9 +476,9 @@ AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [
> + AC_ARG_WITH(xkb-path,         AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
> + 				[ XKBPATH="$withval" ],
> + 				[ XKBPATH="${datadir}/X11/xkb" ])
> +-AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
> ++AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]),
> + 				[ XKBOUTPUT="$withval" ],
> +-				[ XKBOUTPUT="compiled" ])
> ++				[ XKBOUTPUT="${localstatedir}/cache/xkb" ])
> + AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH],
> + 				   [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]),
> + 				[ SERVERCONFIG="$withval" ],
> +@@ -1757,7 +1757,7 @@ AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir])
> + XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
> + 
> + if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then
> +-   XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
> ++   AC_MSG_ERROR([xkb-output must be an absolute path.])
> + fi
> + 
> + # XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
> +diff --git a/xkb/README.compiled b/xkb/README.compiled
> +index 71caa2f..a4a2ae0 100644
> +--- a/xkb/README.compiled
> ++++ b/xkb/README.compiled
> +@@ -4,10 +4,10 @@ current keymap and/or any scratch keymaps used by clients.  The X server
> + or some other tool might destroy or replace the files in this directory,
> + so it is not a safe place to store compiled keymaps for long periods of
> + time.  The default keymap for any server is usually stored in:
> +-     X<num>-default.xkm
> +-where <num> is the display number of the server in question, which makes
> +-it possible for several servers *on the same host* to share the same 
> +-directory.
> ++     server-<SHA1>.xkm
> ++
> ++where <SHA1> is the SHA1 hash of keymap source, so that compiled
> ++keymap of different keymap sources are stored in different files.
> + 
> + Unless the X server is modified, sharing this directory between servers on
> + different hosts could cause problems.
> +diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
> +index 4d5dfb6..60a68af 100644
> +--- a/xkb/ddxLoad.c
> ++++ b/xkb/ddxLoad.c
> +@@ -32,6 +32,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + #include <xkb-config.h>
> + #endif
> + 
> ++#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
> ++# include <sha1.h>
> ++#else /* Use OpenSSL's libcrypto */
> ++# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
> ++# include <openssl/sha.h>
> ++#endif
> + #include <stdio.h>
> + #include <ctype.h>
> + #define	NEED_EVENTS 1
> +@@ -46,24 +52,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
> + #define	XKBSRV_NEED_FILE_FUNCS
> + #include <xkbsrv.h>
> + #include <X11/extensions/XI.h>
> ++#include <errno.h>
> + #include "xkb.h"
> + 
> + #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__)
> + #include <paths.h>
> + #endif
> + 
> +-	/*
> +-	 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
> +-	 * relative to the top-level XKB configuration directory.
> +-	 * Making the server write to a subdirectory of that directory
> +-	 * requires some work in the general case (install procedure
> +-	 * has to create links to /var or somesuch on many machines),
> +-	 * so we just compile into /usr/tmp for now.
> +-	 */
> +-#ifndef XKM_OUTPUT_DIR
> +-#define	XKM_OUTPUT_DIR	"compiled/"
> +-#endif
> +-
> + #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
> + #define	ERROR_PREFIX	"\"> \""
> + #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
> +@@ -179,6 +174,45 @@ OutputDirectory(
> + }
> + 
> + static Bool    	
> ++Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
> ++{
> ++    int i;
> ++    unsigned char sha1[SHA_DIGEST_LENGTH];
> ++
> ++#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
> ++    SHA1_CTX ctx;
> ++
> ++    SHA1Init (&ctx);
> ++    SHA1Update (&ctx, input, strlen(input));
> ++    SHA1Final (sha1, &ctx);
> ++#else /* Use OpenSSL's libcrypto */
> ++    SHA_CTX ctx;
> ++    int success;
> ++
> ++    success = SHA1_Init (&ctx);
> ++    if (! success)
> ++	return BadAlloc;
> ++
> ++    success = SHA1_Update (&ctx, input, strlen(input));
> ++    if (! success)
> ++	return BadAlloc;
> ++
> ++    success = SHA1_Final (sha1, &ctx);
> ++    if (! success)
> ++	return BadAlloc;
> ++#endif
> ++
> ++    /* convert sha1 to sha1_asc */
> ++    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
> ++        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
> ++    }
> ++
> ++    return Success;
> ++}
> ++
> ++/* call xkbcomp and compile XKB keymap, return xkm file name in
> ++   nameRtrn */
> ++static Bool
> + XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> + 				XkbComponentNamesPtr	names,
> + 				unsigned		want,
> +@@ -187,7 +221,11 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> + 				int			nameRtrnLen)
> + {
> +     FILE *	out;
> +-    char	*buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
> ++    char *	buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX];
> ++    char *	tmpXkmFile = NULL;
> ++    char *	canonicalXkmFileName = NULL;
> ++    char	sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024];
> ++    int	ret, result;
> + 
> +     const char	*emptystring = "";
> +     const char	*xkbbasedirflag = emptystring;
> +@@ -198,16 +236,70 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> +     /* WIN32 has no popen. The input must be stored in a file which is
> +        used as input for xkbcomp. xkbcomp does not read from stdin. */
> +     char tmpname[PATH_MAX];
> +-    const char *xkmfile = tmpname;
> ++    const char *xkbfile = tmpname;
> + #else
> +-    const char *xkmfile = "-";
> ++    const char *xkbfile = "-";
> + #endif
> + 
> +-    snprintf(keymap, sizeof(keymap), "server-%s", display);
> ++    /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf',
> ++       of which SHA1 is generated and used as result xkm file name  */
> ++    memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf));
> ++    out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w");
> ++    if (NULL == out) {
> ++        ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n");
> ++        return False;
> ++    }
> ++    ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need);
> ++    if (fclose(out) !=0)
> ++    {
> ++        ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n");
> ++        return False;
> ++    }
> ++#ifdef DEBUG
> ++    if (xkbDebugFlags) {
> ++       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
> ++       fputs(xkbKeyMapBuf, stderr);
> ++    }
> ++#endif
> ++    if (!ret) {
> ++        ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n");
> ++        return False;
> ++    }
> ++
> ++    DebugF("[xkb] computing SHA1 of keymap\n");
> ++    if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) {
> ++        snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc);
> ++    }
> ++    else {
> ++        ErrorF("[xkb] Computing SHA1 of keymap failed, "
> ++               "using display name instead as xkm file name\n");
> ++        snprintf(xkmfile, sizeof(xkmfile), "server-%s", display);
> ++    }
> + 
> +-    XkbEnsureSafeMapName(keymap);
> ++    XkbEnsureSafeMapName(xkmfile);
> +     OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
> + 
> ++    /* set nameRtrn, fail if it's too small */
> ++    if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) {
> ++        ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n");
> ++        return False;
> ++    }
> ++    strncpy(nameRtrn, xkmfile, nameRtrnLen);
> ++
> ++    /* if the xkm file already exists, reuse it */
> ++    canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile);
> ++    if (access(canonicalXkmFileName, R_OK) == 0) {
> ++        /* yes, we can reuse the old xkm file */
> ++        LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName);
> ++        result = True;
> ++        goto _ret;
> ++    }
> ++    LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName);
> ++
> ++    /* continue to call xkbcomp to compile the keymap. to avoid race
> ++       condition, we compile it to a tmpfile then rename it to
> ++       xkmfile */
> ++
> + #ifdef WIN32
> +     strcpy(tmpname, Win32TempDir());
> +     strcat(tmpname, "\\xkb_XXXXXX");
> +@@ -230,19 +322,30 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> + 	}
> +     }
> + 
> ++    if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) {
> ++        ErrorF("[xkb] Can't generate temp xkm file name");
> ++        result = False;
> ++        goto _ret;
> ++    }
> ++
> +     buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" "
> +-		  "-em1 %s -emp %s -eml %s \"%s%s.xkm\"",
> ++		  "-em1 %s -emp %s -eml %s \"%s\"",
> + 		  xkbbindir, xkbbindirsep,
> + 		  ( (xkbDebugFlags < 2) ? 1 :
> + 		    ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ),
> +-		  xkbbasedirflag, xkmfile,
> ++		  xkbbasedirflag, xkbfile,
> + 		  PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1,
> +-		  xkm_output_dir, keymap);
> ++		  tmpXkmFile);
> + 
> +     if (xkbbasedirflag != emptystring) {
> + 	xfree(xkbbasedirflag);
> +     }
> +     
> ++    /* there's a potential race condition between calling tempnam()
> ++       and invoking xkbcomp to write the result file (potential temp
> ++       file name conflicts), but since xkbcomp is a standalone
> ++       program, we have to live with this */
> ++
> + #ifndef WIN32
> +     out= Popen(buf,"w");
> + #else
> +@@ -250,31 +353,43 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> + #endif
> +     
> +     if (out!=NULL) {
> +-#ifdef DEBUG
> +-    if (xkbDebugFlags) {
> +-       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
> +-       XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need);
> ++        /* write XKBKeyMapBuf to xkbcomp */
> ++        if (EOF==fputs(xkbKeyMapBuf, out))
> ++        {
> ++            ErrorF("[xkb] Sending keymap to xkbcomp failed\n");
> ++            result = False;
> ++            goto _ret;
> +     }
> +-#endif
> +-	XkbWriteXKBKeymapForNames(out,names,xkb,want,need);
> + #ifndef WIN32
> + 	if (Pclose(out)==0)
> + #else
> + 	if (fclose(out)==0 && System(buf) >= 0)
> + #endif
> + 	{
> ++        /* xkbcomp success */
> +             if (xkbDebugFlags)
> +                 DebugF("[xkb] xkb executes: %s\n",buf);
> +-	    if (nameRtrn) {
> +-		strncpy(nameRtrn,keymap,nameRtrnLen);
> +-		nameRtrn[nameRtrnLen-1]= '\0';
> ++
> ++            /* if canonicalXkmFileName already exists now, we simply
> ++               overwrite it, this is OK */
> ++            ret = rename(tmpXkmFile, canonicalXkmFileName);
> ++            if (0 != ret) {
> ++                ErrorF("[xkb] Can't rename %s to %s, error: %s\n",
> ++                       tmpXkmFile, canonicalXkmFileName,
> ++                       strerror(errno));
> ++
> ++                /* in case of error, don't unlink tmpXkmFile, leave it
> ++                   for debugging */
> ++
> ++                result = False;
> ++                goto _ret;
> + 	    }
> +-            if (buf != NULL)
> +-                xfree (buf);
> +-	    return True;
> ++
> ++            result = True;
> ++            goto _ret;
> + 	}
> + 	else
> +-	    LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap);
> ++           LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile);
> + #ifdef WIN32
> +         /* remove the temporary file */
> +         unlink(tmpname);
> +@@ -289,9 +404,17 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
> +     }
> +     if (nameRtrn)
> + 	nameRtrn[0]= '\0';
> ++    result = False;
> ++
> ++_ret:
> ++    if (tmpXkmFile)
> ++        free(tmpXkmFile);
> ++    if (canonicalXkmFileName)
> ++        xfree(canonicalXkmFileName);
> +     if (buf != NULL)
> +         xfree (buf);
> +-    return False;
> ++
> ++    return result;
> + }
> + 
> + static FILE *
> +@@ -375,7 +498,6 @@ unsigned	missing;
> + 	DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
> +     }
> +     fclose(file);
> +-    (void) unlink (fileName);
> +     return (need|want)&(~missing);
> + }
> + 
> +-- 
> +1.5.6.5
> +
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/crosscompile.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/crosscompile.patch
> new file mode 100644
> index 0000000..8b82de2
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/crosscompile.patch
> @@ -0,0 +1,20 @@
> +diff --git a/configure.ac b/configure.ac
> +index b3b752c..600500b 100644
> +--- a/configure.ac
> ++++ b/configure.ac
> +@@ -523,13 +523,9 @@ dnl Uses --default-font-path if set, otherwise checks for /etc/X11/fontpath.d,
> + dnl otherwise uses standard subdirectories of FONTROOTDIR. When cross
> + dnl compiling, assume default font path uses standard FONTROOTDIR directories.
> + DEFAULT_FONT_PATH="${FONTMISCDIR}/,${FONTTTFDIR}/,${FONTOTFDIR}/,${FONTTYPE1DIR}/,${FONT100DPIDIR}/,${FONT75DPIDIR}/"
> +-if test "$cross_compiling" != yes; then
> +-	AC_CHECK_FILE([${sysconfdir}/X11/fontpath.d],
> +-		[DEFAULT_FONT_PATH='catalogue:${sysconfdir}/X11/fontpath.d'],
> +-		[case $host_os in
> ++		case $host_os in
> + 			darwin*) DEFAULT_FONT_PATH="${DEFAULT_FONT_PATH},/Library/Fonts,/System/Library/Fonts" ;;
> +-		esac])
> +-fi
> ++		esac
> + AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [Comma separated list of font dirs]),
> + 				[ FONTPATH="$withval" ],
> + 				[ FONTPATH="${DEFAULT_FONT_PATH}" ])
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/doublefix.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/doublefix.patch
> new file mode 100644
> index 0000000..092a712
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/doublefix.patch
> @@ -0,0 +1,13 @@
> +Index: xorg-server-1.6.0/hw/xfree86/common/Makefile.am
> +===================================================================
> +--- xorg-server-1.6.0.orig/hw/xfree86/common/Makefile.am	2010-02-01 14:04:53.247789918 +0000
> ++++ xorg-server-1.6.0/hw/xfree86/common/Makefile.am	2010-02-01 14:05:27.787817002 +0000
> +@@ -46,7 +46,7 @@
> + sdk_HEADERS = compiler.h fourcc.h xf86.h xf86Module.h xf86Opt.h \
> +               xf86PciInfo.h xf86Priv.h xf86Privstr.h xf86Resources.h \
> +               xf86cmap.h xf86fbman.h xf86str.h xf86RAC.h xf86Xinput.h xisb.h \
> +-              $(XVSDKINCS) xorgVersion.h \
> ++              xorgVersion.h \
> +               xf86sbusBus.h xf86xv.h xf86xvmc.h xf86xvpriv.h
> + 
> + DISTCLEANFILES = xf86Build.h
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/drmfix.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/drmfix.patch
> new file mode 100644
> index 0000000..a62a767
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/drmfix.patch
> @@ -0,0 +1,13 @@
> +Index: xorg-server-1.4/hw/xfree86/os-support/linux/Makefile.am
> +===================================================================
> +--- xorg-server-1.4.orig/hw/xfree86/os-support/linux/Makefile.am	2007-08-23 21:04:53.000000000 +0200
> ++++ xorg-server-1.4/hw/xfree86/os-support/linux/Makefile.am	2008-03-13 18:27:23.000000000 +0100
> +@@ -41,7 +41,7 @@
> + 
> + AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(DIX_CFLAGS) $(XORG_CFLAGS) $(PLATFORM_DEFINES)
> + 
> +-INCLUDES = $(XORG_INCS) $(PLATFORM_INCLUDES) -I/usr/include/drm # FIXME this last part is crack
> ++INCLUDES = $(XORG_INCS) $(PLATFORM_INCLUDES) $(LIBDRM_CFLAGS)
> + 
> + # FIXME: These need to be added to the build
> + LNX_EXTRA_SRCS = \
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros.patch
> new file mode 100644
> index 0000000..eed491b
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros.patch
> @@ -0,0 +1,21 @@
> +We need to insert the sysroot path into compiler commandlines for this
> +kind of variable use, otherwise we're looking into /usr/include/.
> +
> +RP - 26/11/09
> +
> +Index: git/xorg-server.m4
> +===================================================================
> +--- git.orig/xorg-server.m4	2009-11-10 12:04:34.000000000 +0000
> ++++ git/xorg-server.m4	2009-11-27 00:05:02.000000000 +0000
> +@@ -28,9 +28,10 @@
> + # Checks for the $1 define in xorg-server.h (from the sdk).  If it
> + # is defined, then add $1 to $REQUIRED_MODULES.
> + 
> ++m4_pattern_allow([^PKG_CONFIG_SYSROOT_DIR$])
> + AC_DEFUN([XORG_DRIVER_CHECK_EXT],[
> + 	SAVE_CFLAGS="$CFLAGS"
> +-	CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`"
> ++	CFLAGS="$CFLAGS -I$PKG_CONFIG_SYSROOT_DIR`pkg-config --variable=sdkdir xorg-server`"
> + 	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
> + #include "xorg-server.h"
> + #if !defined $1
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros1.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros1.patch
> new file mode 100644
> index 0000000..94852f0
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_macros1.patch
> @@ -0,0 +1,22 @@
> +We need to insert the sysroot path into compiler commandlines for this
> +kind of variable use, otherwise we're looking into /usr/include/.
> +
> +RP - 26/11/09
> +
> +Index: git/xorg-server.m4
> +===================================================================
> +--- git.orig/xorg-server.m4	2010-02-05 10:00:55.000000000 +0000
> ++++ git/xorg-server.m4	2010-02-05 10:02:12.000000000 +0000
> +@@ -28,10 +28,11 @@
> + # Checks for the $1 define in xorg-server.h (from the sdk).  If it
> + # is defined, then add $1 to $REQUIRED_MODULES.
> + 
> ++m4_pattern_allow([^PKG_CONFIG_SYSROOT_DIR$])
> + AC_DEFUN([XORG_DRIVER_CHECK_EXT],[
> + 	AC_REQUIRE([PKG_PROG_PKG_CONFIG])
> + 	SAVE_CFLAGS="$CFLAGS"
> +-	CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`"
> ++	CFLAGS="$CFLAGS -I$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=sdkdir xorg-server`"
> + 	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
> + #include "xorg-server.h"
> + #if !defined $1
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_open_max_preprocessor_error.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_open_max_preprocessor_error.patch
> new file mode 100644
> index 0000000..565832e
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/fix_open_max_preprocessor_error.patch
> @@ -0,0 +1,13 @@
> +Index: git/os/osdep.h
> +===================================================================
> +--- git.orig/os/osdep.h	2008-10-07 18:38:21.000000000 +0100
> ++++ git/os/osdep.h	2008-10-07 18:39:36.000000000 +0100
> +@@ -92,7 +92,7 @@
> +  * like sysconf(_SC_OPEN_MAX) is not supported.
> +  */
> + 
> +-#if OPEN_MAX <= 256
> ++#if 0
> + #define MAXSOCKS (OPEN_MAX - 1)
> + #else
> + #define MAXSOCKS 256
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/libdri-xinerama-symbol.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/libdri-xinerama-symbol.patch
> new file mode 100644
> index 0000000..db29da9
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/libdri-xinerama-symbol.patch
> @@ -0,0 +1,50 @@
> +Index: xorg-server-1.5.0/hw/xfree86/dri/dri.c
> +===================================================================
> +--- xorg-server-1.5.0.orig/hw/xfree86/dri/dri.c	2008-09-24 17:43:04.000000000 +0100
> ++++ xorg-server-1.5.0/hw/xfree86/dri/dri.c	2008-09-24 17:46:38.000000000 +0100
> +@@ -73,10 +73,6 @@
> + 
> + #define PCI_BUS_NO_DOMAIN(bus) ((bus) & 0xffu)
> + 
> +-#if !defined(PANORAMIX)
> +-extern Bool noPanoramiXExtension;
> +-#endif
> +-
> + static int DRIEntPrivIndex = -1;
> + static DevPrivateKey DRIScreenPrivKey = &DRIScreenPrivKey;
> + static DevPrivateKey DRIWindowPrivKey = &DRIWindowPrivKey;
> +@@ -307,7 +303,6 @@
> +     drm_context_t *       reserved;
> +     int                 reserved_count;
> +     int                 i;
> +-    Bool                xineramaInCore = FALSE;
> +     DRIEntPrivPtr       pDRIEntPriv;
> +     ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
> +     DRIContextFlags	flags    = 0;
> +@@ -320,20 +315,13 @@
> + 	return FALSE;
> +     }
> + 
> +-    /*
> +-     * If Xinerama is on, don't allow DRI to initialise.  It won't be usable
> +-     * anyway.
> +-     */
> +-    if (xf86LoaderCheckSymbol("noPanoramiXExtension"))
> +-	xineramaInCore = TRUE;
> +-
> +-    if (xineramaInCore) {
> +-	if (!noPanoramiXExtension) {
> +-	    DRIDrvMsg(pScreen->myNum, X_WARNING,
> +-		"Direct rendering is not supported when Xinerama is enabled\n");
> +-	    return FALSE;
> +-	}
> ++#if defined(PANORAMIX)
> ++    if (!noPanoramiXExtension) {
> ++        DRIDrvMsg(pScreen->myNum, X_WARNING,
> ++            "Direct rendering is not supported when Xinerama is enabled\n");
> ++        return FALSE;
> +     }
> ++#endif
> + 
> +     if (!DRIOpenDRMMaster(pScrn, pDRIInfo->SAREASize,
> + 			  pDRIInfo->busIdString,
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/macro_tweak.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/macro_tweak.patch
> new file mode 100644
> index 0000000..cd408c7
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/macro_tweak.patch
> @@ -0,0 +1,28 @@
> +This is the revised version of files/macro_tweak.patch for
> +xorg-server 1.8.99.904.
> +
> +the files/macro_tweak.patch can not removed now since it is used by
> +xserver-kdrive-1.7.99.2 and xserver-xf86-lite_1.7.99.2. Once they
> +are all upgraded to 1.8.99.904, the the files/macro_tweak.patch
> +can be safely replace by this patch.
> +
> +Signed-off-by: Yu Ke <ke.yu at intel.com>
> +
> +diff --git a/xorg-server.m4 b/xorg-server.m4
> +index bdecf62..040fdb8 100644
> +--- a/xorg-server.m4
> ++++ b/xorg-server.m4
> +@@ -28,10 +28,12 @@ dnl
> + # Checks for the $1 define in xorg-server.h (from the sdk).  If it
> + # is defined, then add $1 to $REQUIRED_MODULES.
> + 
> ++m4_pattern_allow(PKG_CONFIG_SYSROOT_DIR)
> ++
> + AC_DEFUN([XORG_DRIVER_CHECK_EXT],[
> + 	AC_REQUIRE([PKG_PROG_PKG_CONFIG])
> + 	SAVE_CFLAGS="$CFLAGS"
> +-	CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`"
> ++	CFLAGS="$CFLAGS -I$PKG_CONFIG_SYSROOT_DIR`$PKG_CONFIG --variable=sdkdir xorg-server`"
> + 	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
> + #include "xorg-server.h"
> + #if !defined $1
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/nodolt.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/nodolt.patch
> new file mode 100644
> index 0000000..6b34032
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/nodolt.patch
> @@ -0,0 +1,12 @@
> +Index: git/configure.ac
> +===================================================================
> +--- git.orig/configure.ac	2009-01-15 20:35:31.000000000 +0000
> ++++ git/configure.ac	2009-01-15 20:35:38.000000000 +0000
> +@@ -62,7 +62,6 @@
> + AC_LIBTOOL_WIN32_DLL
> + AC_DISABLE_STATIC
> + AC_PROG_LIBTOOL
> +-DOLT
> + AC_PROG_MAKE_SET
> + PKG_PROG_PKG_CONFIG
> + AC_PROG_LEX
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-disable-dri_sarea.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-disable-dri_sarea.patch
> new file mode 100755
> index 0000000..3d2fa16
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-disable-dri_sarea.patch
> @@ -0,0 +1,12 @@
> +diff -urN xorg-server-1.5.99.1/hw/xfree86/dri2/dri2.c xorg-server-1.5.99.1.new/hw/xfree86/dri2/dri2.c
> +--- xorg-server-1.5.99.1/hw/xfree86/dri2/dri2.c	2008-09-01 03:26:37.000000000 +0800
> ++++ xorg-server-1.5.99.1.new/hw/xfree86/dri2/dri2.c	2008-09-18 00:28:16.000000000 +0800
> +@@ -39,7 +39,7 @@
> + #include "scrnintstr.h"
> + #include "windowstr.h"
> + #include "dri2.h"
> +-#include <GL/internal/dri_sarea.h>
> ++//#include <GL/internal/dri_sarea.h>
> + 
> + #include "xf86.h"
> + 
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-enable-dri2.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-enable-dri2.patch
> new file mode 100755
> index 0000000..7ff3658
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xorg-server-enable-dri2.patch
> @@ -0,0 +1,23 @@
> +commit 67b9b3a77a8b86eef03af36a0f4be3a07411efee
> +Author: Eric Anholt <eric at anholt.net>
> +Date:   Thu Sep 11 16:18:17 2008 -0700
> +
> +    Enable DRI2 build.
> +
> +diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
> +index eff2c31..98d7ec8 100644
> +--- a/hw/xfree86/Makefile.am
> ++++ b/hw/xfree86/Makefile.am
> +@@ -4,9 +4,9 @@ if DRI
> + DRI_SUBDIR = dri
> + endif
> + 
> +-#if DRI2
> +-#DRI2_SUBDIR = dri2
> +-#endif
> ++if DRI2
> ++DRI2_SUBDIR = dri2
> ++endif
> + 
> + if XF86UTILS
> + XF86UTILS_SUBDIR = utils
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-1.5.0-bg-none-root.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-1.5.0-bg-none-root.patch
> new file mode 100644
> index 0000000..ef53689
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-1.5.0-bg-none-root.patch
> @@ -0,0 +1,156 @@
> +From a3e15680da24cb8259f6a83dee0c930dab024290 Mon Sep 17 00:00:00 2001
> +From: Kristian <krh at redhat.com>
> +Date: Fri, 15 Aug 2008 15:15:14 +1000
> +Subject: [PATCH] Add nr for background=none root
> +
> +---
> + dix/globals.c                |    1 +
> + dix/window.c                 |   22 ++++++++++++----------
> + hw/xfree86/common/xf86Init.c |   11 +++++++++++
> + hw/xfree86/common/xf86str.h  |    5 ++++-
> + include/opaque.h             |    1 +
> + os/utils.c                   |    3 +++
> + 6 files changed, 32 insertions(+), 11 deletions(-)
> +
> +diff --git a/dix/globals.c b/dix/globals.c
> +index 973dc43..dbd76bb 100644
> +--- a/dix/globals.c
> ++++ b/dix/globals.c
> +@@ -141,6 +141,7 @@ FontPtr defaultFont;   /* not declared in dix.h to avoid including font.h in
> + CursorPtr rootCursor;
> + Bool party_like_its_1989 = FALSE;
> + Bool whiteRoot = FALSE;
> ++Bool bgNoneRoot = FALSE;
> + 
> + int cursorScreenDevPriv[MAXSCREENS];
> + 
> +diff --git a/dix/window.c b/dix/window.c
> +index c31fa87..8bb178d 100644
> +--- a/dix/window.c
> ++++ b/dix/window.c
> +@@ -482,23 +482,24 @@ InitRootWindow(WindowPtr pWin)
> +     pWin->cursorIsNone = FALSE;
> +     pWin->optional->cursor = rootCursor;
> +     rootCursor->refcnt++;
> +-
> ++    pWin->backingStore = defaultBackingStore;
> ++    pWin->forcedBS = (defaultBackingStore != NotUseful);
> + 
> +     if (party_like_its_1989) {
> +         MakeRootTile(pWin);
> +         backFlag |= CWBackPixmap;
> ++        pScreen->ChangeWindowAttributes(pWin, backFlag);
> ++    } else if (bgNoneRoot) {
> ++	/* nothing, handled in xf86CreateRootWindow */
> +     } else {
> + 	if (whiteRoot)
> +             pWin->background.pixel = pScreen->whitePixel;
> +         else
> +             pWin->background.pixel = pScreen->blackPixel;
> +         backFlag |= CWBackPixel;
> +-    } 
> + 
> +-    pWin->backingStore = defaultBackingStore;
> +-    pWin->forcedBS = (defaultBackingStore != NotUseful);
> +-    /* We SHOULD check for an error value here XXX */
> +-    (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
> ++        pScreen->ChangeWindowAttributes(pWin, backFlag);
> ++    }
> + 
> +     MapWindow(pWin, serverClient);
> + }
> +diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
> +index 236c00b..083a6ac 100644
> +--- a/hw/xfree86/common/xf86Init.c
> ++++ b/hw/xfree86/common/xf86Init.c
> +@@ -79,6 +79,7 @@
> + #ifdef RENDER
> + #include "picturestr.h"
> + #endif
> ++#include "xace.h"
> + 
> + #include "globals.h"
> + 
> +@@ -328,6 +329,7 @@ xf86CreateRootWindow(WindowPtr pWin)
> +   int ret = TRUE;
> +   int err = Success;
> +   ScreenPtr pScreen = pWin->drawable.pScreen;
> ++  ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
> +   RootWinPropPtr pProp;
> +   CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr)
> +       dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey);
> +@@ -381,6 +383,15 @@ xf86CreateRootWindow(WindowPtr pWin)
> +     }
> +   }
> + 
> ++  if (bgNoneRoot && pScrn->canDoBGNoneRoot || 1) {
> ++      pWin->backgroundState = XaceBackgroundNoneState(pWin);
> ++      pWin->background.pixel = pScreen->whitePixel;
> ++      pScreen->ChangeWindowAttributes(pWin, CWBackPixmap | CWBorderPixel | CWCursor | CWBackingStore);
> ++  } else {
> ++      pWin->background.pixel = pScreen->blackPixel;
> ++      pScreen->ChangeWindowAttributes(pWin, CWBackPixel | CWBorderPixel | CWCursor | CWBackingStore);
> ++  }
> ++
> + #ifdef DEBUG
> +   ErrorF("xf86CreateRootWindow() returns %d\n", ret);
> + #endif
> +diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
> +index 904c369..8c38f69 100644
> +--- a/hw/xfree86/common/xf86str.h
> ++++ b/hw/xfree86/common/xf86str.h
> +@@ -531,7 +531,7 @@ typedef struct _confdrirec {
> + } confDRIRec, *confDRIPtr;
> + 
> + /* These values should be adjusted when new fields are added to ScrnInfoRec */
> +-#define NUM_RESERVED_INTS		16
> ++#define NUM_RESERVED_INTS		15
> + #define NUM_RESERVED_POINTERS		15
> + #define NUM_RESERVED_FUNCS		11
> + 
> +@@ -959,6 +959,9 @@ typedef struct _ScrnInfoRec {
> +     ClockRangesPtr	clockRanges;
> +     int			adjustFlags;
> + 
> ++    /* -nr support */
> ++    int			canDoBGNoneRoot;
> ++
> +     /*
> +      * These can be used when the minor ABI version is incremented.
> +      * The NUM_* parameters must be reduced appropriately to keep the
> +diff --git a/include/opaque.h b/include/opaque.h
> +index 07a0715..be1577b 100644
> +--- a/include/opaque.h
> ++++ b/include/opaque.h
> +@@ -71,6 +71,7 @@ extern Bool defeatAccessControl;
> + extern long maxBigRequestSize;
> + extern Bool party_like_its_1989;
> + extern Bool whiteRoot;
> ++extern Bool bgNoneRoot;
> + 
> + extern Bool CoreDump;
> + 
> +diff --git a/os/utils.c b/os/utils.c
> +index b100949..c41b45b 100644
> +--- a/os/utils.c
> ++++ b/os/utils.c
> +@@ -515,6 +515,7 @@ void UseMsg(void)
> + #endif
> +     ErrorF("-nolisten string       don't listen on protocol\n");
> +     ErrorF("-noreset               don't reset after last client exists\n");
> ++    ErrorF("-nr                    create root window with no background\n");
> +     ErrorF("-reset                 reset after last client exists\n");
> +     ErrorF("-p #                   screen-saver pattern duration (minutes)\n");
> +     ErrorF("-pn                    accept failure to listen on all ports\n");
> +@@ -859,6 +860,8 @@ ProcessCommandLine(int argc, char *argv[])
> + 	    defaultBackingStore = WhenMapped;
> +         else if ( strcmp( argv[i], "-wr") == 0)
> +             whiteRoot = TRUE;
> ++        else if ( strcmp( argv[i], "-nr") == 0)
> ++            bgNoneRoot = TRUE;
> +         else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
> +              if(++i < argc) {
> +                  long reqSizeArg = atol(argv[i]);
> +-- 
> +1.5.3.4
> +
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-DRI2Swapbuffer.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-DRI2Swapbuffer.patch
> new file mode 100644
> index 0000000..2754170
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-DRI2Swapbuffer.patch
> @@ -0,0 +1,179 @@
> +diff --git a/glx/glxdri2.c b/glx/glxdri2.c
> +index 146ea82..3b5338b 100644
> +--- a/glx/glxdri2.c
> ++++ b/glx/glxdri2.c
> +@@ -70,6 +70,7 @@ struct __GLXDRIscreen {
> + 
> +     const __DRIcoreExtension *core;
> +     const __DRIdri2Extension *dri2;
> ++    const __DRI2flushExtension *flush;	
> +     const __DRIcopySubBufferExtension *copySubBuffer;
> +     const __DRIswapControlExtension *swapControl;
> +     const __DRItexBufferExtension *texBuffer;
> +@@ -135,10 +136,14 @@ __glXDRIdrawableCopySubBuffer(__GLXdrawable *drawable,
> + static GLboolean
> + __glXDRIdrawableSwapBuffers(__GLXdrawable *drawable)
> + {
> +-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
> ++    __GLXDRIdrawable *priv = (__GLXDRIdrawable *) drawable;
> ++    __GLXDRIscreen *screen = priv->screen;
> ++
> ++    if (!DRI2SwapBuffers(drawable->pDraw))
> ++		return FALSE;
> + 
> +-    __glXDRIdrawableCopySubBuffer(drawable, 0, 0,
> +-				  private->width, private->height);
> ++    if (screen->flush->flushInvalidate)
> ++	(*screen->flush->flushInvalidate)(priv->driDrawable);
> + 
> +     return TRUE;
> + }
> +diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
> +index 580383d..23e6467 100644
> +--- a/hw/xfree86/dri2/dri2.c
> ++++ b/hw/xfree86/dri2/dri2.c
> +@@ -70,6 +70,7 @@ typedef struct _DRI2Screen {
> +     DRI2CreateBufferProcPtr	 CreateBuffer;
> +     DRI2DestroyBufferProcPtr	 DestroyBuffer;
> +     DRI2CopyRegionProcPtr	 CopyRegion;
> ++    DRI2SwapBuffersProcPtr	 SwapBuffers;	
> + 
> +     HandleExposuresProcPtr       HandleExposures;
> + } DRI2ScreenRec, *DRI2ScreenPtr;
> +@@ -422,6 +423,49 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
> +     return Success;
> + }
> + 
> ++Bool
> ++DRI2SwapBuffers(DrawablePtr pDraw)
> ++{
> ++    DRI2ScreenPtr   ds = DRI2GetScreen(pDraw->pScreen);
> ++    DRI2DrawablePtr pPriv;
> ++    DRI2BufferPtr   pDestBuffer, pSrcBuffer;
> ++    int		    i;
> ++
> ++    pPriv = DRI2GetDrawable(pDraw);
> ++    if (pPriv == NULL)
> ++	return FALSE;
> ++
> ++    pDestBuffer = NULL;
> ++    pSrcBuffer = NULL;
> ++    for (i = 0; i < pPriv->bufferCount; i++)
> ++    {
> ++	if (pPriv->buffers[i]->attachment == DRI2BufferFrontLeft)
> ++	    pDestBuffer = (DRI2BufferPtr) pPriv->buffers[i];
> ++	if (pPriv->buffers[i]->attachment == DRI2BufferBackLeft)
> ++	    pSrcBuffer = (DRI2BufferPtr) pPriv->buffers[i];
> ++    }
> ++    if (pSrcBuffer == NULL || pDestBuffer == NULL)
> ++	return FALSE;
> ++
> ++    if (ds->SwapBuffers) {
> ++	if ((*ds->SwapBuffers)(pDraw, pDestBuffer, pSrcBuffer))
> ++	    return TRUE;
> ++    }
> ++
> ++    BoxRec box;
> ++    RegionRec region;
> ++
> ++    box.x1 = 0;
> ++    box.y1 = 0;
> ++    box.x2 = pDraw->width;
> ++    box.y2 = pDraw->height;
> ++    REGION_INIT(drawable->pDraw->pScreen, &region, &box, 0);
> ++    if (DRI2CopyRegion(pDraw, &region, DRI2BufferFrontLeft, DRI2BufferBackLeft) != Success)
> ++	return FALSE;
> ++
> ++    return TRUE;
> ++}
> ++
> + void
> + DRI2DestroyDrawable(DrawablePtr pDraw)
> + {
> +@@ -538,6 +582,9 @@ DRI2ScreenInit(ScreenPtr pScreen, DRI2InfoPtr info)
> +     }
> +     ds->CopyRegion     = info->CopyRegion;
> + 
> ++    if (info->version >= 3)
> ++	ds->SwapBuffers    = info->SwapBuffers;
> ++
> +     dixSetPrivate(&pScreen->devPrivates, dri2ScreenPrivateKey, ds);
> + 
> +     xf86DrvMsg(pScreen->myNum, X_INFO, "[DRI2] Setup complete\n");
> +diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
> +index f369267..e2784dd 100644
> +--- a/hw/xfree86/dri2/dri2.h
> ++++ b/hw/xfree86/dri2/dri2.h
> +@@ -67,6 +67,10 @@ typedef void		(*DRI2CopyRegionProcPtr)(DrawablePtr pDraw,
> + 						 DRI2BufferPtr pDestBuffer,
> + 						 DRI2BufferPtr pSrcBuffer);
> + 
> ++typedef Bool		(*DRI2SwapBuffersProcPtr)(DrawablePtr pDraw,
> ++						  DRI2BufferPtr pFrontBuffer,
> ++						  DRI2BufferPtr pBackBuffer);
> ++
> + typedef void		(*DRI2WaitProcPtr)(WindowPtr pWin,
> + 					   unsigned int sequence);
> + 
> +@@ -90,6 +94,7 @@ typedef struct {
> +     DRI2CreateBuffersProcPtr	CreateBuffers;
> +     DRI2DestroyBuffersProcPtr	DestroyBuffers;
> +     DRI2CopyRegionProcPtr	CopyRegion;
> ++    DRI2SwapBuffersProcPtr	SwapBuffers;	
> +     DRI2WaitProcPtr		Wait;
> + 
> +     /**
> +@@ -153,4 +158,6 @@ extern _X_EXPORT DRI2Buffer2Ptr *DRI2GetBuffersWithFormat(DrawablePtr pDraw,
> + 	int *width, int *height, unsigned int *attachments, int count,
> + 	int *out_count);
> + 
> ++extern _X_EXPORT Bool DRI2SwapBuffers(DrawablePtr pDraw);
> ++
> + #endif
> +diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
> +index 3c06174..67b419b 100644
> +--- a/hw/xfree86/dri2/dri2ext.c
> ++++ b/hw/xfree86/dri2/dri2ext.c
> +@@ -81,7 +81,7 @@ ProcDRI2QueryVersion(ClientPtr client)
> +     rep.length = 0;
> +     rep.sequenceNumber = client->sequence;
> +     rep.majorVersion = 1;
> +-    rep.minorVersion = 1;
> ++    rep.minorVersion = 2;
> + 
> +     if (client->swapped) {
> +     	swaps(&rep.sequenceNumber, n);
> +@@ -323,6 +323,24 @@ ProcDRI2CopyRegion(ClientPtr client)
> + }
> + 
> + static int
> ++ProcDRI2SwapBuffers(ClientPtr client)
> ++{
> ++    REQUEST(xDRI2SwapBuffersReq);
> ++    DrawablePtr pDrawable;
> ++    int status;
> ++
> ++    REQUEST_SIZE_MATCH(xDRI2SwapBuffersReq);
> ++
> ++    if (!validDrawable(client, stuff->drawable, &pDrawable, &status))
> ++	return status;
> ++
> ++    if (!DRI2SwapBuffers(pDrawable))
> ++	return BadAlloc;
> ++
> ++    return client->noClientException;
> ++}
> ++
> ++static int
> + ProcDRI2Dispatch (ClientPtr client)
> + {
> +     REQUEST(xReq);
> +@@ -350,6 +368,8 @@ ProcDRI2Dispatch (ClientPtr client)
> + 	return ProcDRI2CopyRegion(client);
> +     case X_DRI2GetBuffersWithFormat:
> + 	return ProcDRI2GetBuffersWithFormat(client);
> ++    case X_DRI2SwapBuffers:
> ++	return ProcDRI2SwapBuffers(client);	
> +     default:
> + 	return BadRequest;
> +     }
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-boottime.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-boottime.patch
> new file mode 100644
> index 0000000..efc85a4
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-boottime.patch
> @@ -0,0 +1,38 @@
> +diff --git a/os/log.c b/os/log.c
> +index 0860847..2c46f1a 100644
> +--- a/os/log.c
> ++++ b/os/log.c
> +@@ -255,6 +255,33 @@ LogVWrite(int verb, const char *f, va_list args)
> +     static char tmpBuffer[1024];
> +     int len = 0;
> + 
> ++    struct timeval time;
> ++    time_t tv_sec;
> ++    suseconds_t tv_usec;
> ++    static Bool first = TRUE;
> ++    static time_t start_tv_sec;
> ++    static suseconds_t start_usec;
> ++    int diff_sec, diff_usec;
> ++
> ++    gettimeofday(&time, NULL);
> ++    tv_sec = time.tv_sec;
> ++    tv_usec = time.tv_usec;
> ++    if (first == TRUE) {
> ++        start_tv_sec = tv_sec;
> ++        start_usec = tv_usec;
> ++        first = FALSE;
> ++    }
> ++    diff_sec = (int)difftime(tv_sec, start_tv_sec);
> ++    diff_usec = (tv_usec - start_usec);
> ++    if (diff_usec < 0) {
> ++        diff_sec--;
> ++        diff_usec += 1000000;
> ++    }
> ++    sprintf(tmpBuffer, "[%d sec: %06d usec]", diff_sec , diff_usec);
> ++    len = strlen(tmpBuffer);
> ++    if (logFile)
> ++          fwrite(tmpBuffer, len, 1, logFile);
> ++
> +     /*
> +      * Since a va_list can only be processed once, write the string to a
> +      * buffer, and then write the buffer out to the appropriate output
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-no-root-2.patch b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-no-root-2.patch
> new file mode 100644
> index 0000000..afc94dc
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite/xserver-no-root-2.patch
> @@ -0,0 +1,105 @@
> +diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c
> +index 7f40857..cf58c01 100644
> +--- a/hw/xfree86/os-support/linux/lnx_init.c
> ++++ b/hw/xfree86/os-support/linux/lnx_init.c
> +@@ -49,6 +49,7 @@ static Bool KeepTty = FALSE;
> + static int VTnum = -1;
> + static Bool VTSwitch = TRUE;
> + static Bool ShareVTs = FALSE;
> ++Bool NoHwAccess = FALSE;
> + static int activeVT = -1;
> + 
> + static int vtPermSave[4];
> +@@ -80,9 +81,11 @@ saveVtPerms(void)
> + static void
> + restoreVtPerms(void)
> + {
> +-    /* Set the terminal permissions back to before we started. */
> +-    chown("/dev/tty0", vtPermSave[0], vtPermSave[1]);
> +-    chown(vtname, vtPermSave[2], vtPermSave[3]);
> ++    if (geteuid() == 0) {
> ++	 /* Set the terminal permissions back to before we started. */
> ++	 (void)chown("/dev/tty0", vtPermSave[0], vtPermSave[1]);
> ++	 (void)chown(vtname, vtPermSave[2], vtPermSave[3]);
> ++    }
> + }
> + 
> + static void *console_handler;
> +@@ -210,20 +213,22 @@ xf86OpenConsole(void)
> + 	        xf86Msg(X_WARNING,
> + 		        "xf86OpenConsole: Could not save ownership of VT\n");
> + 
> +-	    /* change ownership of the vt */
> +-	    if (chown(vtname, getuid(), getgid()) < 0)
> +-	        xf86Msg(X_WARNING,"xf86OpenConsole: chown %s failed: %s\n",
> +-		        vtname, strerror(errno));
> +-
> +-	    /*
> +-	     * the current VT device we're running on is not "console", we want
> +-	     * to grab all consoles too
> +-	     *
> +-	     * Why is this needed??
> +-	     */
> +-	    if (chown("/dev/tty0", getuid(), getgid()) < 0)
> +-	        xf86Msg(X_WARNING,"xf86OpenConsole: chown /dev/tty0 failed: %s\n",
> +-                    strerror(errno));
> ++	    if (geteuid() == 0) {
> ++		    /* change ownership of the vt */
> ++		    if (chown(vtname, getuid(), getgid()) < 0)
> ++			    xf86Msg(X_WARNING,"xf86OpenConsole: chown %s failed: %s\n",
> ++				    vtname, strerror(errno));
> ++
> ++		    /*
> ++		     * the current VT device we're running on is not
> ++		     * "console", we want to grab all consoles too
> ++		     *
> ++		     * Why is this needed??
> ++		     */
> ++		    if (chown("/dev/tty0", getuid(), getgid()) < 0)
> ++			    xf86Msg(X_WARNING,"xf86OpenConsole: chown /dev/tty0 failed: %s\n",
> ++				    strerror(errno));
> ++	    }
> +         }
> + 
> + 	/*
> +@@ -433,6 +438,11 @@ xf86ProcessArgument(int argc, char *argv[], int i)
> +                 ShareVTs = TRUE;
> +                 return(1);
> +         }
> ++	if (!strcmp(argv[i], "-nohwaccess"))
> ++	{
> ++		NoHwAccess = TRUE;
> ++		return(1);
> ++	}
> + 	if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
> + 	{
> + 		if (sscanf(argv[i], "vt%2d", &VTnum) == 0)
> +@@ -454,5 +464,6 @@ xf86UseMsg()
> + 	ErrorF("don't detach controlling tty (for debugging only)\n");
> +         ErrorF("-novtswitch            don't immediately switch to new VT\n");
> +         ErrorF("-sharevts              share VTs with another X server\n");
> ++	ErrorF("-nohwaccess            don't access hardware ports directly\n");
> + 	return;
> + }
> +diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
> +index 688106a..34a845b 100644
> +--- a/hw/xfree86/os-support/linux/lnx_video.c
> ++++ b/hw/xfree86/os-support/linux/lnx_video.c
> +@@ -51,6 +51,7 @@
> + #define MAP_FAILED ((void *)-1)
> + #endif
> + 
> ++extern Bool NoHwAccess;
> + static Bool ExtendedEnabled = FALSE;
> + 
> + #ifdef __ia64__
> +@@ -509,6 +510,9 @@ xf86EnableIO(void)
> + 	int fd;
> + 	unsigned int ioBase_phys;
> + #endif
> ++	/* Fake it... */
> ++	if (NoHwAccess)
> ++		return TRUE;
> + 
> + 	if (ExtendedEnabled)
> + 		return TRUE;
> diff --git a/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite_1.9.3.bb b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite_1.9.3.bb
> new file mode 100644
> index 0000000..81d70bc
> --- /dev/null
> +++ b/common/recipes-graphics/xorg-xserver/xserver-xf86-dri-lite_1.9.3.bb
> @@ -0,0 +1,19 @@
> +require recipes-graphics/xorg-xserver/xserver-xf86-dri-lite.inc
> +
> +PROTO_DEPS += "xf86driproto dri2proto"
> +
> +DEPENDS += "font-util"
> +
> +PE = "1"
> +PR = "r0"
> +
> +SRC_URI += "file://nodolt.patch \
> +            file://crosscompile.patch"
> +
> +# Misc build failure for master HEAD
> +SRC_URI += "file://fix_open_max_preprocessor_error.patch"
> +
> +SRC_URI[md5sum] = "5bef6839a76d029204ab31aa2fcb5201"
> +SRC_URI[sha256sum] = "864831f51e841ff37f2445d1c85b86b559c8860a435fb496aead4f256a2b141d"
> +
> +EXTRA_OECONF += "--enable-dri --enable-dri2 --enable-dga"

-- 
Darren Hart
Intel Open Source Technology Center
Yocto Project - Linux Kernel



More information about the yocto mailing list