[fpc-devel] OpenGL patch
Florian Klaempfl
florian at freepascal.org
Mon Jun 20 18:53:04 CEST 2005
Ales Katona wrote:
> Ok so here's the patch. If you feel some things should change, tell me
> about it.
> This patch adds "TryLoadGL[u[t]]" and "GL[u[t]]IsLoaded" methods and
> also "fixes" the crash on win32 if opengl is not present. (but it will
> still crash later, if the user doesn't check)
>
> Ales
I don't like this patch. Some years ago we didn't abort when no e.g. no
glut.dll was found and we get a lot of bug reports like 2969 and 3100
where people complained that they get runtime errors when using opengl code.
>
>
> ------------------------------------------------------------------------
>
> Index: packages/extra/opengl/gl.pp
> ===================================================================
> --- packages/extra/opengl/gl.pp (revision 446)
> +++ packages/extra/opengl/gl.pp (working copy)
> @@ -1534,15 +1534,26 @@
> PFNGLGETCOLORTABLEPARAMETERIVEXTPROC = procedure(target, pname: GLenum; params: PGLint); extdecl;
> PFNGLGETCOLORTABLEPARAMETERFVEXTPROC = procedure(target, pname: GLenum; params: PGLfloat); extdecl;
>
> +function GLIsLoaded: Boolean;
> procedure LoadOpenGL(const dll: String);
> +procedure TryLoadGL;
> procedure FreeOpenGL;
>
> +
> implementation
>
> +var
> + GLLoaded: Boolean;
> +
> {$ifdef win32}
> function WinChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer; extdecl; external 'gdi32' name 'ChoosePixelFormat';
> {$endif}
>
> +function GLIsLoaded: Boolean;
> +begin
> + Result:=GLLoaded;
> +end;
> +
> procedure FreeOpenGL;
> begin
>
> @@ -1887,7 +1898,7 @@
> {$ENDIF}
>
> FreeLibrary(LibGL);
> -
> + GLLoaded:=False;
> end;
>
> procedure LoadOpenGL(const dll: String);
> @@ -2240,15 +2251,11 @@
> if not Assigned(ChoosePixelFormat) then
> @ChoosePixelFormat := @WinChoosePixelFormat;
> {$ENDIF}
> -
> + GLLoaded:=True;
> end;
>
> -initialization
> -
> - {$IFDEF WIN32}
> - Set8087CW($133F);
> - {$ENDIF WIN32}
> -
> +procedure TryLoadGL;
> +begin
> try
> {$IFDEF Win32}
> LoadOpenGL('opengl32.dll');
> @@ -2260,10 +2267,19 @@
> {$endif}
> {$ENDIF}
> except
> - writeln('Error opening OpenGL library');
> - halt(1);
> + GLLoaded:=False;
> end;
> +end;
>
> +initialization
> +
> + {$IFDEF WIN32}
> + Set8087CW($133F);
> + {$ENDIF WIN32}
> +
> + GLLoaded:=False;
> + TryLoadGL;
> +
> finalization
>
> FreeOpenGL;
> Index: packages/extra/opengl/glu.pp
> ===================================================================
> --- packages/extra/opengl/glu.pp (revision 446)
> +++ packages/extra/opengl/glu.pp (working copy)
> @@ -363,14 +363,22 @@
> GLU_ERROR = GLU_TESS_ERROR;
> GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG;
>
> +function GLuIsLoaded: Boolean;
> procedure LoadGLu(const dll: String);
> +procedure TryLoadGLu;
> procedure FreeGLu;
>
> implementation
>
> var
> hDLL: THandle;
> + GLuLoaded: Boolean;
>
> +function GLuIsLoaded: Boolean;
> +begin
> + Result:=GLuLoaded;
> +end;
> +
> procedure FreeGLu;
> begin
>
> @@ -428,7 +436,7 @@
> @gluEndPolygon := nil;
>
> FreeLibrary(hDLL);
> -
> + GLuLoaded:=False;
> end;
>
> procedure LoadGLu(const dll: String);
> @@ -492,11 +500,11 @@
> @gluBeginPolygon := GetProcAddress(hDLL, 'gluBeginPolygon');
> @gluNextContour := GetProcAddress(hDLL, 'gluNextContour');
> @gluEndPolygon := GetProcAddress(hDLL, 'gluEndPolygon');
> -
> + GLuLoaded:=True;
> end;
>
> -initialization
> -
> +procedure TryLoadGLU;
> +begin
> try
> {$IFDEF Win32}
> LoadGLu('glu32.dll');
> @@ -508,10 +516,14 @@
> {$ENDIF}
> {$endif}
> except
> - writeln('error opening libGLU');
> - halt(1);
> + GLuLoaded:=False;
> end;
> +end;
>
> +initialization
> + GLuLoaded:=False;
> + TryLoadGLu;
> +
> finalization
>
> FreeGLu;
> Index: packages/extra/opengl/glut.pp
> ===================================================================
> --- packages/extra/opengl/glut.pp (revision 446)
> +++ packages/extra/opengl/glut.pp (working copy)
> @@ -390,14 +390,22 @@
> glutLeaveGameMode : procedure; extdecl;
> glutGameModeGet : function (mode : GLenum) : integer; extdecl;
>
> +function GLutIsLoaded: Boolean;
> procedure LoadGlut(const dll: String);
> +procedure TryLoadGLut;
> procedure FreeGlut;
>
> implementation
>
> var
> hDLL: THandle;
> + GLutLoaded: Boolean;
>
> +function GLutIsLoaded: Boolean;
> +begin
> + Result:=GLutLoaded;
> +end;
> +
> procedure FreeGlut;
> begin
>
> @@ -507,7 +515,7 @@
> @glutVideoResize := nil;
> @glutVideoPan := nil;
> @glutReportErrors := nil;
> -
> + GLutLoaded:=False;
> end;
>
> procedure LoadGlut(const dll: String);
> @@ -626,11 +634,11 @@
> @glutEnterGameMode := GetProcAddress(hDLL, 'glutEnterGameMode');
> @glutLeaveGameMode := GetProcAddress(hDLL, 'glutLeaveGameMode');
> @glutGameModeGet := GetProcAddress(hDLL, 'glutGameModeGet');
> -
> + GLutLoaded:=True;
> end;
>
> -initialization
> -
> +procedure TryLoadGLut;
> +begin
> try
> {$IFDEF Win32}
> LoadGlut('glut32.dll');
> @@ -642,10 +650,14 @@
> {$endif}
> {$ENDIF}
> except
> - writeln('Can''t load glut library');
> - halt(1);
> + GLutLoaded:=False;
> end;
> +end;
>
> +initialization
> + GLutLoaded:=False;
> + TryLoadGLut;
> +
> finalization
>
> FreeGlut;
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
More information about the fpc-devel
mailing list