summaryrefslogtreecommitdiff
path: root/composite
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2016-02-02 13:49:37 -0500
committerAdam Jackson <ajax@redhat.com>2016-06-21 11:11:49 -0400
commit5d6ad0d3a7611c4dff2d79b6af9eb5c0885656ef (patch)
tree032a43ec4074dc170586d8a46f373e59de249dc8 /composite
parent4f8a72034c4a2654bfc16d929e09a69d1cc138ef (diff)
res: Fix accounting of redirected window pixmaps for Composite
The previous change removed the special case that matched resources of CompositeClientWindowType and walked back from that to the window pixmap. That was intentional, since that logic was broken anyway. CCWTs don't map 1:1 to references on the backing pixmap; a window redirected by multiple clients (say, by the server since it's on the synthetic visual, and then manually by a compositor) would have a window pixmap refcount of 1, but would have those bytes accounted twice. The right thing is to have Composite wrap window accounting, and add the pixmap bytes once and only once for the redirection reference. Note that the view from the client can still be non-intuitive in the face of Composite. xcompmgr, for example, holds _two_ references to each window pixmap (one each from CompositeNameWindowPixmap and RenderCreatePicture), so a synthetic-visual window will have its bytes split 2/3 to xcompmgr and 1/3 to the server-client. Nothing to be done about that, and at least this way we're not over-accounting. Acked-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Adam Jackson <ajax@redhat.com>
Diffstat (limited to 'composite')
-rw-r--r--composite/compext.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/composite/compext.c b/composite/compext.c
index b95bf999e..5b17dae53 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -499,16 +499,17 @@ SProcCompositeDispatch(ClientPtr client)
}
/** @see GetDefaultBytes */
+static SizeType coreGetWindowBytes;
+
static void
-GetCompositeClientWindowBytes(void *value, XID id, ResourceSizePtr size)
+GetCompositeWindowBytes(void *value, XID id, ResourceSizePtr size)
{
WindowPtr window = value;
- /* Currently only pixmap bytes are reported to clients. */
- size->resourceSize = 0;
+ /* call down */
+ coreGetWindowBytes(value, id, size);
- /* Calculate pixmap reference sizes. */
- size->pixmapRefSize = 0;
+ /* account for redirection */
if (window->redirectDraw != RedirectDrawNone)
{
SizeType pixmapSizeFunc = GetResourceTypeSizeFunc(RT_PIXMAP);
@@ -552,8 +553,8 @@ CompositeExtensionInit(void)
if (!CompositeClientWindowType)
return;
- SetResourceTypeSizeFunc(CompositeClientWindowType,
- GetCompositeClientWindowBytes);
+ coreGetWindowBytes = GetResourceTypeSizeFunc(RT_WINDOW);
+ SetResourceTypeSizeFunc(RT_WINDOW, GetCompositeWindowBytes);
CompositeClientSubwindowsType = CreateNewResourceType
(FreeCompositeClientSubwindows, "CompositeClientSubwindows");