diff options
author | Matthew Allum <mallum@polystyrene.(none)> | 2006-07-31 17:32:05 +0100 |
---|---|---|
committer | Matthew Allum <mallum@polystyrene.(none)> | 2006-07-31 17:32:05 +0100 |
commit | 02daa6bb103e53e5a33db2bb6acbe57d0bf2c30e (patch) | |
tree | e610620289715f0db9591eb83d1b51bf3322463f /Xext | |
parent | 24051ef97406f28c102cf46a78223400b61fdae2 (diff) |
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.
Diffstat (limited to 'Xext')
-rw-r--r-- | Xext/xres.c | 64 |
1 files changed, 63 insertions, 1 deletions
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 <X11/extensions/XResproto.h> #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; |