From 02daa6bb103e53e5a33db2bb6acbe57d0bf2c30e Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Mon, 31 Jul 2006 17:32:05 +0100 Subject: [PATCH 1/2] Improve XRes to; - Better estimate general pixmap memory usage. - Account for pixmaps shared between clients. - Account for window background and border pixmaps, and GC stripple and tile pixmaps. --- Xext/xres.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/Xext/xres.c b/Xext/xres.c index 3e8231621..1617337bf 100644 --- a/Xext/xres.c +++ b/Xext/xres.c @@ -19,6 +19,8 @@ #include "swaprep.h" #include #include "pixmapstr.h" +#include "windowstr.h" +#include "gcstruct.h" #include "modinit.h" static int @@ -154,6 +156,7 @@ ProcXResQueryClientResources (ClientPtr client) swapl (&rep.length, n); swapl (&rep.num_types, n); } + WriteToClient (client,sizeof(xXResQueryClientResourcesReply),(char*)&rep); if(num_types) { @@ -185,13 +188,54 @@ ProcXResQueryClientResources (ClientPtr client) return (client->noClientException); } +static unsigned long +ResGetApproxPixmapBytes (PixmapPtr pix) +{ + unsigned long nPixels; + int bytesPerPixel; + + bytesPerPixel = pix->drawable.bitsPerPixel>>3; + nPixels = pix->drawable.width * pix->drawable.height; + + /* Divide by refcnt as pixmap could be shared between clients, + * so total pixmap mem is shared between these. + */ + return ( nPixels * bytesPerPixel ) / pix->refcnt; +} + static void ResFindPixmaps (pointer value, XID id, pointer cdata) { unsigned long *bytes = (unsigned long *)cdata; PixmapPtr pix = (PixmapPtr)value; - *bytes += (pix->devKind * pix->drawable.height); + *bytes += ResGetApproxPixmapBytes(pix); +} + +static void +ResFindWindowPixmaps (pointer value, XID id, pointer cdata) +{ + unsigned long *bytes = (unsigned long *)cdata; + WindowPtr pWin = (WindowPtr)value; + + if (pWin->backgroundState == BackgroundPixmap) + *bytes += ResGetApproxPixmapBytes(pWin->background.pixmap); + + if (pWin->border.pixmap != NULL && !pWin->borderIsPixel) + *bytes += ResGetApproxPixmapBytes(pWin->border.pixmap); +} + +static void +ResFindGCPixmaps (pointer value, XID id, pointer cdata) +{ + unsigned long *bytes = (unsigned long *)cdata; + GCPtr pGC = (GCPtr)value; + + if (pGC->stipple != NULL) + *bytes += ResGetApproxPixmapBytes(pGC->stipple); + + if (pGC->tile.pixmap != NULL && !pGC->tileIsPixel) + *bytes += ResGetApproxPixmapBytes(pGC->tile.pixmap); } static int @@ -218,6 +262,24 @@ ProcXResQueryClientPixmapBytes (ClientPtr client) FindClientResourcesByType(clients[clientID], RT_PIXMAP, ResFindPixmaps, (pointer)(&bytes)); + /* + * Make sure win background pixmaps also held to account. + */ + FindClientResourcesByType(clients[clientID], RT_WINDOW, + ResFindWindowPixmaps, + (pointer)(&bytes)); + + /* + * GC Tile & Stipple pixmaps too. + */ + FindClientResourcesByType(clients[clientID], RT_GC, + ResFindGCPixmaps, + (pointer)(&bytes)); + +#ifdef COMPOSITE + /* FIXME: include composite pixmaps too */ +#endif + rep.type = X_Reply; rep.sequenceNumber = client->sequence; rep.length = 0; From 3112a6c4f26d5e9258b8def7ce4109b4bd408c67 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 31 Jul 2006 10:25:31 -0700 Subject: [PATCH 2/2] Noting uses libdummy.a, so don't build it. Only libdummy-nonserver.a is actually used. --- hw/xfree86/Makefile.am | 1 - hw/xfree86/dummylib/Makefile.am | 11 +---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am index 525c4e0a2..67bfd80d9 100644 --- a/hw/xfree86/Makefile.am +++ b/hw/xfree86/Makefile.am @@ -40,7 +40,6 @@ XORG_LIBS = \ libosandcommon.la \ rac/librac.a \ parser/libxf86config.a \ - dummylib/libdummy.a \ dixmods/libdixmods.la \ @XORG_LIBS@ diff --git a/hw/xfree86/dummylib/Makefile.am b/hw/xfree86/dummylib/Makefile.am index bd69b570a..d89ee59a8 100644 --- a/hw/xfree86/dummylib/Makefile.am +++ b/hw/xfree86/dummylib/Makefile.am @@ -2,7 +2,7 @@ # libdummy-nonserver.a contains additional routines normally found in the # server for use in building the utilities like scanpci & the config tools -noinst_LIBRARIES = libdummy.a libdummy-nonserver.a +noinst_LIBRARIES = libdummy-nonserver.a INCLUDES = $(XORG_INCS) @@ -12,15 +12,6 @@ if NEED_STRLCAT STRL_SRCS = $(top_srcdir)/os/strlcat.c $(top_srcdir)/os/strlcpy.c endif -libdummy_a_SOURCES = getvalidbios.c getemptypci.c \ - pcitestmulti.c xf86allocscripi.c \ - xf86addrestolist.c xf86drvmsg.c xf86drvmsgverb.c \ - xf86getverb.c \ - xf86opt.c xf86screens.c xf86servisinit.c xf86verbose.c \ - #xf86errorf.c xf86errorfverb.c xf86msg.c xf86msgverb.c \ - #logvwrite.c verrorf.c xf86info.c xalloc.c fatalerror.c \ - #$(srcdir)/../os-support/shared/sigiostubs.c - libdummy_nonserver_a_SOURCES = \ fatalerror.c \ getvalidbios.c \