Ensure that rotation updates happen frequently
The smart scheduler is designed to minimize scheduler overhead by
increasing the interval between WaitForSomething calls when a single
client is running. However, the software rotation code depends on
its BlockHandler being invoked for screen updates; the long delays
caused by the smart scheduler optimizations means that screen updates
can be delayed a long time as well.
The change is simple -- prevent the smart scheduler from increasing
the scheduling interval while any screen is using software rotation.
(cherry picked from commit e7dd1efef4
)
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
31dc4fe0be
commit
76a1839b0a
|
@ -247,6 +247,7 @@ long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL;
|
|||
long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL;
|
||||
long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE;
|
||||
long SmartScheduleTime;
|
||||
int SmartScheduleLatencyLimited = 0;
|
||||
static ClientPtr SmartLastClient;
|
||||
static int SmartLastIndex[SMART_MAX_PRIORITY-SMART_MIN_PRIORITY+1];
|
||||
|
||||
|
@ -317,7 +318,7 @@ SmartScheduleClient (int *clientReady, int nready)
|
|||
/*
|
||||
* Adjust slice
|
||||
*/
|
||||
if (nready == 1)
|
||||
if (nready == 1 && SmartScheduleLatencyLimited == 0)
|
||||
{
|
||||
/*
|
||||
* If it's been a long time since another client
|
||||
|
@ -337,6 +338,23 @@ SmartScheduleClient (int *clientReady, int nready)
|
|||
return best;
|
||||
}
|
||||
|
||||
void
|
||||
EnableLimitedSchedulingLatency(void)
|
||||
{
|
||||
++SmartScheduleLatencyLimited;
|
||||
SmartScheduleSlice = SmartScheduleInterval;
|
||||
}
|
||||
|
||||
void
|
||||
DisableLimitedSchedulingLatency(void)
|
||||
{
|
||||
--SmartScheduleLatencyLimited;
|
||||
|
||||
/* protect against bugs */
|
||||
if (SmartScheduleLatencyLimited < 0)
|
||||
SmartScheduleLatencyLimited = 0;
|
||||
}
|
||||
|
||||
#define MAJOROP ((xReq *)client->requestBuffer)->reqType
|
||||
|
||||
void
|
||||
|
@ -356,6 +374,7 @@ Dispatch(void)
|
|||
if (!clientReady)
|
||||
return;
|
||||
|
||||
SmartScheduleSlice = SmartScheduleInterval;
|
||||
while (!dispatchException)
|
||||
{
|
||||
if (*icheck[0] != *icheck[1])
|
||||
|
@ -466,6 +485,7 @@ Dispatch(void)
|
|||
KillAllClients();
|
||||
xfree(clientReady);
|
||||
dispatchException &= ~DE_RESET;
|
||||
SmartScheduleLatencyLimited = 0;
|
||||
}
|
||||
|
||||
#undef MAJOROP
|
||||
|
|
|
@ -198,6 +198,7 @@ xf86RotatePrepare (ScreenPtr pScreen)
|
|||
DamageRegister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage_registered = TRUE;
|
||||
EnableLimitedSchedulingLatency();
|
||||
}
|
||||
|
||||
xf86CrtcDamageShadow (crtc);
|
||||
|
@ -308,6 +309,7 @@ xf86RotateDestroy (xf86CrtcPtr crtc)
|
|||
DamageUnregister (&(*pScreen->GetScreenPixmap)(pScreen)->drawable,
|
||||
xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage_registered = FALSE;
|
||||
DisableLimitedSchedulingLatency();
|
||||
}
|
||||
DamageDestroy (xf86_config->rotation_damage);
|
||||
xf86_config->rotation_damage = NULL;
|
||||
|
|
|
@ -229,6 +229,12 @@ extern void WakeupHandler(
|
|||
int /*result*/,
|
||||
pointer /*pReadmask*/);
|
||||
|
||||
void
|
||||
EnableLimitedSchedulingLatency(void);
|
||||
|
||||
void
|
||||
DisableLimitedSchedulingLatency(void);
|
||||
|
||||
typedef void (* WakeupHandlerProcPtr)(
|
||||
pointer /* blockData */,
|
||||
int /* result */,
|
||||
|
|
Loading…
Reference in New Issue
Block a user