blob: fb586e1ecc43c13b8cc2d3a27ae339f5108bd990 (
plain)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
Locking
=========
Interface AbstractGraphicsDevice: lock() / unlock()
- Used to exclusively lock the device
- Current implementations:
- X11GraphicsDevice: XLockDisplay/XUnlockDisplay
- Shall only be used, where race conditions may happen with
device toolkit calls in regards to windowing resources,
ie create/destroy .. etc
- We call XInitThreads ASAP and a global X11 lock
is not necessary.
- To ensure XInitThreads can be issued at first,
GLProfile.initSingleton() shall be called
in the static initializer block of the main class.
TODO:
However, we have to investigate how to incooperate this
with Applet loading.
If such call ain't possible, a workaround could be to not
call XInitThreads() and utilize AWT locks.
Interface NativeWindow: lockSurface() / unlockSurface()
- Used to exclusively lock the surface
- Implementations:
- JAWTWindow:
- Recursive Lock
- JAWT SurfaceLock
- NEWT Window:
- Recursive Lock
- May have platform specific surface lock, currently: None
GLContext/GLDrawable Locking:
- MakeCurrent: NativeWindow:lockSurface()
- Release: NativeWindow:unlockSurface()
- Create/Destroy/Realize/Swap:
- NativeWindow:lockSurface()
- CreateImpl/DestroyImpl/Realize/Swap
- NativeWindow:unlockSurface()
- The Window impl. class shall lock the window recursive lock
for all modifying operations.
This should be the same lock as surfaceHandle!
Summary:
Locking is implemented in the platform agnostic code layer.
Locks and Order:
1: - NativeWindow Surface/Window Lock
- Locked:
- [makeCurrent .. release]
- create/destroy
GLContextImpl:
- makeCurrent
- Surface i - out only in error
- release
- Surface o - makeCurrentImpl
- create
- Surface i/o
- destroy
- Surface i/o
- copy
- Surface i/o
- setSwapIntervalImpl
- Surface i/o
GLDrawableImpl
- setRealizedImpl
- Surface i/o
- swapBuffersImpl
- [Surface i/o] - if not locked already
|