mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-09 00:31:31 +00:00
[idd] scheduler: republish after owner subscription
Consume subscription notifications from the private owner queues. When any lane gains a subscriber, request a retained-frame publication for the current timing owner so a static desktop cannot leave it waiting.
This commit is contained in:
@@ -779,6 +779,21 @@ void CFrameScheduler::FrameRepublished(const Schedule& schedule,
|
|||||||
ReleaseSRWLockExclusive(&m_lock);
|
ReleaseSRWLockExclusive(&m_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CFrameScheduler::RequestRepublish()
|
||||||
|
{
|
||||||
|
bool wake = false;
|
||||||
|
AcquireSRWLockExclusive(&m_lock);
|
||||||
|
if (m_scheduling)
|
||||||
|
{
|
||||||
|
++m_republishRequestTicket;
|
||||||
|
wake = true;
|
||||||
|
}
|
||||||
|
ReleaseSRWLockExclusive(&m_lock);
|
||||||
|
|
||||||
|
if (wake)
|
||||||
|
WakePublisher();
|
||||||
|
}
|
||||||
|
|
||||||
unsigned CFrameScheduler::GetSecondaryRecipients(
|
unsigned CFrameScheduler::GetSecondaryRecipients(
|
||||||
const uint32_t * clientIDs, unsigned count, uint32_t frameSerial,
|
const uint32_t * clientIDs, unsigned count, uint32_t frameSerial,
|
||||||
uint64_t now, uint32_t * recipients) const
|
uint64_t now, uint32_t * recipients) const
|
||||||
|
|||||||
@@ -157,6 +157,7 @@ public:
|
|||||||
uint64_t& target) const;
|
uint64_t& target) const;
|
||||||
void FrameDelivered(const uint32_t * clientIDs, unsigned count,
|
void FrameDelivered(const uint32_t * clientIDs, unsigned count,
|
||||||
uint32_t frameSerial, uint64_t now);
|
uint32_t frameSerial, uint64_t now);
|
||||||
|
void RequestRepublish();
|
||||||
void NotifyPublisher() const { WakePublisher(); }
|
void NotifyPublisher() const { WakePublisher(); }
|
||||||
void TryRecordFrameTiming(uint64_t duration);
|
void TryRecordFrameTiming(uint64_t duration);
|
||||||
void LogStatistics(uint64_t now);
|
void LogStatistics(uint64_t now);
|
||||||
|
|||||||
@@ -1410,6 +1410,15 @@ void CIndirectDeviceContext::LGMPTimer()
|
|||||||
if (lgmpHostQueueNewSubs(m_frameQueue))
|
if (lgmpHostQueueNewSubs(m_frameQueue))
|
||||||
m_frameScheduler.NotifyPublisher();
|
m_frameScheduler.NotifyPublisher();
|
||||||
|
|
||||||
|
bool ownerSubscribed = false;
|
||||||
|
for (unsigned queueIndex = 0;
|
||||||
|
queueIndex < LGMP_Q_FRAME_LEN;
|
||||||
|
++queueIndex)
|
||||||
|
ownerSubscribed |=
|
||||||
|
lgmpHostQueueNewSubs(m_frameOwnerQueue[queueIndex]) != 0;
|
||||||
|
if (ownerSubscribed)
|
||||||
|
m_frameScheduler.RequestRepublish();
|
||||||
|
|
||||||
ProcessFrameDeliveries();
|
ProcessFrameDeliveries();
|
||||||
|
|
||||||
if (lgmpHostQueueNewSubs(m_pointerQueue))
|
if (lgmpHostQueueNewSubs(m_pointerQueue))
|
||||||
|
|||||||
Reference in New Issue
Block a user