* added example: sharecontextmaster
| @@ -0,0 +1,82 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <CONFIG> | |||
| <ProjectOptions> | |||
| <Version Value="9"/> | |||
| <PathDelim Value="\"/> | |||
| <General> | |||
| <SessionStorage Value="InProjectDir"/> | |||
| <MainUnit Value="0"/> | |||
| <Title Value="project1"/> | |||
| <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> | |||
| @@ -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. | |||
| @@ -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> | |||
| @@ -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); | |||
| } | |||
| @@ -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 | |||
| @@ -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. | |||
| @@ -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> | |||
| @@ -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> | |||
| @@ -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; | |||
| @@ -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 | |||