[idd] scheduler: prioritize deadline publication

This commit is contained in:
Geoffrey McRae
2026-08-06 17:24:44 +10:00
parent fac417c6b3
commit d3ee46f376
2 changed files with 28 additions and 18 deletions

View File

@@ -979,29 +979,34 @@ void CFrameScheduler::LogStatistics(uint64_t now)
return;
}
const uint64_t elapsed = now - m_lastLog;
const uint64_t acquired = m_acquiredFrames - m_lastLogAcquired;
const uint64_t skipped = m_skippedFrames - m_lastLogSkipped;
const uint64_t published = m_publishedFrames - m_lastLogPublished;
const double acquiredRate =
static_cast<double>(acquired) * 1000000000.0 / elapsed;
DEBUG_TRACE("Frame schedule owner %u: %.3f Hz client, %.3f Hz acquired, "
"%.3f ms work, %.3f ms phase; %llu acquired, %llu skipped, "
"%llu published",
m_schedule.clientID,
1000000000.0 / m_schedule.period,
acquiredRate,
m_workEstimate / 1000000.0,
m_lastPhaseError / 1000000.0,
static_cast<unsigned long long>(acquired),
static_cast<unsigned long long>(skipped),
static_cast<unsigned long long>(published));
const uint32_t clientID = m_schedule.clientID;
const uint64_t period = m_schedule.period;
const uint64_t workEstimate = m_workEstimate;
const int64_t phaseError = m_lastPhaseError;
const uint64_t elapsed = now - m_lastLog;
const uint64_t acquired = m_acquiredFrames - m_lastLogAcquired;
const uint64_t skipped = m_skippedFrames - m_lastLogSkipped;
const uint64_t published = m_publishedFrames - m_lastLogPublished;
m_lastLog = now;
m_lastLogAcquired = m_acquiredFrames;
m_lastLogSkipped = m_skippedFrames;
m_lastLogPublished = m_publishedFrames;
ReleaseSRWLockExclusive(&m_lock);
const double acquiredRate =
static_cast<double>(acquired) * 1000000000.0 / elapsed;
DEBUG_TRACE("Frame schedule owner %u: %.3f Hz client, %.3f Hz acquired, "
"%.3f ms work, %.3f ms phase; %llu acquired, %llu skipped, "
"%llu published",
clientID,
1000000000.0 / period,
acquiredRate,
workEstimate / 1000000.0,
phaseError / 1000000.0,
static_cast<unsigned long long>(acquired),
static_cast<unsigned long long>(skipped),
static_cast<unsigned long long>(published));
}
void CFrameScheduler::TryRecordFrameTiming(uint64_t duration)

View File

@@ -280,6 +280,10 @@ void CSwapChainProcessor::PublisherThread()
{
DWORD avTask = 0;
HANDLE avTaskHandle = AvSetMmThreadCharacteristicsW(L"Distribution", &avTask);
if (avTaskHandle &&
!AvSetMmThreadPriority(avTaskHandle, AVRT_PRIORITY_HIGH))
DEBUG_WARN("Failed to raise publisher MMCSS priority: %lu",
GetLastError());
const HANDLE scheduleEvent = m_devContext->GetFrameScheduleEvent();
HANDLE idleHandles[] =
@@ -490,7 +494,8 @@ void CSwapChainProcessor::PublisherThread()
}
}
AvRevertMmThreadCharacteristics(avTaskHandle);
if (avTaskHandle)
AvRevertMmThreadCharacteristics(avTaskHandle);
}
void CSwapChainProcessor::SwapChainThread()