mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-18 10:32:38 +00:00
Add a VsyncSource for renderers that already block for V-sync
This commit is contained in:
parent
1a60484abc
commit
d6e7173af0
@ -116,12 +116,15 @@ ffmpeg {
|
|||||||
SOURCES += \
|
SOURCES += \
|
||||||
streaming/video/ffmpeg.cpp \
|
streaming/video/ffmpeg.cpp \
|
||||||
streaming/video/ffmpeg-renderers/sdl.cpp \
|
streaming/video/ffmpeg-renderers/sdl.cpp \
|
||||||
streaming/video/ffmpeg-renderers/pacer/pacer.cpp
|
streaming/video/ffmpeg-renderers/pacer/pacer.cpp \
|
||||||
|
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp
|
||||||
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
streaming/video/ffmpeg.h \
|
streaming/video/ffmpeg.h \
|
||||||
streaming/video/ffmpeg-renderers/renderer.h \
|
streaming/video/ffmpeg-renderers/renderer.h \
|
||||||
streaming/video/ffmpeg-renderers/pacer/pacer.h
|
streaming/video/ffmpeg-renderers/pacer/pacer.h \
|
||||||
|
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h
|
||||||
}
|
}
|
||||||
libva {
|
libva {
|
||||||
message(VAAPI renderer selected)
|
message(VAAPI renderer selected)
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
#include "nullthreadedvsyncsource.h"
|
||||||
|
|
||||||
|
NullThreadedVsyncSource::NullThreadedVsyncSource(Pacer* pacer) :
|
||||||
|
m_Pacer(pacer),
|
||||||
|
m_Thread(nullptr)
|
||||||
|
{
|
||||||
|
SDL_AtomicSet(&m_Stopping, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NullThreadedVsyncSource::~NullThreadedVsyncSource()
|
||||||
|
{
|
||||||
|
if (m_Thread != nullptr) {
|
||||||
|
SDL_AtomicSet(&m_Stopping, 1);
|
||||||
|
SDL_WaitThread(m_Thread, nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NullThreadedVsyncSource::initialize(SDL_Window*)
|
||||||
|
{
|
||||||
|
m_Thread = SDL_CreateThread(vsyncThread, "Null Vsync Thread", this);
|
||||||
|
if (m_Thread == nullptr) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Unable to create DX V-sync thread: %s",
|
||||||
|
SDL_GetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int NullThreadedVsyncSource::vsyncThread(void* context)
|
||||||
|
{
|
||||||
|
NullThreadedVsyncSource* me = reinterpret_cast<NullThreadedVsyncSource*>(context);
|
||||||
|
|
||||||
|
SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH);
|
||||||
|
|
||||||
|
while (SDL_AtomicGet(&me->m_Stopping) == 0) {
|
||||||
|
me->m_Pacer->vsyncCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "pacer.h"
|
||||||
|
|
||||||
|
class NullThreadedVsyncSource : public IVsyncSource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NullThreadedVsyncSource(Pacer* pacer);
|
||||||
|
|
||||||
|
virtual ~NullThreadedVsyncSource();
|
||||||
|
|
||||||
|
virtual bool initialize(SDL_Window* window);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static int vsyncThread(void* context);
|
||||||
|
|
||||||
|
Pacer* m_Pacer;
|
||||||
|
SDL_Thread* m_Thread;
|
||||||
|
SDL_atomic_t m_Stopping;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user