mirror of
https://gitlab.redox-os.org/redox-os/redox.git
synced 2026-06-20 20:04:19 +08:00
xserver-xorg-video-dummy: only sync when there is damage
This commit is contained in:
parent
44e8826f23
commit
95eee60ee6
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user