Skip to content

Commit

Permalink
default vsync mode when not given (or invalid) in config: PLL on appl…
Browse files Browse the repository at this point in the history
…e, TIMER otherwise
  • Loading branch information
m0dB authored and m0dB committed Jan 2, 2024
1 parent 6f95b1b commit a0a78d4
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 33 deletions.
52 changes: 35 additions & 17 deletions src/waveform/vsyncthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,42 @@
#include "util/math.h"
#include "util/performancetimer.h"

VSyncThread::VSyncThread(QObject* pParent)
VSyncThread::VSyncMode VSyncThread::effectiveVSyncMode(int configVSyncMode) {
#ifdef __APPLE__
VSyncMode defaultMode = ST_PLL;
#else
VSyncMode defaultMode = ST_TIMER;
#endif
if (configVSyncMode >= 0 || configVSyncMode <= static_cast<int>(ST_COUNT)) {
switch (static_cast<VSyncMode>(configVSyncMode)) {
case ST_DEFAULT:
return defaultMode;
case ST_MESA_VBLANK_MODE_1_DEPRECATED:
return defaultMode;
case ST_SGI_VIDEO_SYNC_DEPRECATED:
return defaultMode;
case ST_OML_SYNC_CONTROL_DEPRECATED:
return defaultMode;
case ST_FREE:
return ST_FREE;
case ST_TIMER:
return ST_TIMER;
case ST_PLL:
return ST_PLL;
case ST_COUNT:
return defaultMode;
}
}

return defaultMode;
}

VSyncThread::VSyncThread(QObject* pParent, int configVSyncMode)
: QThread(pParent),
m_bDoRendering(true),
m_vSyncTypeChanged(false),
m_syncIntervalTimeMicros(33333), // 30 FPS
m_waitToSwapMicros(0),
m_vSyncMode(ST_TIMER),
m_vSyncMode(effectiveVSyncMode(configVSyncMode)),
m_syncOk(false),
m_droppedFrames(0),
m_swapWait(0),
Expand Down Expand Up @@ -173,17 +202,6 @@ void VSyncThread::setSyncIntervalTimeMicros(int syncTime) {
round(m_displayFrameRate * m_syncIntervalTimeMicros / 1000));
}

void VSyncThread::setVSyncType(int type) {
// qDebug() << "setting vsync type" << type;

if (type >= (int)VSyncThread::ST_COUNT) {
type = VSyncThread::ST_TIMER;
}
m_vSyncMode = (enum VSyncMode)type;
m_droppedFrames = 0;
m_vSyncTypeChanged = true;
}

int VSyncThread::fromTimerToNextSyncMicros(const PerformanceTimer& timer) {
int difference = static_cast<int>(m_timer.difference(timer).toIntegerMicros());
// int math is fine here, because we do not expect times > 4.2 s
Expand All @@ -209,13 +227,13 @@ void VSyncThread::getAvailableVSyncTypes(QList<QPair<int, QString>>* pList) {
case VSyncThread::ST_TIMER:
name = tr("Timer (Fallback)");
break;
case VSyncThread::ST_MESA_VBLANK_MODE_1:
case VSyncThread::ST_MESA_VBLANK_MODE_1_DEPRECATED:
name = tr("MESA vblank_mode = 1");
break;
case VSyncThread::ST_SGI_VIDEO_SYNC:
case VSyncThread::ST_SGI_VIDEO_SYNC_DEPRECATED:
name = tr("Wait for Video sync");
break;
case VSyncThread::ST_OML_SYNC_CONTROL:
case VSyncThread::ST_OML_SYNC_CONTROL_DEPRECATED:
name = tr("Sync Control");
break;
case VSyncThread::ST_FREE:
Expand Down
24 changes: 14 additions & 10 deletions src/waveform/vsyncthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,24 @@ class VSyncThread : public QThread {
Q_OBJECT
public:
enum VSyncMode {
ST_TIMER = 0,
ST_MESA_VBLANK_MODE_1,
ST_SGI_VIDEO_SYNC,
ST_OML_SYNC_CONTROL,
ST_FREE,
ST_PLL,
ST_COUNT // Dummy Type at last, counting possible types
ST_DEFAULT = 0,
ST_MESA_VBLANK_MODE_1_DEPRECATED, // 1
ST_SGI_VIDEO_SYNC_DEPRECATED, // 2
ST_OML_SYNC_CONTROL_DEPRECATED, // 3
ST_FREE, // 4
ST_PLL, // 5
ST_TIMER, // 6
ST_COUNT // Dummy Type at last, counting possible types
};

VSyncThread(QObject* pParent);
VSyncThread(QObject* pParent, int configVSyncMode);
~VSyncThread();

void run();

bool waitForVideoSync(WGLWidget* glw);
int elapsed();
void setSyncIntervalTimeMicros(int usSyncTimer);
void setVSyncType(int mode);
int droppedFrames();
void setSwapWait(int sw);
int fromTimerToNextSyncMicros(const PerformanceTimer& timer);
Expand All @@ -43,18 +43,22 @@ class VSyncThread : public QThread {
return m_syncIntervalTimeMicros;
}
void updatePLL();
VSyncMode vsyncMode() const {
return m_vSyncMode;
}
signals:
void vsyncSwapAndRender();
void vsyncRender();
void vsyncSwap();

private:
static VSyncMode effectiveVSyncMode(int configVSyncMode);

void runFree();
void runPLL();
void runTimer();

bool m_bDoRendering;
bool m_vSyncTypeChanged;
int m_syncIntervalTimeMicros;
int m_waitToSwapMicros;
enum VSyncMode m_vSyncMode;
Expand Down
8 changes: 2 additions & 6 deletions src/waveform/waveformwidgetfactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ WaveformWidgetFactory::WaveformWidgetFactory()
m_pVisualsManager(nullptr),
m_frameCnt(0),
m_actualFrameRate(0),
m_vSyncType(0),
m_playMarkerPosition(WaveformWidgetRenderer::s_defaultPlayMarkerPosition) {
m_visualGain[All] = 1.0;
m_visualGain[Low] = 1.0;
Expand Down Expand Up @@ -360,8 +359,6 @@ bool WaveformWidgetFactory::setConfig(UserSettingsPointer config) {
ConfigValue(m_endOfTrackWarningTime));
}

m_vSyncType = m_config->getValue(ConfigKey("[Waveform]","VSync"), 0);

double defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom")).toDouble(&ok);
if (ok) {
setDefaultZoom(defaultZoom);
Expand Down Expand Up @@ -1126,13 +1123,12 @@ int WaveformWidgetFactory::findIndexOf(WWaveformViewer* viewer) const {
void WaveformWidgetFactory::startVSync(GuiTick* pGuiTick, VisualsManager* pVisualsManager) {
m_pGuiTick = pGuiTick;
m_pVisualsManager = pVisualsManager;
m_vsyncThread = new VSyncThread(this);
m_vsyncThread = new VSyncThread(this, m_config->getValue(ConfigKey("[Waveform]", "VSync"), 0));
m_vsyncThread->setObjectName(QStringLiteral("VSync"));
m_vsyncThread->setVSyncType(m_vSyncType);
m_vsyncThread->setSyncIntervalTimeMicros(static_cast<int>(1e6 / m_frameRate));

#ifdef MIXXX_USE_QOPENGL
if (m_vSyncType == VSyncThread::ST_PLL) {
if (m_vsyncThread->vsyncMode() == VSyncThread::ST_PLL) {
WGLWidget* widget = SharedGLContext::getWidget();
connect(widget->getOpenGLWindow(),
&QOpenGLWindow::frameSwapped,
Expand Down

0 comments on commit a0a78d4

Please sign in to comment.