diff --git a/examples/sharecontext/project1.lpi b/examples/sharecontext/project1.lpi new file mode 100644 index 0000000..7e49921 --- /dev/null +++ b/examples/sharecontext/project1.lpi @@ -0,0 +1,82 @@ + + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <StringTable ProductVersion=""/> + </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <RequiredPackages Count="1"> + <Item1> + <PackageName Value="LCL"/> + </Item1> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="project1.lpr"/> + <IsPartOfProject Value="True"/> + </Unit0> + <Unit1> + <Filename Value="uMainForm.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="uMainForm"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="project1"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir);..\.."/> + <OtherUnitFiles Value="..\.."/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/examples/sharecontext/project1.lpr b/examples/sharecontext/project1.lpr new file mode 100644 index 0000000..5ca8fd0 --- /dev/null +++ b/examples/sharecontext/project1.lpr @@ -0,0 +1,21 @@ +program project1; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, uMainForm + { you can add units after this }; + +{$R *.res} + +begin + RequireDerivedFormResource := True; + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.Run; +end. + diff --git a/examples/sharecontext/project1.lps b/examples/sharecontext/project1.lps new file mode 100644 index 0000000..a915a42 --- /dev/null +++ b/examples/sharecontext/project1.lps @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="9"/> + <BuildModes Active="Default"/> + <Units Count="6"> + <Unit0> + <Filename Value="project1.lpr"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="21"/> + </Unit0> + <Unit1> + <Filename Value="uMainForm.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="uMainForm"/> + <IsVisibleTab Value="True"/> + <TopLine Value="96"/> + <CursorPos X="10" Y="110"/> + <UsageCount Value="21"/> + <Loaded Value="True"/> + <LoadedDesigner Value="True"/> + </Unit1> + <Unit2> + <Filename Value="..\..\uglcArrayBuffer.pas"/> + <UnitName Value="uglcArrayBuffer"/> + <EditorIndex Value="4"/> + <TopLine Value="38"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit2> + <Unit3> + <Filename Value="..\..\uglcContext.pas"/> + <UnitName Value="uglcContext"/> + <EditorIndex Value="1"/> + <TopLine Value="84"/> + <CursorPos X="17" Y="102"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit3> + <Unit4> + <Filename Value="..\..\uglcContextWGL.pas"/> + <UnitName Value="uglcContextWGL"/> + <EditorIndex Value="2"/> + <TopLine Value="360"/> + <CursorPos X="15" Y="368"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit4> + <Unit5> + <Filename Value="..\..\uglcContextGtk2GLX.pas"/> + <UnitName Value="uglcContextGtk2GLX"/> + <EditorIndex Value="3"/> + <TopLine Value="31"/> + <CursorPos X="15" Y="14"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit5> + </Units> + <JumpHistory Count="19" HistoryIndex="18"> + <Position1> + <Filename Value="uMainForm.pas"/> + <Caret Line="43" Column="22" TopLine="26"/> + </Position1> + <Position2> + <Filename Value="uMainForm.pas"/> + <Caret Line="26" Column="46" TopLine="8"/> + </Position2> + <Position3> + <Filename Value="uMainForm.pas"/> + <Caret Line="27" Column="46" TopLine="8"/> + </Position3> + <Position4> + <Filename Value="uMainForm.pas"/> + <Caret Line="26" Column="46" TopLine="8"/> + </Position4> + <Position5> + <Filename Value="uMainForm.pas"/> + <Caret Line="18" Column="4" TopLine="8"/> + </Position5> + <Position6> + <Filename Value="uMainForm.pas"/> + <Caret Line="114" Column="19" TopLine="101"/> + </Position6> + <Position7> + <Filename Value="uMainForm.pas"/> + <Caret Line="23" Column="7" TopLine="10"/> + </Position7> + <Position8> + <Filename Value="uMainForm.pas"/> + <Caret Line="60" Column="26" TopLine="48"/> + </Position8> + <Position9> + <Filename Value="..\..\uglcContext.pas"/> + <Caret Line="322" Column="3" TopLine="319"/> + </Position9> + <Position10> + <Filename Value="..\..\uglcContext.pas"/> + <Caret Line="101" Column="18" TopLine="83"/> + </Position10> + <Position11> + <Filename Value="..\..\uglcContext.pas"/> + <Caret Line="281" Column="46" TopLine="89"/> + </Position11> + <Position12> + <Filename Value="..\..\uglcContext.pas"/> + <Caret Line="118" Column="19" TopLine="96"/> + </Position12> + <Position13> + <Filename Value="..\..\uglcContextWGL.pas"/> + <Caret Line="70" Column="3" TopLine="68"/> + </Position13> + <Position14> + <Filename Value="uMainForm.pas"/> + <Caret Line="60" Column="26" TopLine="48"/> + </Position14> + <Position15> + <Filename Value="..\..\uglcContextWGL.pas"/> + <Caret Line="352" Column="30" TopLine="325"/> + </Position15> + <Position16> + <Filename Value="uMainForm.pas"/> + <Caret Line="62" Column="48" TopLine="48"/> + </Position16> + <Position17> + <Filename Value="..\..\uglcContextWGL.pas"/> + <Caret Line="352" Column="30" TopLine="336"/> + </Position17> + <Position18> + <Filename Value="..\..\uglcContextWGL.pas"/> + <Caret Line="34" Column="56" TopLine="16"/> + </Position18> + <Position19> + <Filename Value="uMainForm.pas"/> + <Caret Line="147" Column="23" TopLine="105"/> + </Position19> + </JumpHistory> + </ProjectSession> +</CONFIG> diff --git a/examples/sharecontext/project1.res b/examples/sharecontext/project1.res new file mode 100644 index 0000000..e66ecf8 Binary files /dev/null and b/examples/sharecontext/project1.res differ diff --git a/examples/sharecontext/shader.glsl b/examples/sharecontext/shader.glsl new file mode 100644 index 0000000..5993f08 --- /dev/null +++ b/examples/sharecontext/shader.glsl @@ -0,0 +1,19 @@ +/* ShaderObject: GL_VERTEX_SHADER */ +#version 330 +uniform mat4 uModelViewProjMat; +layout(location = 0) in vec3 inPos; + +void main(void) +{ + gl_Position = vec4(inPos, 1.0); +} + +/* ShaderObject: GL_FRAGMENT_SHADER */ +#version 330 + +out vec4 outColor; // ausgegebene Farbe + +void main(void) +{ + outColor = vec4(1.0, 0.0, 0.0, 1.0); +} \ No newline at end of file diff --git a/examples/sharecontext/uMainForm.lfm b/examples/sharecontext/uMainForm.lfm new file mode 100644 index 0000000..f4ef0ff --- /dev/null +++ b/examples/sharecontext/uMainForm.lfm @@ -0,0 +1,45 @@ +object MainForm: TMainForm + Left = 465 + Height = 460 + Top = 217 + Width = 683 + Caption = 'MainForm' + ClientHeight = 460 + ClientWidth = 683 + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + LCLVersion = '1.3' + object LogLB: TListBox + Left = 0 + Height = 80 + Top = 380 + Width = 683 + Align = alBottom + ItemHeight = 0 + TabOrder = 0 + end + object RenderPanel1: TPanel + Left = 144 + Height = 200 + Top = 40 + Width = 200 + BevelOuter = bvNone + BorderStyle = bsSingle + TabOrder = 1 + end + object RenderPanel2: TPanel + Left = 200 + Height = 200 + Top = 88 + Width = 200 + BevelOuter = bvNone + BorderStyle = bsSingle + TabOrder = 2 + end + object ApplicationProperties: TApplicationProperties + OnIdle = ApplicationPropertiesIdle + left = 64 + top = 24 + end +end diff --git a/examples/sharecontext/uMainForm.pas b/examples/sharecontext/uMainForm.pas new file mode 100644 index 0000000..517766a --- /dev/null +++ b/examples/sharecontext/uMainForm.pas @@ -0,0 +1,155 @@ +unit uMainForm; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, + uglcContext, uglcShader, uglcArrayBuffer, uglcTypes; + +type + TMainForm = class(TForm) + ApplicationProperties: TApplicationProperties; + LogLB: TListBox; + RenderPanel2: TPanel; + RenderPanel1: TPanel; + procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure FormResize(Sender: TObject); + private + fContext1: TglcContext; + fContext2: TglcContext; + fShader: TglcShaderProgram; + fVBO: TglcArrayBuffer; + procedure Log(aSender: TObject; const aMsg: String); + procedure Render; + public + { public declarations } + end; + +var + MainForm: TMainForm; + +implementation + +{$R *.lfm} + +uses + dglOpenGL, ugluVector; + +const + SHADER_FILE = 'shader.glsl'; + + LAYOUT_LOCATION_POS = 0; + +procedure TMainForm.FormCreate(Sender: TObject); +type + TVertex = packed record + pos: TgluVector3f; + end; + PVertex = ^TVertex; +var + pf: TglcContextPixelFormatSettings; + p: PVertex; +begin + pf := TglcContext.MakePF(); + fContext1 := TglcContext.GetPlatformClass.Create(RenderPanel1, pf); + fContext1.BuildContext; + + fContext2 := TglcContext.GetPlatformClass.Create(RenderPanel2, pf, fContext1); + fContext2.BuildContext; + + fContext1.Activate; + + fShader := TglcShaderProgram.Create(@Log); + fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE); + fShader.Compile; + + fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer); + fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil); + p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly); + try + p^.pos := gluVector3f(-0.5, -0.5, 0); inc(p); + p^.pos := gluVector3f( 0.5, -0.5, 0); inc(p); + p^.pos := gluVector3f( 0.5, 0.5, 0); inc(p); + p^.pos := gluVector3f(-0.5, 0.5, 0); inc(p); + finally + fVBO.UnmapBuffer; + end; +end; + +procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); +begin + Render; + Done := false; +end; + +procedure TMainForm.FormDestroy(Sender: TObject); +begin + FreeAndNil(fVBO); + FreeAndNil(fShader); + FreeAndNil(fContext2); + FreeAndNil(fContext1); +end; + +procedure TMainForm.FormResize(Sender: TObject); + + procedure DoResize(const l, r, w, h: Integer; const aPanel: TPanel; const aContext: TglcContext); + begin + aPanel.SetBounds(l, r, w, h); + if Assigned(aContext) then begin + aContext.Activate; + glViewport(0, 0, w, h); + end; + end; + +var + w, h: Integer; +begin + w := (ClientWidth - 24) div 2; + h := LogLB.Top - 16; + DoResize( 8, 8, w, h, RenderPanel1, fContext1); + DoResize(w + 16, 8, w, h, RenderPanel2, fContext2); +end; + +procedure TMainForm.Log(aSender: TObject; const aMsg: String); +begin + LogLB.Items.Add(aMsg); +end; + +procedure TMainForm.Render; + + procedure DoRender; + begin + glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); + + fVBO.Bind; + fShader.Enable; + + glEnableVertexAttribArray(LAYOUT_LOCATION_POS); + glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, 0, nil); + + glDrawArrays(GL_QUADS, 0, fVBO.DataCount); + + glDisableVertexAttribArray(LAYOUT_LOCATION_POS); + + fShader.Disable; + fVBO.Unbind; + end; + +begin + fContext1.Activate; + glClearColor(0.1, 0.2, 0.1, 0); + DoRender; + fContext1.SwapBuffers; + + fContext2.Activate; + glClearColor(0.1, 0.1, 0.2, 0); + DoRender; + fContext2.SwapBuffers; +end; + +end. + diff --git a/examples/simple/project1.lps b/examples/simple/project1.lps new file mode 100644 index 0000000..60e7a41 --- /dev/null +++ b/examples/simple/project1.lps @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="9"/> + <BuildModes Active="Default"/> + <Units Count="3"> + <Unit0> + <Filename Value="project1.lpr"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="20"/> + </Unit0> + <Unit1> + <Filename Value="uMainForm.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="uMainForm"/> + <IsVisibleTab Value="True"/> + <TopLine Value="20"/> + <CursorPos X="36" Y="35"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + </Unit1> + <Unit2> + <Filename Value="..\..\uglcArrayBuffer.pas"/> + <UnitName Value="uglcArrayBuffer"/> + <EditorIndex Value="1"/> + <TopLine Value="38"/> + <UsageCount Value="10"/> + <Loaded Value="True"/> + </Unit2> + </Units> + <JumpHistory Count="2" HistoryIndex="1"> + <Position1> + <Filename Value="uMainForm.pas"/> + <Caret Line="39" Column="29" TopLine="85"/> + </Position1> + <Position2> + <Filename Value="uMainForm.pas"/> + <Caret Line="43" Column="22" TopLine="26"/> + </Position2> + </JumpHistory> + </ProjectSession> +</CONFIG> diff --git a/examples/simple/project1.res b/examples/simple/project1.res new file mode 100644 index 0000000..e66ecf8 Binary files /dev/null and b/examples/simple/project1.res differ diff --git a/examples/vertexarrayobject/project1.lps b/examples/vertexarrayobject/project1.lps new file mode 100644 index 0000000..ce44512 --- /dev/null +++ b/examples/vertexarrayobject/project1.lps @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<CONFIG> + <ProjectSession> + <PathDelim Value="\"/> + <Version Value="9"/> + <BuildModes Active="Default"/> + <Units Count="3"> + <Unit0> + <Filename Value="project1.lpr"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="20"/> + </Unit0> + <Unit1> + <Filename Value="uMainForm.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="MainForm"/> + <HasResources Value="True"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="uMainForm"/> + <IsVisibleTab Value="True"/> + <TopLine Value="95"/> + <CursorPos X="63" Y="108"/> + <UsageCount Value="20"/> + <Loaded Value="True"/> + </Unit1> + <Unit2> + <Filename Value="..\..\uglcVertexArrayObject.pas"/> + <IsPartOfProject Value="True"/> + <UsageCount Value="20"/> + </Unit2> + </Units> + <JumpHistory HistoryIndex="-1"/> + </ProjectSession> +</CONFIG> diff --git a/examples/vertexarrayobject/project1.res b/examples/vertexarrayobject/project1.res new file mode 100644 index 0000000..e66ecf8 Binary files /dev/null and b/examples/vertexarrayobject/project1.res differ diff --git a/uglcContext.pas b/uglcContext.pas index 73f419a..605a92d 100644 --- a/uglcContext.pas +++ b/uglcContext.pas @@ -82,6 +82,7 @@ type fThreadID: TThreadID; fEnableVsync: Boolean; fLogEvent: TLogEvent; + fShareContext: TglcContext; function GetEnableVSync: Boolean; procedure SetEnableVSync(aValue: Boolean); @@ -96,9 +97,15 @@ type public property PixelFormatSettings: TglcContextPixelFormatSettings read fPixelFormatSettings; property VersionSettings: TglcContextVersionSettings read fVersionSettings; - - constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); overload; virtual; - constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); overload; virtual; + property ShareContext: TglcContext read fShareContext; + + constructor Create(const aControl: TWinControl; + const aPixelFormatSettings: TglcContextPixelFormatSettings; + const aShareContext: TglcContext = nil); overload; virtual; + constructor Create(const aControl: TWinControl; + const aPixelFormatSettings: TglcContextPixelFormatSettings; + const aVersionSettings: TglcContextVersionSettings; + const aShareContext: TglcContext = nil); overload; virtual; destructor Destroy; override; property ThreadID: TThreadID read fThreadID; @@ -108,13 +115,13 @@ type procedure EnableDebugOutput(const aLogEvent: TLogEvent); procedure DisableDebugOutput; procedure CloseContext; virtual; - procedure Activate; virtual; abstract; + procedure ReleaseShareContext; virtual; + procedure Activate; virtual; procedure Deactivate; virtual; abstract; function IsActive: boolean; virtual; abstract; procedure SwapBuffers; virtual; abstract; procedure SetSwapInterval(const aInterval: GLint); virtual; abstract; function GetSwapInterval: GLint; virtual; abstract; - procedure Share(const aContext: TglcContext); virtual; abstract; {$IFDEF fpc} private class var fMainContextThreadID: TThreadID; @@ -306,9 +313,10 @@ begin Result:= GetPlatformClass.IsAnyContextActive; end; -constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); +constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aShareContext: TglcContext); begin inherited Create; + fShareContext := aShareContext; fPixelFormatSettings := aPixelFormatSettings; FControl := aControl; fThreadID := 0; @@ -317,9 +325,9 @@ begin InitOpenGL(); end; -constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); +constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings; const aShareContext: TglcContext); begin - Create(aControl, aPixelFormatSettings); + Create(aControl, aPixelFormatSettings, aShareContext); fVersionSettings := aVersionSettings; fUseVersion := true; end; @@ -336,8 +344,6 @@ procedure TglcContext.BuildContext; begin OpenContext; Activate; - ReadImplementationProperties; - ReadExtensions; SetEnableVSync(fEnableVsync); end; @@ -358,6 +364,17 @@ begin fMainContextThreadID := 0; end; +procedure TglcContext.ReleaseShareContext; +begin + fShareContext := nil; +end; + +procedure TglcContext.Activate; +begin + ReadImplementationProperties; + ReadExtensions; +end; + initialization {$IFDEF fpc}TglcContext.{$ENDIF}fMainContextThreadID := 0; diff --git a/uglcContextWGL.pas b/uglcContextWGL.pas index 58b35de..0b4cf82 100644 --- a/uglcContextWGL.pas +++ b/uglcContextWGL.pas @@ -29,8 +29,13 @@ type function FindPixelFormatNoAA: Integer; procedure OpenFromPF(PixelFormat: Integer); public - constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); overload; override; - constructor Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); overload; override; + constructor Create(const aControl: TWinControl; + const aPixelFormatSettings: TglcContextPixelFormatSettings; + const aShareContext: TglcContext = nil); overload; override; + constructor Create(const aControl: TWinControl; + const aPixelFormatSettings: TglcContextPixelFormatSettings; + const aVersionSettings: TglcContextVersionSettings; + const aShareContext: TglcContext = nil); overload; override; procedure CloseContext; override; procedure Activate; override; @@ -39,7 +44,6 @@ type procedure SwapBuffers; override; procedure SetSwapInterval(const aInterval: GLint); override; function GetSwapInterval: GLint; override; - procedure Share(const aContext: TglcContext); override; class function ChangeDisplaySettings(const aWidth, aHeight, aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; override; @@ -266,6 +270,7 @@ end; procedure TglcContextWGL.OpenFromPF(PixelFormat: Integer); var tmpRC: HGLRC; + err: DWORD; Attribs: array of GLint; CreateContextAttribs: TwglCreateContextAttribsARB; begin @@ -337,18 +342,27 @@ begin wglDeleteContext(tmpRC); end else FRC := tmpRC; + + if Assigned(ShareContext) then begin + if (ShareContext.ClassName <> ClassName) then + raise Exception.Create('share context has invalid type: ' + ShareContext.ClassName); + if not wglShareLists((ShareContext as TglcContextWGL).FRC, FRC) then begin + err := GetLastError(); + raise EGLError.Create('wglShareLists failed (' + IntToStr(err) + ') ' + SysErrorMessage(err)); + end; + end; end; -constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); +constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aShareContext: TglcContext); begin - inherited Create(aControl, aPixelFormatSettings); + inherited Create(aControl, aPixelFormatSettings, aShareContext); fHandle := aControl.Handle; UpdatePixelFormat; end; -constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings); +constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aVersionSettings: TglcContextVersionSettings; const aShareContext: TglcContext); begin - inherited Create(aControl, aPixelFormatSettings, aVersionSettings); + inherited Create(aControl, aPixelFormatSettings, aVersionSettings, aShareContext); fHandle := aControl.Handle; UpdatePixelFormat; end; @@ -365,14 +379,26 @@ begin end; procedure TglcContextWGL.Activate; +var + err: DWORD; begin - ActivateRenderingContext(FDC, FRC); + if (FDC = 0) or (FRC = 0) then + raise Exception.Create('invalid context. did you call build context first?'); + if (not wglMakeCurrent(FDC, FRC)) then begin + err := GetLastError; + raise Exception.Create('unable to activate context: (' + IntToStr(err) + ') ' + SysErrorMessage(err)); + end; + inherited Activate; end; procedure TglcContextWGL.Deactivate; +var + err: DWORD; begin - if wglGetCurrentContext()=FRC then - DeactivateRenderingContext; + if (wglGetCurrentContext()=FRC) and not wglMakeCurrent(0, 0) then begin + err := GetLastError; + raise Exception.Create('unable to deactivate context: (' + IntToStr(err) + ') ' + SysErrorMessage(err)); + end; end; function TglcContextWGL.IsActive: boolean; @@ -397,12 +423,6 @@ begin result := wglGetSwapIntervalEXT(); end; -procedure TglcContextWGL.Share(const aContext: TglcContext); -begin - if not wglShareLists(FRC, (aContext as TglcContextWGL).FRC) then - raise EGLError.Create('wglShareLists failed: ' + IntToStr(GetLastError())); -end; - class function TglcContextWGL.ChangeDisplaySettings(const aWidth, aHeight, aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; var