* 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; | fThreadID: TThreadID; | ||||
| fEnableVsync: Boolean; | fEnableVsync: Boolean; | ||||
| fLogEvent: TLogEvent; | fLogEvent: TLogEvent; | ||||
| fShareContext: TglcContext; | |||||
| function GetEnableVSync: Boolean; | function GetEnableVSync: Boolean; | ||||
| procedure SetEnableVSync(aValue: Boolean); | procedure SetEnableVSync(aValue: Boolean); | ||||
| @@ -96,9 +97,15 @@ type | |||||
| public | public | ||||
| property PixelFormatSettings: TglcContextPixelFormatSettings read fPixelFormatSettings; | property PixelFormatSettings: TglcContextPixelFormatSettings read fPixelFormatSettings; | ||||
| property VersionSettings: TglcContextVersionSettings read fVersionSettings; | 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; | destructor Destroy; override; | ||||
| property ThreadID: TThreadID read fThreadID; | property ThreadID: TThreadID read fThreadID; | ||||
| @@ -108,13 +115,13 @@ type | |||||
| procedure EnableDebugOutput(const aLogEvent: TLogEvent); | procedure EnableDebugOutput(const aLogEvent: TLogEvent); | ||||
| procedure DisableDebugOutput; | procedure DisableDebugOutput; | ||||
| procedure CloseContext; virtual; | procedure CloseContext; virtual; | ||||
| procedure Activate; virtual; abstract; | |||||
| procedure ReleaseShareContext; virtual; | |||||
| procedure Activate; virtual; | |||||
| procedure Deactivate; virtual; abstract; | procedure Deactivate; virtual; abstract; | ||||
| function IsActive: boolean; virtual; abstract; | function IsActive: boolean; virtual; abstract; | ||||
| procedure SwapBuffers; virtual; abstract; | procedure SwapBuffers; virtual; abstract; | ||||
| procedure SetSwapInterval(const aInterval: GLint); virtual; abstract; | procedure SetSwapInterval(const aInterval: GLint); virtual; abstract; | ||||
| function GetSwapInterval: GLint; virtual; abstract; | function GetSwapInterval: GLint; virtual; abstract; | ||||
| procedure Share(const aContext: TglcContext); virtual; abstract; | |||||
| {$IFDEF fpc} | {$IFDEF fpc} | ||||
| private class var | private class var | ||||
| fMainContextThreadID: TThreadID; | fMainContextThreadID: TThreadID; | ||||
| @@ -306,9 +313,10 @@ begin | |||||
| Result:= GetPlatformClass.IsAnyContextActive; | Result:= GetPlatformClass.IsAnyContextActive; | ||||
| end; | end; | ||||
| constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); | |||||
| constructor TglcContext.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aShareContext: TglcContext); | |||||
| begin | begin | ||||
| inherited Create; | inherited Create; | ||||
| fShareContext := aShareContext; | |||||
| fPixelFormatSettings := aPixelFormatSettings; | fPixelFormatSettings := aPixelFormatSettings; | ||||
| FControl := aControl; | FControl := aControl; | ||||
| fThreadID := 0; | fThreadID := 0; | ||||
| @@ -317,9 +325,9 @@ begin | |||||
| InitOpenGL(); | InitOpenGL(); | ||||
| end; | 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 | begin | ||||
| Create(aControl, aPixelFormatSettings); | |||||
| Create(aControl, aPixelFormatSettings, aShareContext); | |||||
| fVersionSettings := aVersionSettings; | fVersionSettings := aVersionSettings; | ||||
| fUseVersion := true; | fUseVersion := true; | ||||
| end; | end; | ||||
| @@ -336,8 +344,6 @@ procedure TglcContext.BuildContext; | |||||
| begin | begin | ||||
| OpenContext; | OpenContext; | ||||
| Activate; | Activate; | ||||
| ReadImplementationProperties; | |||||
| ReadExtensions; | |||||
| SetEnableVSync(fEnableVsync); | SetEnableVSync(fEnableVsync); | ||||
| end; | end; | ||||
| @@ -358,6 +364,17 @@ begin | |||||
| fMainContextThreadID := 0; | fMainContextThreadID := 0; | ||||
| end; | end; | ||||
| procedure TglcContext.ReleaseShareContext; | |||||
| begin | |||||
| fShareContext := nil; | |||||
| end; | |||||
| procedure TglcContext.Activate; | |||||
| begin | |||||
| ReadImplementationProperties; | |||||
| ReadExtensions; | |||||
| end; | |||||
| initialization | initialization | ||||
| {$IFDEF fpc}TglcContext.{$ENDIF}fMainContextThreadID := 0; | {$IFDEF fpc}TglcContext.{$ENDIF}fMainContextThreadID := 0; | ||||
| @@ -29,8 +29,13 @@ type | |||||
| function FindPixelFormatNoAA: Integer; | function FindPixelFormatNoAA: Integer; | ||||
| procedure OpenFromPF(PixelFormat: Integer); | procedure OpenFromPF(PixelFormat: Integer); | ||||
| public | 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 CloseContext; override; | ||||
| procedure Activate; override; | procedure Activate; override; | ||||
| @@ -39,7 +44,6 @@ type | |||||
| procedure SwapBuffers; override; | procedure SwapBuffers; override; | ||||
| procedure SetSwapInterval(const aInterval: GLint); override; | procedure SetSwapInterval(const aInterval: GLint); override; | ||||
| function GetSwapInterval: GLint; override; | function GetSwapInterval: GLint; override; | ||||
| procedure Share(const aContext: TglcContext); override; | |||||
| class function ChangeDisplaySettings(const aWidth, aHeight, aBitPerPixel, aFreq: Integer; | class function ChangeDisplaySettings(const aWidth, aHeight, aBitPerPixel, aFreq: Integer; | ||||
| const aFlags: TglcDisplayFlags): Boolean; override; | const aFlags: TglcDisplayFlags): Boolean; override; | ||||
| @@ -266,6 +270,7 @@ end; | |||||
| procedure TglcContextWGL.OpenFromPF(PixelFormat: Integer); | procedure TglcContextWGL.OpenFromPF(PixelFormat: Integer); | ||||
| var | var | ||||
| tmpRC: HGLRC; | tmpRC: HGLRC; | ||||
| err: DWORD; | |||||
| Attribs: array of GLint; | Attribs: array of GLint; | ||||
| CreateContextAttribs: TwglCreateContextAttribsARB; | CreateContextAttribs: TwglCreateContextAttribsARB; | ||||
| begin | begin | ||||
| @@ -337,18 +342,27 @@ begin | |||||
| wglDeleteContext(tmpRC); | wglDeleteContext(tmpRC); | ||||
| end else | end else | ||||
| FRC := tmpRC; | 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; | end; | ||||
| constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings); | |||||
| constructor TglcContextWGL.Create(const aControl: TWinControl; const aPixelFormatSettings: TglcContextPixelFormatSettings; const aShareContext: TglcContext); | |||||
| begin | begin | ||||
| inherited Create(aControl, aPixelFormatSettings); | |||||
| inherited Create(aControl, aPixelFormatSettings, aShareContext); | |||||
| fHandle := aControl.Handle; | fHandle := aControl.Handle; | ||||
| UpdatePixelFormat; | UpdatePixelFormat; | ||||
| end; | 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 | begin | ||||
| inherited Create(aControl, aPixelFormatSettings, aVersionSettings); | |||||
| inherited Create(aControl, aPixelFormatSettings, aVersionSettings, aShareContext); | |||||
| fHandle := aControl.Handle; | fHandle := aControl.Handle; | ||||
| UpdatePixelFormat; | UpdatePixelFormat; | ||||
| end; | end; | ||||
| @@ -365,14 +379,26 @@ begin | |||||
| end; | end; | ||||
| procedure TglcContextWGL.Activate; | procedure TglcContextWGL.Activate; | ||||
| var | |||||
| err: DWORD; | |||||
| begin | 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; | end; | ||||
| procedure TglcContextWGL.Deactivate; | procedure TglcContextWGL.Deactivate; | ||||
| var | |||||
| err: DWORD; | |||||
| begin | 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; | end; | ||||
| function TglcContextWGL.IsActive: boolean; | function TglcContextWGL.IsActive: boolean; | ||||
| @@ -397,12 +423,6 @@ begin | |||||
| result := wglGetSwapIntervalEXT(); | result := wglGetSwapIntervalEXT(); | ||||
| end; | 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, | class function TglcContextWGL.ChangeDisplaySettings(const aWidth, aHeight, | ||||
| aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; | aBitPerPixel, aFreq: Integer; const aFlags: TglcDisplayFlags): Boolean; | ||||
| var | var | ||||