forked from spring/spring
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOffscreenGLContext.cpp
More file actions
53 lines (40 loc) · 1.46 KB
/
OffscreenGLContext.cpp
File metadata and controls
53 lines (40 loc) · 1.46 KB
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
/* 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);
}