qt5: Allow sharing OpenGL context data between instances of TOpenGLControl

This commit is contained in:
Michalis Kamburelis 2022-05-23 00:27:37 +02:00 committed by Maxim Ganetsky
parent db285860e3
commit 210a539c9c

View File

@ -315,6 +315,7 @@ var
{$IFDEF VerboseMultiSampling} {$IFDEF VerboseMultiSampling}
samp_buf, visual_id, red_size, blue_size, green_size, alpha_size: integer; samp_buf, visual_id, red_size, blue_size, green_size, alpha_size: integer;
{$ENDIF} {$ENDIF}
SharedContext: TGLXContext;
begin begin
if WSPrivate=nil then ; if WSPrivate=nil then ;
AttrList.AttributeList := CreateOpenGLContextAttrList(DoubleBuffered,RGBA,RedBits,GreenBits,BlueBits,AlphaBits,DepthBits,StencilBits,AUXBuffers, MultiSampling); AttrList.AttributeList := CreateOpenGLContextAttrList(DoubleBuffered,RGBA,RedBits,GreenBits,BlueBits,AlphaBits,DepthBits,StencilBits,AUXBuffers, MultiSampling);
@ -356,6 +357,14 @@ begin
NewQtWidget.GetGLXDrawable; NewQtWidget.GetGLXDrawable;
{$ENDIF} {$ENDIF}
{ SharedContext will be passed to various glX routines,
to enable sharing OpenGL resources with SharedControl. }
if SharedControl <> nil then
SharedContext := TQtGLWidget(SharedControl.Handle).GLXContext
else
SharedContext := nil;
{$IFDEF ModernGL} {$IFDEF ModernGL}
if GLX_version_1_3(NewQtWidget.xdisplay) then if GLX_version_1_3(NewQtWidget.xdisplay) then
begin begin
@ -455,21 +464,13 @@ begin
Context3X[4] := GLX_CONTEXT_FLAGS_ARB; Context3X[4] := GLX_CONTEXT_FLAGS_ARB;
Context3X[5] := AttrList.ContextFlags; Context3X[5] := AttrList.ContextFlags;
Context3X[6] := None; Context3X[6] := None;
//if (ShareList<>nil) then begin NewQtWidget.glxcontext := glXCreateContextAttribsARB(NewQtWidget.xdisplay, FBConfig, SharedContext, direct, Context3X);
// NewQtWidget.glxcontext:=glXCreateContextAttribsARB(NewQtWidget.xdisplay, FBConfig,PrivateShareList^.glxcontext, direct, Context3X);
//end else begin
NewQtWidget.glxcontext := glXCreateContextAttribsARB(NewQtWidget.xdisplay, FBConfig, Nil, direct, Context3X);
//end;
//raise Exception.Create('key '+inttostr(BestFBConfig)); //raise Exception.Create('key '+inttostr(BestFBConfig));
// restore default error handler // restore default error handler
XSetErrorHandler(nil); XSetErrorHandler(nil);
end else end else
begin begin
//if (ShareList<>nil) then begin NewQtWidget.glxcontext := glXCreateNewContext(NewQtWidget.xdisplay, FBConfig, GLX_RGBA_TYPE, SharedContext, direct);
// NewQtWidget.glxcontext:=glXCreateNewContext(NewQtWidget.xdisplay, FBConfig, GLX_RGBA_TYPE,PrivateShareList^.glxcontext, direct)
//end else begin
NewQtWidget.glxcontext := glXCreateNewContext(NewQtWidget.xdisplay, FBConfig, GLX_RGBA_TYPE, Nil, direct);
//end;
end; end;
if FBConfigs<>nil then if FBConfigs<>nil then
XFree(FBConfigs); XFree(FBConfigs);
@ -477,7 +478,7 @@ begin
end else end else
{$ENDIF} {$ENDIF}
NewQtWidget.glxcontext := glXCreateContext(NewQtWidget.xdisplay, NewQtWidget.glxcontext := glXCreateContext(NewQtWidget.xdisplay,
NewQtWidget.visual, nil, direct); NewQtWidget.visual, SharedContext, direct);
//123: //123:
NewQtWidget.ref_count := 1; NewQtWidget.ref_count := 1;