1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#include "lib/streflop/streflop_cond.h" //! must happen before OffscreenGLContext.h, which includes agl.h
#include "System/OffscreenGLContext.h"
#include <functional>
#include "Rendering/GlobalRendering.h"
#include "System/SafeUtil.h"
#include "System/Log/ILog.h"
#include "System/Platform/errorhandler.h"
#include "System/Platform/Threading.h"
#include "System/Threading/SpringThreading.h"
COffscreenGLThread::COffscreenGLThread(std::function<void()> f)
{
// activate secondary context on main window
globalRendering->MakeCurrentContext(false, true, false);
thread = std::move(spring::thread(std::bind(&COffscreenGLThread::WrapFunc, this, f)));
}
void COffscreenGLThread::join()
{
if (!thread.joinable())
return;
thread.join();
// reactivate primary context on main window
globalRendering->MakeCurrentContext(false, false, false);
}
__FORCE_ALIGN_STACK__
void COffscreenGLThread::WrapFunc(std::function<void()> f)
{
Threading::SetThreadName("OffscreenGLThread");
// activate primary GL context on hidden window
globalRendering->MakeCurrentContext(true, false, false);
// init streflop
// not needed to maintain sync (precision flags are
// per-process) but fpu exceptions are per-thread
streflop::streflop_init<streflop::Simple>();
try {
f();
} CATCH_SPRING_ERRORS
// deactivate primary GL context on hidden window
globalRendering->MakeCurrentContext(true, false, true);
}
|