4 Prefix: glc - OpenGL Core
5 Beschreibung: diese Unit enthält eine abstrakte Klassen-Kapselung für OpenGL Kontexte
8 Abstrakte Contextklasse zum Erstellen von Renderkontexten auf Windows & Linux(bzw X11/Gtk2)
9 Für aktuelle Plattform passende Klasse kann per GetPlatformClass gefunden werden.
12 //muss im GUI/Main-Thread aufgerufen werden:
13 pf := TglcContext.GetPlatformClass().MakePF();
14 fContext := TglcContext.GetPlatformClass().Create(MyTWinControl, PF);
16 //_kann_ in Background Thread abgerufen werden:
17 fContext.BuildContext();
18 [Arbeit mit dem Context]
19 fContext.CloseContext();
26 MakePF() erzeugt PixelFormatDescriptor mit Defaults
27 BuildContext() baut Kontext (kann in BackgrounThread aufgerufen werden)
28 CloseContext() gibt den Kontext frei (muss im selben Thread aufgerufen werden wie BuildContext;
29 wird der Kontext nur im MainThread genutzt, muss CloseContext nicht explizit aufgerufen
30 werden und wird beim zerstören des Kontext-Objekts ausgeführt)
31 Activate/Deactiveate Kontext aktiv schalten oder nicht
32 SwapBuffers DoubleBuffering
35 EnableDebugOutput GL-Debug via ARB_debug_output oder AMD_debug_output de/aktivieren
41 SysUtils, Controls, dglOpenGL;
44 GLC_CONTEXT_VERSION_UNKNOWN = -1;
47 TMultiSample = 1..high(byte);
48 TglcContextPixelFormatSettings = packed record
49 DoubleBuffered: boolean;
51 MultiSampling: TMultiSample;
59 TglcContextVersionSettings = packed record
62 ForwardCompatible: Boolean;
67 TglcDisplayFlags = set of TglcDisplayFlag;
69 EGLError = class(Exception);
72 TglcContextClass = class of TglcContext;
75 fControl: TWinControl;
77 fEnableVsync: Boolean;
79 function GetEnableVSync: Boolean;
80 procedure SetEnableVSync(aValue: Boolean);
84 fPixelFormatSettings: TglcContextPixelFormatSettings;
85 fVersionSettings: TglcContextVersionSettings;
86 procedure OpenContext; virtual;
89 property PixelFormatSettings: TglcContextPixelFormatSettings read fPixelFormatSettings;
90 property VersionSettings: TglcContextVersionSettings read fVersionSettings;
92 constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); virtual; overload;
93 constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); virtual; overload;
94 destructor Destroy; override;
96 property ThreadID: TThreadID read fThreadID;
97 property EnableVSync: Boolean read GetEnableVSync write SetEnableVSync;
99 procedure BuildContext;
100 procedure CloseContext; virtual;
101 procedure Activate; virtual; abstract;
102 procedure Deactivate; virtual; abstract;
103 function IsActive: boolean; virtual; abstract;
104 procedure SwapBuffers; virtual; abstract;
105 procedure SetSwapInterval(const aInterval: GLint); virtual; abstract;
106 function GetSwapInterval: GLint; virtual; abstract;
107 procedure Share(const aContext: TglcContext); virtual; abstract;
110 fMainContextThreadID: TThreadID;
112 class property MainContextThreadID: TThreadID read fMainContextThreadID;
113 class function MakePF(DoubleBuffered: boolean = true;
114 Stereo: boolean=false;
115 MultiSampling: TMultiSample=1;
116 ColorBits: Integer=32;
117 DepthBits: Integer=24;
118 StencilBits: Integer=0;
119 AccumBits: Integer=0;
120 AuxBuffers: Integer=0;
121 Layer: Integer=0): TglcContextPixelFormatSettings;
122 class function MakeVersion(const aMajor, aMinor: Integer; const aForwardCompatible: Boolean): TglcContextVersionSettings;
123 class function GetPlatformClass: TglcContextClass;
124 class function ChangeDisplaySettings(const aWidth, aHeight,
125 aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; virtual; abstract;
126 class function IsAnyContextActive: boolean; virtual;
140 function TglcContext.GetEnableVSync: Boolean;
142 result := fEnableVsync;
145 procedure TglcContext.SetEnableVSync(aValue: Boolean);
147 fEnableVsync := aValue;
148 if IsActive then begin
156 procedure TglcContext.OpenContext;
158 fThreadID := GetCurrentThreadId;
159 if fMainContextThreadID = 0 then
160 fMainContextThreadID := fThreadID;
163 class function TglcContext.MakePF(DoubleBuffered: boolean; Stereo: boolean; MultiSampling: TMultiSample; ColorBits: Integer;
164 DepthBits: Integer; StencilBits: Integer; AccumBits: Integer; AuxBuffers: Integer; Layer: Integer): TglcContextPixelFormatSettings;
166 Result.DoubleBuffered:= DoubleBuffered;
167 Result.Stereo:= Stereo;
168 Result.MultiSampling:= MultiSampling;
169 Result.ColorBits:= ColorBits;
170 Result.DepthBits:= DepthBits;
171 Result.StencilBits:= StencilBits;
172 Result.AccumBits:= AccumBits;
173 Result.AuxBuffers:= AuxBuffers;
174 Result.Layer:= Layer;
177 class function TglcContext.MakeVersion(const aMajor, aMinor: Integer; const aForwardCompatible: Boolean): TglcContextVersionSettings;
179 result.Major := aMajor;
180 result.Minor := aMinor;
181 result.ForwardCompatible := aForwardCompatible;
184 class function TglcContext.GetPlatformClass: TglcContextClass;
187 Result:= TglcContextWGL;
190 Result:= TglcContextGtk2GLX;
194 class function TglcContext.IsAnyContextActive: boolean;
196 Result:= GetPlatformClass.IsAnyContextActive;
199 constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings);
202 fPixelFormatSettings := aPixelFormatSettings;
203 FControl := aControl;
205 fEnableVsync := false;
206 fUseVersion := false;
210 constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings);
212 Create(aControl, aPixelFormatSettings);
213 fVersionSettings := aVersionSettings;
217 destructor TglcContext.Destroy;
219 if (GetCurrentThreadId = fMainContextThreadID) then
220 fMainContextThreadID := 0;
225 procedure TglcContext.BuildContext;
229 ReadImplementationProperties;
231 SetEnableVSync(fEnableVsync);
234 procedure TglcContext.CloseContext;
236 if fMainContextThreadID = fThreadID then
237 fMainContextThreadID := 0;
241 TglcContext.fMainContextThreadID := 0;