xserver-xorg-video-dummy: only sync when there is damage

This commit is contained in:
Jeremy Soller 2025-05-09 20:49:23 -06:00
parent 44e8826f23
commit 95eee60ee6
No known key found for this signature in database
GPG Key ID: 670FDFB5428E05CA

View File

@ -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 <X11/X.h>
@ -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;