From a325c1254e784938368ab8d455eae80ebab7b482 Mon Sep 17 00:00:00 2001 From: nickysn Date: Fri, 16 Mar 2012 20:46:33 +0000 Subject: [PATCH] * GLX unit converted to use unit ctypes, which fixes some 64-bit issues * glXReleaseBufferMESA function name changed to the correct one: glXReleaseBuffersMESA git-svn-id: trunk@20526 - --- packages/opengl/src/glx.pp | 105 +++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/packages/opengl/src/glx.pp b/packages/opengl/src/glx.pp index eb81aa4f3e..81cd73113e 100644 --- a/packages/opengl/src/glx.pp +++ b/packages/opengl/src/glx.pp @@ -37,7 +37,7 @@ interface {$IFDEF Unix} uses - X, XLib, XUtil; + ctypes, X, XLib, XUtil; {$DEFINE HasGLX} // Activate GLX stuff {$ELSE} {$MESSAGE Unsupported platform.} @@ -237,50 +237,50 @@ type TGLXPbuffer = TXID; var - glXChooseVisual: function(dpy: PDisplay; screen: Integer; attribList: PInteger): PXVisualInfo; cdecl; - glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl; + glXChooseVisual: function(dpy: PDisplay; screen: cint; attribList: Pcint): PXVisualInfo; cdecl; + //glXCreateContext -> internal_glXCreateContext in implementation glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl; - glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl; - glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl; + glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): TBoolResult; cdecl; + glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: culong); cdecl; glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl; glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl; glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl; - glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl; - glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl; - glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl; - glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl; + glXQueryExtension: function(dpy: PDisplay; var errorb, event: cint): TBoolResult; cdecl; + glXQueryVersion: function(dpy: PDisplay; var maj, min: cint): TBoolResult; cdecl; + glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): TBoolResult; cdecl; + glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: cint; var value: cint): cint; cdecl; glXGetCurrentContext: function: GLXContext; cdecl; glXGetCurrentDrawable: function: GLXDrawable; cdecl; glXWaitGL: procedure; cdecl; glXWaitX: procedure; cdecl; - glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl; + glXUseXFont: procedure(font: XFont; first, count, list: cint); cdecl; // GLX 1.1 and later - glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl; - glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl; - glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl; + glXQueryExtensionsString: function(dpy: PDisplay; screen: cint): PChar; cdecl; + glXQueryServerString: function(dpy: PDisplay; screen, name: cint): PChar; cdecl; + glXGetClientString: function(dpy: PDisplay; name: cint): PChar; cdecl; // GLX 1.2 and later glXGetCurrentDisplay: function: PDisplay; cdecl; // GLX 1.3 and later - glXChooseFBConfig: function(dpy: PDisplay; screen: Integer; attribList: PInteger; var nitems: Integer): PGLXFBConfig; cdecl; - glXGetFBConfigAttrib: function(dpy: PDisplay; config: TGLXFBConfig; attribute: Integer; var value: Integer): Integer; cdecl; - glXGetFBConfigs: function(dpy: PDisplay; screen: Integer; var nelements: Integer): PGLXFBConfig; cdecl; + glXChooseFBConfig: function(dpy: PDisplay; screen: cint; attribList: Pcint; var nitems: cint): PGLXFBConfig; cdecl; + glXGetFBConfigAttrib: function(dpy: PDisplay; config: TGLXFBConfig; attribute: cint; var value: cint): cint; cdecl; + glXGetFBConfigs: function(dpy: PDisplay; screen: cint; var nelements: cint): PGLXFBConfig; cdecl; glXGetVisualFromFBConfig: function(dpy: PDisplay; config: TGLXFBConfig): PXVisualInfo; cdecl; - glXCreateWindow: function(dpy: PDisplay; config: TGLXFBConfig; win: X.TWindow; attribList: PInteger): TGLXWindow; cdecl; + glXCreateWindow: function(dpy: PDisplay; config: TGLXFBConfig; win: X.TWindow; attribList: Pcint): TGLXWindow; cdecl; glXDestroyWindow: procedure (dpy: PDisplay; window: TGLXWindow); cdecl; - glXCreatePixmap: function(dpy: PDisplay; config: TGLXFBConfig; pixmap: TXPixmap; attribList: PInteger): TGLXPixmap; cdecl; + glXCreatePixmap: function(dpy: PDisplay; config: TGLXFBConfig; pixmap: TXPixmap; attribList: Pcint): TGLXPixmap; cdecl; glXDestroyPixmap: procedure (dpy: PDisplay; pixmap: TGLXPixmap); cdecl; - glXCreatePbuffer: function(dpy: PDisplay; config: TGLXFBConfig; attribList: PInteger): TGLXPbuffer; cdecl; + glXCreatePbuffer: function(dpy: PDisplay; config: TGLXFBConfig; attribList: Pcint): TGLXPbuffer; cdecl; glXDestroyPbuffer: procedure (dpy: PDisplay; pbuf: TGLXPbuffer); cdecl; - glXQueryDrawable: procedure (dpy: PDisplay; draw: TGLXDrawable; attribute: Integer; value: PLongWord); cdecl; - glXCreateNewContext: function(dpy: PDisplay; config: TGLXFBConfig; renderType: Integer; shareList: TGLXContext; direct: boolean): TGLXContext; cdecl; - glXMakeContextCurrent: function(dpy: PDisplay; draw: TGLXDrawable; read: GLXDrawable; ctx: TGLXContext): boolean; cdecl; + glXQueryDrawable: procedure (dpy: PDisplay; draw: TGLXDrawable; attribute: cint; value: Pcuint); cdecl; + //glXCreateNewContext -> internal_glXCreateNewContext in implementation + glXMakeContextCurrent: function(dpy: PDisplay; draw: TGLXDrawable; read: GLXDrawable; ctx: TGLXContext): TBoolResult; cdecl; glXGetCurrentReadDrawable: function: TGLXDrawable; cdecl; - glXQueryContext: function(dpy: PDisplay; ctx: TGLXContext; attribute: Integer; var value: Integer): Integer; cdecl; - glXSelectEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: LongWord); cdecl; - glXGetSelectedEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: PLongWord); cdecl; + glXQueryContext: function(dpy: PDisplay; ctx: TGLXContext; attribute: cint; var value: cint): cint; cdecl; + glXSelectEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: culong); cdecl; + glXGetSelectedEvent: procedure (dpy: PDisplay; drawable: TGLXDrawable; mask: Pculong); cdecl; // GLX 1.4 and later glXGetProcAddress: function(procname: PChar): Pointer; cdecl; @@ -291,30 +291,35 @@ var glXGetProcAddressARB: function(procname: PChar): Pointer; cdecl; // GLX_ARB_create_context - glXCreateContextAttribsARB: function (dpy: PDisplay; config: TGLXFBConfig; share_context: TGLXContext; direct: boolean; attrib_list: PInteger): TGLXContext; cdecl; + //glXCreateContextAttribsARB -> internal_glXCreateContextAttribsARB in implementation // GLX_MESA_pixmap_colormap glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl; // GLX_MESA_swap_control - glXSwapIntervalMESA: function(interval: LongWord): Integer; cdecl; - glXGetSwapIntervalMESA: function: Integer; cdecl; + glXSwapIntervalMESA: function(interval: cuint): cint; cdecl; + glXGetSwapIntervalMESA: function: cint; cdecl; // Unknown Mesa GLX extension (undocumented in current GLX C headers?) - glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl; - glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl; + glXReleaseBuffersMESA: function(dpy: PDisplay; d: GLXDrawable): TBoolResult; cdecl; + glXCopySubBufferMESA: procedure(dpy: PDisplay; drawable: GLXDrawable; x, y, width, height: cint); cdecl; // GLX_SGI_swap_control - glXSwapIntervalSGI: function(interval: Integer): Integer; cdecl; + glXSwapIntervalSGI: function(interval: cint): cint; cdecl; // GLX_SGI_video_sync - glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl; - glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl; + glXGetVideoSyncSGI: function(var count: cuint): cint; cdecl; + glXWaitVideoSyncSGI: function(divisor, remainder: cint; var count: cuint): cint; cdecl; // ======================================================= // // ======================================================= +// Overloaded functions to handle TBool parameters as actual booleans. +function glXCreateContext(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; +function glXCreateNewContext(dpy: PDisplay; config: TGLXFBConfig; renderType: cint; shareList: TGLXContext; direct: Boolean): TGLXContext; +function glXCreateContextAttribsARB(dpy: PDisplay; config: TGLXFBConfig; share_context: TGLXContext; direct: Boolean; attrib_list: Pcint): TGLXContext; + { Safe checking of glX version and extension presence. @@ -364,6 +369,26 @@ uses GL, dynlibs, GLExt { for glext_ExtensionSupported utility }; {$LINKLIB m} +var + internal_glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: TBool): GLXContext; cdecl; + internal_glXCreateNewContext: function(dpy: PDisplay; config: TGLXFBConfig; renderType: cint; shareList: TGLXContext; direct: TBool): TGLXContext; cdecl; + internal_glXCreateContextAttribsARB: function (dpy: PDisplay; config: TGLXFBConfig; share_context: TGLXContext; direct: TBool; attrib_list: Pcint): TGLXContext; cdecl; + +function glXCreateContext(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; +begin + Result := internal_glXCreateContext(dpy, vis, shareList, Ord(direct)); +end; + +function glXCreateNewContext(dpy: PDisplay; config: TGLXFBConfig; renderType: cint; shareList: TGLXContext; direct: Boolean): TGLXContext; +begin + Result := internal_glXCreateNewContext(dpy, config, renderType, shareList, Ord(direct)); +end; + +function glXCreateContextAttribsARB(dpy: PDisplay; config: TGLXFBConfig; share_context: TGLXContext; direct: Boolean; attrib_list: Pcint): TGLXContext; +begin + Result := internal_glXCreateContextAttribsARB(dpy, config, share_context, Ord(direct), attrib_list); +end; + function GLX_version_1_0(Display: PDisplay): boolean; var IgnoredErrorb, IgnoredEvent, Major, Minor: Integer; @@ -378,7 +403,7 @@ begin (Major >= 1) and { check entry points assigned } Assigned(glXChooseVisual) and - Assigned(glXCreateContext) and + Assigned(internal_glXCreateContext) and Assigned(glXDestroyContext) and Assigned(glXMakeCurrent) and Assigned(glXCopyContext) and @@ -448,7 +473,7 @@ begin Assigned(glXCreatePbuffer) and Assigned(glXDestroyPbuffer) and Assigned(glXQueryDrawable) and - Assigned(glXCreateNewContext) and + Assigned(internal_glXCreateNewContext) and Assigned(glXMakeContextCurrent) and Assigned(glXGetCurrentReadDrawable) and Assigned(glXQueryContext) and @@ -492,7 +517,7 @@ begin begin GlxExtensions := glXQueryExtensionsString(Display, Screen); Result := glext_ExtensionSupported('GLX_ARB_create_context', GlxExtensions) and - Assigned(glXCreateContextAttribsARB); + Assigned(internal_glXCreateContextAttribsARB); end; end; @@ -649,7 +674,7 @@ begin // GLX 1.0 glXChooseVisual := GetProc(OurLibGL, 'glXChooseVisual'); - glXCreateContext := GetProc(OurLibGL, 'glXCreateContext'); + internal_glXCreateContext := GetProc(OurLibGL, 'glXCreateContext'); glXDestroyContext := GetProc(OurLibGL, 'glXDestroyContext'); glXMakeCurrent := GetProc(OurLibGL, 'glXMakeCurrent'); glXCopyContext := GetProc(OurLibGL, 'glXCopyContext'); @@ -683,7 +708,7 @@ begin glXCreatePbuffer := GetProc(OurLibGL, 'glXCreatePbuffer'); glXDestroyPbuffer := GetProc(OurLibGL, 'glXDestroyPbuffer'); glXQueryDrawable := GetProc(OurLibGL, 'glXQueryDrawable'); - glXCreateNewContext := GetProc(OurLibGL, 'glXCreateNewContext'); + internal_glXCreateNewContext := GetProc(OurLibGL, 'glXCreateNewContext'); glXMakeContextCurrent := GetProc(OurLibGL, 'glXMakeContextCurrent'); glXGetCurrentReadDrawable := GetProc(OurLibGL, 'glXGetCurrentReadDrawable'); glXQueryContext := GetProc(OurLibGL, 'glXQueryContext'); @@ -691,14 +716,14 @@ begin glXGetSelectedEvent := GetProc(OurLibGL, 'glXGetSelectedEvent'); // Extensions // GLX_ARB_create_context - glXCreateContextAttribsARB := GetProc(OurLibGL, 'glXCreateContextAttribsARB'); + internal_glXCreateContextAttribsARB := GetProc(OurLibGL, 'glXCreateContextAttribsARB'); // GLX_MESA_pixmap_colormap glXCreateGLXPixmapMESA := GetProc(OurLibGL, 'glXCreateGLXPixmapMESA'); // GLX_MESA_swap_control glXSwapIntervalMESA := GetProc(OurLibGL, 'glXSwapIntervalMESA'); glXGetSwapIntervalMESA := GetProc(OurLibGL, 'glXGetSwapIntervalMESA'); // Unknown Mesa GLX extension - glXReleaseBufferMESA := GetProc(OurLibGL, 'glXReleaseBufferMESA'); + glXReleaseBuffersMESA := GetProc(OurLibGL, 'glXReleaseBuffersMESA'); glXCopySubBufferMESA := GetProc(OurLibGL, 'glXCopySubBufferMESA'); // GLX_SGI_swap_control glXSwapIntervalSGI := GetProc(OurLibGL, 'glXSwapIntervalSGI');