From 95eee60ee686853ee81758dcbf975f2dfaf1ea1d Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Fri, 9 May 2025 20:49:23 -0600 Subject: [PATCH] xserver-xorg-video-dummy: only sync when there is damage --- .../x11/xserver-xorg-video-dummy/redox.patch | 136 +++++++++++------- 1 file changed, 87 insertions(+), 49 deletions(-) diff --git a/recipes/wip/x11/xserver-xorg-video-dummy/redox.patch b/recipes/wip/x11/xserver-xorg-video-dummy/redox.patch index 8df91727..83991188 100644 --- a/recipes/wip/x11/xserver-xorg-video-dummy/redox.patch +++ b/recipes/wip/x11/xserver-xorg-video-dummy/redox.patch @@ -1,6 +1,6 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c --- xf86-video-dummy-0.4.1/src/dummy_driver.c 2023-05-07 14:27:44.000000000 -0600 -+++ source/src/dummy_driver.c 2025-05-05 17:23:44.770853907 -0600 ++++ source/src/dummy_driver.c 2025-05-09 20:45:55.420661223 -0600 @@ -39,6 +39,7 @@ /* These need to be checked */ #include @@ -9,16 +9,15 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c #include "scrnintstr.h" #include "servermd.h" -@@ -51,6 +52,8 @@ +@@ -51,6 +52,7 @@ static Bool DUMMYEnterVT(VT_FUNC_ARGS_DECL); static void DUMMYLeaveVT(VT_FUNC_ARGS_DECL); static Bool DUMMYCloseScreen(CLOSE_SCREEN_ARGS_DECL); +static void DUMMYBlockHandler(ScreenPtr pScreen, void *timeout); -+static void DUMMYWakeupHandler(ScreenPtr pScreen, int result); static Bool DUMMYCreateWindow(WindowPtr pWin); static void DUMMYFreeScreen(FREE_SCREEN_ARGS_DECL); static ModeStatus DUMMYValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, -@@ -768,6 +771,64 @@ +@@ -768,6 +770,97 @@ static ScrnInfoPtr DUMMYScrn; /* static-globalize it */ @@ -79,11 +78,44 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c + + orb_events_destroy(event_iter); +} ++ ++static Bool ++CreateScreenResources(ScreenPtr pScreen) ++{ ++ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ++ DUMMYPtr dPtr = DUMMYPTR(pScrn); ++ PixmapPtr rootPixmap; ++ Bool ret; ++ ++ pScreen->CreateScreenResources = dPtr->CreateScreenResources; ++ ret = pScreen->CreateScreenResources(pScreen); ++ pScreen->CreateScreenResources = CreateScreenResources; ++ ++ if (!ret) { ++ return FALSE; ++ } ++ ++ rootPixmap = pScreen->GetScreenPixmap(pScreen); ++ ++ dPtr->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE, ++ pScreen, rootPixmap); ++ if (dPtr->damage) { ++ DamageRegister(&rootPixmap->drawable, dPtr->damage); ++ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Damage tracking initialized\n"); ++ } ++ else { ++ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to create screen damage record\n"); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ + /* Mandatory */ static Bool DUMMYScreenInit(SCREEN_INIT_ARGS_DECL) -@@ -776,7 +837,6 @@ +@@ -776,7 +869,6 @@ DUMMYPtr dPtr; int ret; VisualPtr visual; @@ -91,7 +123,7 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c /* * we need to get the ScrnInfoRec for this screen, so let's allocate -@@ -786,9 +846,22 @@ +@@ -786,9 +878,22 @@ dPtr = DUMMYPTR(pScrn); DUMMYScrn = pScrn; @@ -115,7 +147,7 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c /* * Reset visual list. -@@ -800,12 +873,10 @@ +@@ -800,12 +905,10 @@ if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), pScrn->rgbBits, pScrn->defaultVisual)) { @@ -128,7 +160,7 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c return FALSE; } -@@ -813,7 +884,7 @@ +@@ -813,7 +916,7 @@ * Call the framebuffer layer's ScreenInit function, and fill in other * pScreen fields. */ @@ -137,47 +169,39 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, pScrn->bitsPerPixel); -@@ -938,11 +1009,18 @@ +@@ -838,6 +941,10 @@ + /* must be after RGB ordering fixed */ + fbPictureInit(pScreen, 0, 0); - pScreen->SaveScreen = DUMMYSaveScreen; ++ /* Wrap the current CreateScreenResources function */ ++ dPtr->CreateScreenResources = pScreen->CreateScreenResources; ++ pScreen->CreateScreenResources = CreateScreenResources; ++ + xf86SetBlackWhitePixels(pScreen); -- - /* Wrap the current CloseScreen function */ + /* initialize XRANDR */ +@@ -943,6 +1050,10 @@ dPtr->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = DUMMYCloseScreen; + /* Wrap the current BlockHandler function */ + dPtr->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = DUMMYBlockHandler; -+ -+ /* Wrap the current WakeupHandler function */ -+ dPtr->WakeupHandler = pScreen->WakeupHandler; -+ pScreen->WakeupHandler = DUMMYWakeupHandler; + /* Wrap the current CreateWindow function */ dPtr->CreateWindow = pScreen->CreateWindow; pScreen->CreateWindow = DUMMYCreateWindow; -@@ -959,6 +1037,7 @@ - Bool - DUMMYSwitchMode(SWITCH_MODE_ARGS_DECL) - { -+ printf("SwitchMode\n"); - return TRUE; - } - -@@ -966,6 +1045,7 @@ - void - DUMMYAdjustFrame(ADJUST_FRAME_ARGS_DECL) - { -+ printf("AdjustFrame\n"); - } - - /* Mandatory */ -@@ -975,7 +1055,13 @@ +@@ -975,11 +1086,26 @@ ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); DUMMYPtr dPtr = DUMMYPTR(pScrn); - free(pScreen->GetScreenPixmap(pScreen)->devPrivate.ptr); ++ if (dPtr->damage) { ++ DamageUnregister(dPtr->damage); ++ DamageDestroy(dPtr->damage); ++ dPtr->damage = NULL; ++ } ++ + if (dPtr->orb_window) { + RemoveNotifyFd(orb_window_fd(dPtr->orb_window)); + @@ -188,7 +212,14 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c if (dPtr->CursorInfo) xf86DestroyCursorInfoRec(dPtr->CursorInfo); -@@ -1009,6 +1095,32 @@ + ++ pScreen->CreateScreenResources = dPtr->CreateScreenResources; ++ pScreen->BlockHandler = dPtr->BlockHandler; ++ + pScrn->vtSema = FALSE; + pScreen->CloseScreen = dPtr->CloseScreen; + return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS); +@@ -1009,6 +1135,31 @@ Atom VFB_PROP = 0; #define VFB_PROP_NAME "VFB_IDENT" @@ -201,29 +232,28 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy_driver.c source/src/dummy_driver.c + dPtr->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = DUMMYBlockHandler; + ++ if (dPtr->damage) { ++ RegionPtr dirty = DamageRegion(dPtr->damage); ++ if (RegionNil(dirty)) { ++ // Do not sync if damage empty ++ return; ++ } ++ DamageEmpty(dPtr->damage); ++ } ++ + if (dPtr->orb_window) { ++ //TODO: use damage region? + //printf("orb_window_sync %p\n", dPtr->orb_window); -+ //TODO: make syncs less frequent + orb_window_sync(dPtr->orb_window); + } +} -+ -+static void DUMMYWakeupHandler(ScreenPtr pScreen, int result) { -+ DUMMYPtr dPtr = DUMMYPTR(DUMMYScrn); -+ -+ //printf("WakeupHandler %p %d\n", pScreen, result); -+ pScreen->WakeupHandler = dPtr->WakeupHandler; -+ pScreen->WakeupHandler(pScreen, result); -+ dPtr->WakeupHandler = pScreen->WakeupHandler; -+ pScreen->WakeupHandler = DUMMYWakeupHandler; -+} + static Bool DUMMYCreateWindow(WindowPtr pWin) { diff -ruwN xf86-video-dummy-0.4.1/src/dummy.h source/src/dummy.h --- xf86-video-dummy-0.4.1/src/dummy.h 2023-05-07 14:27:44.000000000 -0600 -+++ source/src/dummy.h 2025-05-05 15:57:13.611157665 -0600 ++++ source/src/dummy.h 2025-05-09 20:41:33.547464718 -0600 @@ -4,6 +4,7 @@ #include "xf86_OSproc.h" @@ -243,20 +273,28 @@ diff -ruwN xf86-video-dummy-0.4.1/src/dummy.h source/src/dummy.h /* Supported chipsets */ typedef enum { -@@ -52,6 +55,8 @@ +@@ -44,6 +47,7 @@ + OptionInfoPtr Options; + Bool swCursor; + /* proc pointer */ ++ CreateScreenResourcesProcPtr CreateScreenResources; + CloseScreenProcPtr CloseScreen; + xf86CursorInfoPtr CursorInfo; + +@@ -52,6 +56,7 @@ int cursorFG, cursorBG; dummy_colors colors[1024]; + void (*BlockHandler)(ScreenPtr, void*) ; /* wrapped BlockHandler */ -+ void (*WakeupHandler)(ScreenPtr, int) ; /* wrapped WakeupHandler */ Bool (*CreateWindow)(WindowPtr) ; /* wrapped CreateWindow */ Bool prop; /* XRANDR support begin */ -@@ -60,6 +65,8 @@ +@@ -60,6 +65,9 @@ struct _xf86Output *paOutputs[DUMMY_MAX_SCREENS]; int connected_outputs; /* XRANDR support end */ + ++ DamagePtr damage; + void *orb_window; } DUMMYRec, *DUMMYPtr;