123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771 |
- {
- Translation of the Mesa GLX headers for FreePascal
- Copyright (C) 1999 Sebastian Guenther
- Mesa 3-D graphics library
- Version: 3.0
- Copyright (C) 1995-1998 Brian Paul
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- MA 02110-1301, USA.
- }
- {$MODE delphi} // objfpc would not work because of direct proc var assignments
- {You have to enable Macros (compiler switch "-Sm") for compiling this unit!
- This is necessary for supporting different platforms with different calling
- conventions via a single unit.}
- {$IFNDEF FPC_DOTTEDUNITS}
- unit GLX;
- {$ENDIF FPC_DOTTEDUNITS}
- interface
- {$MACRO ON}
- {$IFDEF Unix}
- {$IFDEF FPC_DOTTEDUNITS}
- uses
- System.CTypes, Api.X11.X, Api.X11.Xlib, Api.X11.Xutil;
- {$ELSE FPC_DOTTEDUNITS}
- uses
- ctypes, X, XLib, XUtil;
- {$ENDIF FPC_DOTTEDUNITS}
- {$DEFINE HasGLX} // Activate GLX stuff
- {$ELSE}
- {$MESSAGE Unsupported platform.}
- {$ENDIF}
- {$IFNDEF HasGLX}
- {$MESSAGE GLX not present on this platform.}
- {$ENDIF}
- // =======================================================
- // Unit specific extensions
- // =======================================================
- // Note: Requires that the GL library has already been initialized
- function InitGLX: Boolean;
- var
- GLXDumpUnresolvedFunctions,
- GLXInitialized: Boolean;
- // =======================================================
- // GLX consts, types and functions
- // =======================================================
- // Tokens for glXChooseVisual and glXGetConfig:
- const
- GLX_USE_GL = 1;
- GLX_BUFFER_SIZE = 2;
- GLX_LEVEL = 3;
- GLX_RGBA = 4;
- GLX_DOUBLEBUFFER = 5;
- GLX_STEREO = 6;
- GLX_AUX_BUFFERS = 7;
- GLX_RED_SIZE = 8;
- GLX_GREEN_SIZE = 9;
- GLX_BLUE_SIZE = 10;
- GLX_ALPHA_SIZE = 11;
- GLX_DEPTH_SIZE = 12;
- GLX_STENCIL_SIZE = 13;
- GLX_ACCUM_RED_SIZE = 14;
- GLX_ACCUM_GREEN_SIZE = 15;
- GLX_ACCUM_BLUE_SIZE = 16;
- GLX_ACCUM_ALPHA_SIZE = 17;
- // Error codes returned by glXGetConfig:
- GLX_BAD_SCREEN = 1;
- GLX_BAD_ATTRIBUTE = 2;
- GLX_NO_EXTENSION = 3;
- GLX_BAD_VISUAL = 4;
- GLX_BAD_CONTEXT = 5;
- GLX_BAD_VALUE = 6;
- GLX_BAD_ENUM = 7;
- // GLX 1.1 and later:
- GLX_VENDOR = 1;
- GLX_VERSION = 2;
- GLX_EXTENSIONS = 3;
- // GLX 1.3 and later:
- GLX_CONFIG_CAVEAT = $20;
- GLX_DONT_CARE = $FFFFFFFF;
- GLX_X_VISUAL_TYPE = $22;
- GLX_TRANSPARENT_TYPE = $23;
- GLX_TRANSPARENT_INDEX_VALUE = $24;
- GLX_TRANSPARENT_RED_VALUE = $25;
- GLX_TRANSPARENT_GREEN_VALUE = $26;
- GLX_TRANSPARENT_BLUE_VALUE = $27;
- GLX_TRANSPARENT_ALPHA_VALUE = $28;
- GLX_WINDOW_BIT = $00000001;
- GLX_PIXMAP_BIT = $00000002;
- GLX_PBUFFER_BIT = $00000004;
- GLX_AUX_BUFFERS_BIT = $00000010;
- GLX_FRONT_LEFT_BUFFER_BIT = $00000001;
- GLX_FRONT_RIGHT_BUFFER_BIT = $00000002;
- GLX_BACK_LEFT_BUFFER_BIT = $00000004;
- GLX_BACK_RIGHT_BUFFER_BIT = $00000008;
- GLX_DEPTH_BUFFER_BIT = $00000020;
- GLX_STENCIL_BUFFER_BIT = $00000040;
- GLX_ACCUM_BUFFER_BIT = $00000080;
- GLX_NONE = $8000;
- GLX_SLOW_CONFIG = $8001;
- GLX_TRUE_COLOR = $8002;
- GLX_DIRECT_COLOR = $8003;
- GLX_PSEUDO_COLOR = $8004;
- GLX_STATIC_COLOR = $8005;
- GLX_GRAY_SCALE = $8006;
- GLX_STATIC_GRAY = $8007;
- GLX_TRANSPARENT_RGB = $8008;
- GLX_TRANSPARENT_INDEX = $8009;
- GLX_VISUAL_ID = $800B;
- GLX_SCREEN = $800C;
- GLX_NON_CONFORMANT_CONFIG = $800D;
- GLX_DRAWABLE_TYPE = $8010;
- GLX_RENDER_TYPE = $8011;
- GLX_X_RENDERABLE = $8012;
- GLX_FBCONFIG_ID = $8013;
- GLX_RGBA_TYPE = $8014;
- GLX_COLOR_INDEX_TYPE = $8015;
- GLX_MAX_PBUFFER_WIDTH = $8016;
- GLX_MAX_PBUFFER_HEIGHT = $8017;
- GLX_MAX_PBUFFER_PIXELS = $8018;
- GLX_PRESERVED_CONTENTS = $801B;
- GLX_LARGEST_PBUFFER = $801C;
- GLX_WIDTH = $801D;
- GLX_HEIGHT = $801E;
- GLX_EVENT_MASK = $801F;
- GLX_DAMAGED = $8020;
- GLX_SAVED = $8021;
- GLX_WINDOW = $8022;
- GLX_PBUFFER = $8023;
- GLX_PBUFFER_HEIGHT = $8040;
- GLX_PBUFFER_WIDTH = $8041;
- GLX_RGBA_BIT = $00000001;
- GLX_COLOR_INDEX_BIT = $00000002;
- GLX_PBUFFER_CLOBBER_MASK = $08000000;
- // GLX 1.4 and later:
- GLX_SAMPLE_BUFFERS = $186a0; // 100000
- GLX_SAMPLES = $186a1; // 100001
- // Extensions:
- // GLX_ARB_multisample
- GLX_SAMPLE_BUFFERS_ARB = 100000;
- GLX_SAMPLES_ARB = 100001;
- // GLX_ARB_create_context (http://www.opengl.org/registry/specs/ARB/glx_create_context.txt)
- GLX_CONTEXT_DEBUG_BIT_ARB = $00000001;
- GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = $00000002;
- GLX_CONTEXT_MAJOR_VERSION_ARB = $2091;
- GLX_CONTEXT_MINOR_VERSION_ARB = $2092;
- GLX_CONTEXT_FLAGS_ARB = $2094;
- // GLX_ARB_create_context_profile
- GLX_CONTEXT_CORE_PROFILE_BIT_ARB = $00000001;
- GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = $00000002;
- GLX_CONTEXT_PROFILE_MASK_ARB = $9126;
- // GLX_ARB_create_context_robustness
- GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB = $00000004;
- GLX_LOSE_CONTEXT_ON_RESET_ARB = $8252;
- GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB = $8256;
- GLX_NO_RESET_NOTIFICATION_ARB = $8261;
- // GLX_SGIS_multisample
- GLX_SAMPLE_BUFFERS_SGIS = 100000;
- GLX_SAMPLES_SGIS = 100001;
- // GLX_EXT_visual_info
- GLX_X_VISUAL_TYPE_EXT = $22;
- GLX_TRANSPARENT_TYPE_EXT = $23;
- GLX_TRANSPARENT_INDEX_VALUE_EXT = $24;
- GLX_TRANSPARENT_RED_VALUE_EXT = $25;
- GLX_TRANSPARENT_GREEN_VALUE_EXT = $26;
- GLX_TRANSPARENT_BLUE_VALUE_EXT = $27;
- GLX_TRANSPARENT_ALPHA_VALUE_EXT = $28;
- GLX_TRUE_COLOR_EXT = $8002;
- GLX_DIRECT_COLOR_EXT = $8003;
- GLX_PSEUDO_COLOR_EXT = $8004;
- GLX_STATIC_COLOR_EXT = $8005;
- GLX_GRAY_SCALE_EXT = $8006;
- GLX_STATIC_GRAY_EXT = $8007;
- GLX_NONE_EXT = $8000;
- GLX_TRANSPARENT_RGB_EXT = $8008;
- GLX_TRANSPARENT_INDEX_EXT = $8009;
- type
- // From XLib:
- XPixmap = TXID;
- XFont = TXID;
- XColormap = TXID;
- GLXContext = Pointer;
- GLXPixmap = TXID;
- GLXDrawable = TXID;
- GLXContextID = TXID;
- TXPixmap = XPixmap;
- TXFont = XFont;
- TXColormap = XColormap;
- TGLXContext = GLXContext;
- TGLXPixmap = GLXPixmap;
- TGLXDrawable = GLXDrawable;
- // GLX 1.3 and later
- TGLXFBConfigRec = record { internal, use only a pointer to this } end;
- TGLXFBConfig = ^TGLXFBConfigRec;
- { PGLXFBConfig is a pointer to TGLXFBConfig (which is also a pointer).
- glX uses this to represent an array of FB configs. }
- PGLXFBConfig = ^TGLXFBConfig;
- TGLXFBConfigID = TXID;
- TGLXContextID = GLXContextID;
- TGLXWindow = TXID;
- TGLXPbuffer = TXID;
- var
- 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): 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: 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: cint); cdecl;
- // GLX 1.1 and later
- glXQueryExtensionsString: function(dpy: PDisplay; screen: cint): PAnsiChar; cdecl;
- glXQueryServerString: function(dpy: PDisplay; screen, name: cint): PAnsiChar; cdecl;
- glXGetClientString: function(dpy: PDisplay; name: cint): PAnsiChar; cdecl;
- // GLX 1.2 and later
- glXGetCurrentDisplay: function: PDisplay; cdecl;
- // GLX 1.3 and later
- 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: {$IFDEF FPC_DOTTEDUNITS}Api.X11.{$ENDIF}X.TWindow; attribList: Pcint): TGLXWindow; cdecl;
- glXDestroyWindow: procedure (dpy: PDisplay; window: TGLXWindow); 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: Pcint): TGLXPbuffer; cdecl;
- glXDestroyPbuffer: procedure (dpy: PDisplay; pbuf: TGLXPbuffer); 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: 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: PAnsiChar): Pointer; cdecl;
- // Extensions:
- // GLX_ARB_get_proc_address
- glXGetProcAddressARB: function(procname: PAnsiChar): Pointer; cdecl;
- // GLX_ARB_create_context
- //glXCreateContextAttribsARB -> internal_glXCreateContextAttribsARB in implementation
- // GLX_EXT_swap_control
- glXSwapIntervalEXT: function(dpy: PDisplay; drawable: TGLXDrawable; interval: cint): cint; cdecl;
- // GLX_MESA_pixmap_colormap
- glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl;
- // GLX_MESA_swap_control
- glXSwapIntervalMESA: function(interval: cuint): cint; cdecl;
- glXGetSwapIntervalMESA: function: cint; cdecl;
- // Unknown Mesa GLX extension (undocumented in current GLX C headers?)
- 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: cint): cint; cdecl;
- // GLX_SGI_video_sync
- 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.
- For each glX version, these functions check that
- - glXQueryExtension indicates that glX extension is present at all on this display.
- - glXQueryVersion indicates that (at least) this version is supported.
- - all the entry points defined for this glX version were
- successfully loaded from the library.
- For now, all glX versions are fully backward-compatible,
- so e.g. if GLX_version_1_3 is true, you know that also GLX_version_1_2
- and GLX_version_1_1 etc. are true,
- and all entry points up to glX 1.3 are assigned.
- For each extension, these functions check that
- - it is declared within glXQueryExtensionsString (which in turn means
- that glXQueryExtensionsString must be available, which requires glX 1.1)
- - all it's entry points were successfully loaded from library
- As such, these functions are the safest way to check if given
- extension/glX version is available.
- Note that the availability of glX version and extension may depend
- on the X display and (in case of extension) even screen number.
- }
- function GLX_version_1_0(Display: PDisplay): boolean;
- function GLX_version_1_1(Display: PDisplay): boolean;
- function GLX_version_1_2(Display: PDisplay): boolean;
- function GLX_version_1_3(Display: PDisplay): boolean;
- function GLX_version_1_4(Display: PDisplay): boolean;
- function GLX_ARB_get_proc_address(Display: PDisplay; Screen: Integer): boolean;
- function GLX_ARB_create_context(Display: PDisplay; Screen: Integer): boolean;
- function GLX_ARB_create_context_profile(Display: PDisplay; Screen: Integer): boolean;
- function GLX_ARB_create_context_robustness(Display: PDisplay; Screen: Integer): boolean;
- function GLX_ARB_multisample(Display: PDisplay; Screen: Integer): boolean;
- function GLX_EXT_swap_control(Display: PDisplay; Screen: Integer): boolean;
- function GLX_EXT_visual_info(Display: PDisplay; Screen: Integer): boolean;
- function GLX_MESA_pixmap_colormap(Display: PDisplay; Screen: Integer): boolean;
- function GLX_MESA_swap_control(Display: PDisplay; Screen: Integer): boolean;
- function GLX_SGI_swap_control(Display: PDisplay; Screen: Integer): boolean;
- function GLX_SGI_video_sync(Display: PDisplay; Screen: Integer): boolean;
- function GLX_SGIS_multisample(Display: PDisplay; Screen: Integer): boolean;
- implementation
- {$IFDEF FPC_DOTTEDUNITS}
- uses Api.OpenGL.Gl, System.DynLibs, Api.OpenGL.Glext { for glext_ExtensionSupported Amiga.Core.Utility };
- {$ELSE FPC_DOTTEDUNITS}
- uses GL, dynlibs, GLExt { for glext_ExtensionSupported utility };
- {$ENDIF FPC_DOTTEDUNITS}
- {$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;
- begin
- Result :=
- { check is glX present at all for this display }
- Assigned(glXQueryExtension) and
- glXQueryExtension(Display, IgnoredErrorb, IgnoredEvent) and
- { check glXQueryVersion, although there is no glX with version < 1 }
- Assigned(glXQueryVersion) and
- glXQueryVersion(Display, Major, Minor) and
- (Major >= 1) and
- { check entry points assigned }
- Assigned(glXChooseVisual) and
- Assigned(internal_glXCreateContext) and
- Assigned(glXDestroyContext) and
- Assigned(glXMakeCurrent) and
- Assigned(glXCopyContext) and
- Assigned(glXSwapBuffers) and
- Assigned(glXCreateGLXPixmap) and
- Assigned(glXDestroyGLXPixmap) and
- { Assigned(glXQueryExtension) and } { (already checked) }
- { Assigned(glXQueryVersion) and } { (already checked) }
- Assigned(glXIsDirect) and
- Assigned(glXGetConfig) and
- Assigned(glXGetCurrentContext) and
- Assigned(glXGetCurrentDrawable) and
- Assigned(glXWaitGL) and
- Assigned(glXWaitX) and
- Assigned(glXUseXFont)
- end;
- function GLX_version_1_1(Display: PDisplay): boolean;
- var
- Major, Minor: Integer;
- begin
- Result :=
- { check previous version Ok }
- GLX_version_1_0(Display) and
- { check glXQueryVersion }
- glXQueryVersion(Display, Major, Minor) and
- ( (Major > 1) or ((Major = 1) and (Minor >= 1)) ) and
- { check entry points assigned }
- Assigned(glXQueryExtensionsString) and
- Assigned(glXQueryServerString) and
- Assigned(glXGetClientString);
- end;
- function GLX_version_1_2(Display: PDisplay): boolean;
- var
- Major, Minor: Integer;
- begin
- Result :=
- { check previous version Ok }
- GLX_version_1_1(Display) and
- { check glXQueryVersion }
- glXQueryVersion(Display, Major, Minor) and
- ( (Major > 1) or ((Major = 1) and (Minor >= 2)) ) and
- { check entry points assigned }
- Assigned(glXGetCurrentDisplay);
- end;
- function GLX_version_1_3(Display: PDisplay): boolean;
- var
- Major, Minor: Integer;
- begin
- Result :=
- { check previous version Ok }
- GLX_version_1_2(Display) and
- { check glXQueryVersion }
- glXQueryVersion(Display, Major, Minor) and
- ( (Major > 1) or ((Major = 1) and (Minor >= 3)) ) and
- { check entry points assigned }
- Assigned(glXChooseFBConfig) and
- Assigned(glXGetFBConfigAttrib) and
- Assigned(glXGetFBConfigs) and
- Assigned(glXGetVisualFromFBConfig) and
- Assigned(glXCreateWindow) and
- Assigned(glXDestroyWindow) and
- Assigned(glXCreatePixmap) and
- Assigned(glXDestroyPixmap) and
- Assigned(glXCreatePbuffer) and
- Assigned(glXDestroyPbuffer) and
- Assigned(glXQueryDrawable) and
- Assigned(internal_glXCreateNewContext) and
- Assigned(glXMakeContextCurrent) and
- Assigned(glXGetCurrentReadDrawable) and
- Assigned(glXQueryContext) and
- Assigned(glXSelectEvent) and
- Assigned(glXGetSelectedEvent);
- end;
- function GLX_version_1_4(Display: PDisplay): boolean;
- var
- Major, Minor: Integer;
- begin
- Result :=
- { check previous version Ok }
- GLX_version_1_3(Display) and
- { check glXQueryVersion }
- glXQueryVersion(Display, Major, Minor) and
- ( (Major > 1) or ((Major = 1) and (Minor >= 4)) ) and
- { check entry points assigned }
- Assigned(glXGetProcAddress);
- end;
- function GLX_ARB_get_proc_address(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_ARB_get_proc_address', GlxExtensions) and
- Assigned(glXGetProcAddressARB);
- end;
- end;
- function GLX_ARB_create_context(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_ARB_create_context', GlxExtensions) and
- Assigned(internal_glXCreateContextAttribsARB);
- end;
- end;
- function GLX_ARB_create_context_profile(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_ARB_create_context_profile', GlxExtensions);
- end;
- end;
- function GLX_ARB_create_context_robustness(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_ARB_create_context_robustness', GlxExtensions);
- end;
- end;
- function GLX_ARB_multisample(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_ARB_multisample', GlxExtensions);
- end;
- end;
- function GLX_EXT_swap_control(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_EXT_swap_control', GlxExtensions) and
- Assigned(glXSwapIntervalEXT);
- end;
- end;
- function GLX_EXT_visual_info(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_EXT_visual_info', GlxExtensions);
- end;
- end;
- function GLX_MESA_pixmap_colormap(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_MESA_pixmap_colormap', GlxExtensions) and
- Assigned(glXCreateGLXPixmapMESA);
- end;
- end;
- function GLX_MESA_swap_control(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_MESA_swap_control', GlxExtensions) and
- Assigned(glXSwapIntervalMESA) and
- Assigned(glXGetSwapIntervalMESA);
- end;
- end;
- function GLX_SGI_swap_control(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_SGI_swap_control', GlxExtensions) and
- Assigned(glXSwapIntervalSGI);
- end;
- end;
- function GLX_SGI_video_sync(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_SGI_video_sync', GlxExtensions) and
- Assigned(glXGetVideoSyncSGI) and
- Assigned(glXWaitVideoSyncSGI);
- end;
- end;
- function GLX_SGIS_multisample(Display: PDisplay; Screen: Integer): boolean;
- var
- GlxExtensions: PAnsiChar;
- begin
- Result := GLX_version_1_1(Display);
- if Result then
- begin
- GlxExtensions := glXQueryExtensionsString(Display, Screen);
- Result := glext_ExtensionSupported('GLX_SGIS_multisample', GlxExtensions);
- end;
- end;
- function GetProc(handle: PtrInt; name: PAnsiChar): Pointer;
- begin
- if Assigned(glXGetProcAddress) then
- Result := glXGetProcAddress(name)
- else
- if Assigned(glXGetProcAddressARB) then
- Result := glXGetProcAddressARB(name)
- else
- Result := GetProcAddress(handle, name);
- if (Result = nil) and GLXDumpUnresolvedFunctions then
- WriteLn('Unresolved: ', name);
- end;
- function InitGLX: Boolean;
- var
- OurLibGL: TLibHandle;
- begin
- Result := False;
- {$ifndef darwin}
- OurLibGL := libGl;
- {$else darwin}
- OurLibGL := LoadLibrary('/usr/X11R6/lib/libGL.dylib');
- {$endif darwin}
- if OurLibGL = 0 then
- exit;
- // glXGetProcAddress and glXGetProcAddressARB are imported first,
- // so we can use them (when they are available) to resolve all the
- // other imports
- // GLX 1.4 and later
- glXGetProcAddress := GetProc(OurLibGL, 'glXGetProcAddress');
- // GLX_ARB_get_proc_address
- glXGetProcAddressARB := GetProc(OurLibGL, 'glXGetProcAddressARB');
- // GLX 1.0
- glXChooseVisual := GetProc(OurLibGL, 'glXChooseVisual');
- internal_glXCreateContext := GetProc(OurLibGL, 'glXCreateContext');
- glXDestroyContext := GetProc(OurLibGL, 'glXDestroyContext');
- glXMakeCurrent := GetProc(OurLibGL, 'glXMakeCurrent');
- glXCopyContext := GetProc(OurLibGL, 'glXCopyContext');
- glXSwapBuffers := GetProc(OurLibGL, 'glXSwapBuffers');
- glXCreateGLXPixmap := GetProc(OurLibGL, 'glXCreateGLXPixmap');
- glXDestroyGLXPixmap := GetProc(OurLibGL, 'glXDestroyGLXPixmap');
- glXQueryExtension := GetProc(OurLibGL, 'glXQueryExtension');
- glXQueryVersion := GetProc(OurLibGL, 'glXQueryVersion');
- glXIsDirect := GetProc(OurLibGL, 'glXIsDirect');
- glXGetConfig := GetProc(OurLibGL, 'glXGetConfig');
- glXGetCurrentContext := GetProc(OurLibGL, 'glXGetCurrentContext');
- glXGetCurrentDrawable := GetProc(OurLibGL, 'glXGetCurrentDrawable');
- glXWaitGL := GetProc(OurLibGL, 'glXWaitGL');
- glXWaitX := GetProc(OurLibGL, 'glXWaitX');
- glXUseXFont := GetProc(OurLibGL, 'glXUseXFont');
- // GLX 1.1 and later
- glXQueryExtensionsString := GetProc(OurLibGL, 'glXQueryExtensionsString');
- glXQueryServerString := GetProc(OurLibGL, 'glXQueryServerString');
- glXGetClientString := GetProc(OurLibGL, 'glXGetClientString');
- // GLX 1.2 and later
- glXGetCurrentDisplay := GetProc(OurLibGL, 'glXGetCurrentDisplay');
- // GLX 1.3 and later
- glXChooseFBConfig := GetProc(OurLibGL, 'glXChooseFBConfig');
- glXGetFBConfigAttrib := GetProc(OurLibGL, 'glXGetFBConfigAttrib');
- glXGetFBConfigs := GetProc(OurLibGL, 'glXGetFBConfigs');
- glXGetVisualFromFBConfig := GetProc(OurLibGL, 'glXGetVisualFromFBConfig');
- glXCreateWindow := GetProc(OurLibGL, 'glXCreateWindow');
- glXDestroyWindow := GetProc(OurLibGL, 'glXDestroyWindow');
- glXCreatePixmap := GetProc(OurLibGL, 'glXCreatePixmap');
- glXDestroyPixmap := GetProc(OurLibGL, 'glXDestroyPixmap');
- glXCreatePbuffer := GetProc(OurLibGL, 'glXCreatePbuffer');
- glXDestroyPbuffer := GetProc(OurLibGL, 'glXDestroyPbuffer');
- glXQueryDrawable := GetProc(OurLibGL, 'glXQueryDrawable');
- internal_glXCreateNewContext := GetProc(OurLibGL, 'glXCreateNewContext');
- glXMakeContextCurrent := GetProc(OurLibGL, 'glXMakeContextCurrent');
- glXGetCurrentReadDrawable := GetProc(OurLibGL, 'glXGetCurrentReadDrawable');
- glXQueryContext := GetProc(OurLibGL, 'glXQueryContext');
- glXSelectEvent := GetProc(OurLibGL, 'glXSelectEvent');
- glXGetSelectedEvent := GetProc(OurLibGL, 'glXGetSelectedEvent');
- // Extensions
- // GLX_ARB_create_context
- internal_glXCreateContextAttribsARB := GetProc(OurLibGL, 'glXCreateContextAttribsARB');
- // GLX_EXT_swap_control
- glXSwapIntervalEXT := GetProc(OurLibGL, 'glXSwapIntervalEXT');
- // GLX_MESA_pixmap_colormap
- glXCreateGLXPixmapMESA := GetProc(OurLibGL, 'glXCreateGLXPixmapMESA');
- // GLX_MESA_swap_control
- glXSwapIntervalMESA := GetProc(OurLibGL, 'glXSwapIntervalMESA');
- glXGetSwapIntervalMESA := GetProc(OurLibGL, 'glXGetSwapIntervalMESA');
- // Unknown Mesa GLX extension
- glXReleaseBuffersMESA := GetProc(OurLibGL, 'glXReleaseBuffersMESA');
- glXCopySubBufferMESA := GetProc(OurLibGL, 'glXCopySubBufferMESA');
- // GLX_SGI_swap_control
- glXSwapIntervalSGI := GetProc(OurLibGL, 'glXSwapIntervalSGI');
- // GLX_SGI_video_sync
- glXGetVideoSyncSGI := GetProc(OurLibGL, 'glXGetVideoSyncSGI');
- glXWaitVideoSyncSGI := GetProc(OurLibGL, 'glXWaitVideoSyncSGI');
- GLXInitialized := True;
- Result := True;
- end;
- initialization
- InitGLX;
- end.
|