Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   OpenGL oder GLScene setzt FPU-CW um (https://www.delphipraxis.net/95678-opengl-oder-glscene-setzt-fpu-cw-um.html)

user0 11. Jul 2007 13:34


OpenGL oder GLScene setzt FPU-CW um
 
Hallo Leute,

eine Anwendung, die mehrere sehr genaue und komplexe Rechnungen ausführt stellt ihre Ergebnisse u.a. mit GLScene dar. Das Problem ist nun, dass sobald man GLScene startet die FPU Precision auf Double umgestellt wird. Mit hilfe von Set8087CW können wir das zurücksetzten, aber warum macht das GLScene oder OpenGL überhaupt, und wo?

user0

P.S.: Im GLScene Package wird das FPU Control Word immer auf Extended Precision und no Exceptions geschaltet ($133F). Also müsste OpenGL dafür verantwortlich sein. Lädt OpenGL irgend eine DLL? Bekanntlicher weise kann ja das Laden von DLLs das FPUCW umschalten.

user0 12. Jul 2007 14:55

Re: OpenGL oder GLScene setzt FPU-CW um
 
Jetzt wird´s noch merkwürdiger: Auf mehreren PCs wird das CW nur einmal umgeschaltet. Auf einem mehrfach. :shock:

user0

turboPASCAL 12. Jul 2007 20:30

Re: OpenGL oder GLScene setzt FPU-CW um
 
Zitat:

Zitat von user0
... Mit hilfe von Set8087CW können wir das zurücksetzten, aber warum macht das GLScene oder OpenGL überhaupt...
Weil in OpenGL sehr viel mit Gleitkommazahlen gearbeited wird die eine hohe Genuigkeit in den Nachkommastellen benötigt.

... und wo?

Na in der OpenGlxx.pas von GLScene. ;)
Delphi-Quellcode:
// IsMesaGL
//
function IsMesaGL : Boolean;
begin
   Result:=(GetProcAddress(Cardinal(GLHandle), 'glResizeBuffersMESA')<>nil);
end;

initialization

  ContextList := TThreadList.Create;
  Set8087CW($133F); // <--<<

finalization

  CloseOpenGL;
  ContextList.Free;
  // We don't need to reset the FPU control word as the previous set call is process specific.
 
end.
Zitat:

Zitat von user0
Jetzt wird´s noch merkwürdiger: Auf mehreren PCs wird das CW nur einmal umgeschaltet. Auf einem mehrfach. :shock:

Liegt das ggf. an deinem Programm ?

user0 13. Jul 2007 08:23

Re: OpenGL oder GLScene setzt FPU-CW um
 
Hallo turboPASCAL,
erstmal Danke für deine Antwort.

Das Set8087CW($133F); in der OpenGL1x.pas habe ich auch gefunden, aber beim Öffnen des 3D-Fensters wird das CW nicht auf $133F sondern auf $127F bzw. $027F geschaltet. Laut dieser und anderer Websites heißt dass im wesendlichen, das alle Exceptionflags auf 1 (das ist ja gut so), aber die Floatingpoint-Precision auf "reserved" geschaltet (nicht so gut, sollte eigendlich 64-Bit extended sein) wird.
:coder2:

Das Programm lädt GLScene nur einmal. Hätte das nicht funktioniert, hätte es die gesammte 3D-funktionalität abgeschaltet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz