Venomgfx von venomsoftware (windows) Exception???

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
thosch
Beiträge: 324
Registriert: Mo 10. Jul 2017, 20:32

Venomgfx von venomsoftware (windows) Exception???

Beitrag von thosch »

Hallo,

Ich beschäftige mich gerade mit Venomgfx unter Windows. Einer meiner Computerfreunde hat früher viel damit programmiert und da will ich mir diese Grafik-Engine auch mal anschauen. Veilleicht ist die noch zu irgendwas gut. Schnell genug ist sie ja. Ich dachte, ich könnte diese Bibliothek für ihn auf meinem Rechner übersetzen, aber bei ihm wie bei mir wird die Exception ausgelöst.

Beim Übersetzen meiner Testanwendung wird an der im unteren Quelltext angegebenen Stelle eine Exception ohne genauere Angaben (Exceptionnummer, Meldung...) ausgelöst.
Die Grafiksoftware verwendet die DirectX Schnittstelle zur Grafikausgabe.

Da ich aber nun eh schon in Windows bin, bin ich doch auch schon im Grafikmodus. So geht meine Überlegung für einen Workaround da hin, dass ich nur die VGFX-spezifischen Dinge initialisieren will
und die Ausgabe über das gewöhnliche GDI vornehmen will, in der aktuellen in meinem Windows eingestellten Grafikauflösung. Mein Windows funktioniert ja schließlich, also funktioniert zwangsläufig auch die Grafikausgane per GDI.

Ich verwende Windows 10 mit aktuellem Update. Und Lazarus 1.6.4 mit Freepascal 3.0.2. Das Demo soll später auch mit FPC 3.0.0 und 2.6.4 und möglichst auch mit Version 2.6.2 funktionieren. Unter Windows 10 mit aktuellem Update.

Muss ich oder kann ich evtl. eine versionsabhängige DirectX-Funktion zum Initialisieren der Grafikschnittstelle einsetzen.

Mir geht es zunächst darum, VenomGFX-Graikroutinen überhaupt verwenden zu können. Dass da das GDI evtl langsamer ist als DirectX, stört zunächst nicht, es soll zuerst mal überhaupt funktionieren und das unter Verwendung der Grafikroutinen der VGFX Bibliothek.


Wie muss ich da vorgehen?

Hier ist der Quellcode der Prozeduren Init_Graph() und Kill_Graph aus der VGFX-Unit:

Code: Alles auswählen

 
PROCEDURE Init_Graph(Breite,Hoehe:Longint);
Begin
 If not VGFXGraphLoaded then
 begin
  CursorVisible(False);
 
  WAITMS(100);
 
  // Don't use this, FPCX will do the resolution switches
  // in GetDefaultDirectDraw() and CloseDirectDraw()
  //SetResolution(Breite,Hoehe,16);
 
  WAITMS(200);
 
  Calculate_ScreenSettings(Breite,Hoehe);
 
  //Diese Funktion wirft die Exception
 
  //Gibt es einen Workaround?????????????
 
  GetDefaultDirectDraw(Window_Main_Handle,Breite,Hoehe,16);
 
  WAITMS(200);
 
  CursorVisible(False);
 
  VGFXGraphLoaded:= True;
 
  Init_VW(ClearVW,DD_Breite,DD_Hoehe,True);
 end;
End;
 
 
PROCEDURE Kill_Graph;
Begin
 If VGFXGraphLoaded then
 begin
  Kill_VW(ClearVW);
 
  WAITMS(100);
  //Hier wird DirectDraw wieder ausgeschaltet
  CloseDirectDraw; 
 
  WAITMS(200);
 
  // Don't use this, FPCX will do the resolution switches
  // in GetDefaultDirectDraw() and CloseDirectDraw()
  //ReSetResolution;
 
  WAITMS(200);
 
  VGFXGraphLoaded:= False;
 
  CursorVisible(True);
 end;
End;
 
 
 
 
//Hier wird der Zwischenspeicher für die Bildinformation angelegt
PROCEDURE Init_VW(var VWPage:VirtualWindow;Breite,Hoehe:Longint;Clear:Boolean);
Begin
 CalculateVW(VWPage,Breite,Hoehe);
 
 VWPage.VWOffset:= 0;
 AllokSpeicher(VWPage.VWOffset,VWPage.Size);
 
 VWPage.Active:= True;
 
 If Clear then ClrPackedSprite(VWPage,0);
End;
 
 
//Diese beiden Prozeduren schreiben die Pixel in den Bildschirm,
//um sie dort sichtbar zu machen
PROCEDURE Flip_DD(Source:Longint);
Begin
 //wie erreiche ich das gleiche mit normalem GDI statt DirectX
 DirectDrawBlit(Pointer(Source));
End;
 
 
//wie muss ich diesen Quellcode an die Nutzung des normalen GDI anpassen?
PROCEDURE Flip_VW(Source,Dest:Longint); Assembler;
Asm
 Mov esi,Source
 Mov edi,Dest
 
 Mov ecx,DD_Size
 
  Shr ecx,8
  @SCHLEIFE:
 
   MovQ mm1,[esi    ];     MovQ [edi    ],mm1
   MovQ mm1,[esi+  8];     MovQ [edi+  8],mm1
   MovQ mm1,[esi+ 16];     MovQ [edi+ 16],mm1
   MovQ mm1,[esi+ 24];     MovQ [edi+ 24],mm1
   MovQ mm1,[esi+ 32];     MovQ [edi+ 32],mm1
   MovQ mm1,[esi+ 40];     MovQ [edi+ 40],mm1
   MovQ mm1,[esi+ 48];     MovQ [edi+ 48],mm1
   MovQ mm1,[esi+ 56];     MovQ [edi+ 56],mm1
   MovQ mm1,[esi+ 64];     MovQ [edi+ 64],mm1
   MovQ mm1,[esi+ 72];     MovQ [edi+ 72],mm1
   MovQ mm1,[esi+ 80];     MovQ [edi+ 80],mm1
   MovQ mm1,[esi+ 88];     MovQ [edi+ 88],mm1
   MovQ mm1,[esi+ 96];     MovQ [edi+ 96],mm1
   MovQ mm1,[esi+104];     MovQ [edi+104],mm1
   MovQ mm1,[esi+112];     MovQ [edi+112],mm1
   MovQ mm1,[esi+120];     MovQ [edi+120],mm1
   MovQ mm1,[esi+128];     MovQ [edi+128],mm1
   MovQ mm1,[esi+136];     MovQ [edi+136],mm1
   MovQ mm1,[esi+144];     MovQ [edi+144],mm1
   MovQ mm1,[esi+152];     MovQ [edi+152],mm1
   MovQ mm1,[esi+160];     MovQ [edi+160],mm1
   MovQ mm1,[esi+168];     MovQ [edi+168],mm1
   MovQ mm1,[esi+176];     MovQ [edi+176],mm1
   MovQ mm1,[esi+184];     MovQ [edi+184],mm1
   MovQ mm1,[esi+192];     MovQ [edi+192],mm1
   MovQ mm1,[esi+200];     MovQ [edi+200],mm1
   MovQ mm1,[esi+208];     MovQ [edi+208],mm1
   MovQ mm1,[esi+216];     MovQ [edi+216],mm1
   MovQ mm1,[esi+224];     MovQ [edi+224],mm1
   MovQ mm1,[esi+232];     MovQ [edi+232],mm1
   MovQ mm1,[esi+240];     MovQ [edi+240],mm1
   MovQ mm1,[esi+248];     MovQ [edi+248],mm1
 
   Add esi,256
   Add edi,256
 
  Dec ecx
  JNZ @SCHLEIFE
  Emms
End;
 


Ich habe mal als Dateianhang die von mir verwendete Venomgfx für Windows hoch geladen. Für alle Fälle. Aber vielleicht findet sich ja ein ganz trivialer Work Araund für mein Problem. In der Zip Datei befindet sich eine Demo, mit der ich die Exception erhalte.
Dateianhänge
vgfx_fpc2x.zip
(360.34 KiB) 118-mal heruntergeladen

Antworten