[PATCH] xorg: Add nr for background=none root

2010-06-06 Thread Dave Airlie
From: Adam Jackson a...@redhat.com

(I'm blaming ajax for this, but it could have be krh, either way its came from 
Red Hat, so I can sign it off.)

This adds support to the X server so that the driver can let the server know if 
it needs to draw a background when the -nr option is passed. If the driver can 
copy the framebuffer cleanly it sets the flag, it if can't the server will 
fallback to normal behaviour.

I think nearly every distro using KMS is carry this now.

Also since we are bumping ABI, don't use a reserved int, just break the 
ScrnInfoRec.

Signed-off-by: Dave Airlie airl...@redhat.com
---
 dix/globals.c|1 +
 dix/window.c |   12 +++-
 hw/xfree86/common/xf86Init.c |   11 +++
 hw/xfree86/common/xf86str.h  |3 +++
 include/opaque.h |1 +
 os/utils.c   |3 +++
 6 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/dix/globals.c b/dix/globals.c
index b128569..95dde2d 100644
--- a/dix/globals.c
+++ b/dix/globals.c
@@ -122,6 +122,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;
 
 TimeStamp currentTime;
 TimeStamp lastDeviceEventTime;
diff --git a/dix/window.c b/dix/window.c
index 8f3ffa3..eaf43aa 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -459,22 +459,24 @@ InitRootWindow(WindowPtr pWin)
 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 98bbd5d..9963899 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -76,6 +76,7 @@
 #include xf86Xinput.h
 #include xf86InPriv.h
 #include picturestr.h
+#include xace.h
 
 #include xf86Bus.h
 #include xf86VGAarbiter.h
@@ -242,6 +243,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);
@@ -293,6 +295,15 @@ xf86CreateRootWindow(WindowPtr pWin)
 }
   }
 
+  if (bgNoneRoot  pScrn-canDoBGNoneRoot) {
+  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);
+  }
+
   DebugF(xf86CreateRootWindow() returns %d\n, ret);
   return (ret);
 }
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index c9b261d..e18524d 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -774,6 +774,9 @@ typedef struct _ScrnInfoRec {
 ClockRangePtr  clockRanges;
 intadjustFlags;
 
+/* -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 b3c7c70..fcc8c95 100644
--- a/include/opaque.h
+++ b/include/opaque.h
@@ -71,6 +71,7 @@ extern _X_EXPORT Bool defeatAccessControl;
 extern _X_EXPORT long maxBigRequestSize;
 extern _X_EXPORT Bool party_like_its_1989;
 extern _X_EXPORT Bool whiteRoot;
+extern _X_EXPORT Bool bgNoneRoot;
 
 extern _X_EXPORT Bool CoreDump;
 
diff --git a/os/utils.c b/os/utils.c
index b4a954f..5a3ee87 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -504,6 +504,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(-nrcreate root window with no background\n);
 ErrorF(-reset reset after last client exists\n);
 

Re: [PATCH] xorg: Add nr for background=none root

2010-06-06 Thread Keith Packard
On Mon,  7 Jun 2010 14:08:37 +1000, Dave Airlie airl...@gmail.com wrote:
 From: Adam Jackson a...@redhat.com
 
 (I'm blaming ajax for this, but it could have be krh, either way its came 
 from Red Hat, so I can sign it off.)
 
 This adds support to the X server so that the driver can let the
 server know if it needs to draw a background when the -nr option is
 passed. If the driver can copy the framebuffer cleanly it sets the
 flag, it if can't the server will fallback to normal behaviour.

What will this do on non-xf86 servers? Is there some more explicit way
we could ask whether bgNoneRoot was OK and set that here instead of
hoping that the driver dtrt? Perhaps some simple mechanism like:

   pWin-backgroundState = BackgroundPixel;
   (*pScreen-CreateWindow)(pWin);

   if (pWin-backgroundState == BackgroundNone  bgNoneRoot)

That way the driver could signal that BackgroundNone was OK by simply
always setting it, and DIX could check that.

That seems less magic than the current patch, although still sub-optimal.

-- 
keith.pack...@intel.com


pgp87XIssEalW.pgp
Description: PGP signature
___
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel