From d6e7173af0a4b227d423612ab9cc55306d3c3071 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Aug 2018 17:24:47 -0700 Subject: [PATCH] Add a VsyncSource for renderers that already block for V-sync --- app/app.pro | 7 +++- .../pacer/nullthreadedvsyncsource.cpp | 42 +++++++++++++++++++ .../pacer/nullthreadedvsyncsource.h | 20 +++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp create mode 100644 app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h diff --git a/app/app.pro b/app/app.pro index f55d9374..42588df2 100644 --- a/app/app.pro +++ b/app/app.pro @@ -116,12 +116,15 @@ ffmpeg { SOURCES += \ streaming/video/ffmpeg.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 += \ streaming/video/ffmpeg.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 { message(VAAPI renderer selected) diff --git a/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp new file mode 100644 index 00000000..869dfd8d --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp @@ -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(context); + + SDL_SetThreadPriority(SDL_THREAD_PRIORITY_HIGH); + + while (SDL_AtomicGet(&me->m_Stopping) == 0) { + me->m_Pacer->vsyncCallback(); + } + + return 0; +} diff --git a/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h new file mode 100644 index 00000000..8c9782a6 --- /dev/null +++ b/app/streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h @@ -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; +};