Deutsch
C ++ Forum

Erledigt: glOrtho scheitert?

 
Hallo Sebastian, bei diesem mit XProfan 11 korrekt ausgeführten Quelltext wird neben dem Kubus eine rote Linie gezeichnet - aber nicht wenn man mit der Prf2Cpp 2.0a + Borland 5.5 kompiliert. Hast Du eine Idee woran das liegt? (Typen?)
KompilierenMarkierenSeparieren
cls
var xx&=width(%hWnd)
var yy&=height(%hWnd)
ogl(init,%hWnd,0,0,0,0)
ogl(posmode,1)
ogl(clear)
ogl(color,3,0,0,3)
ogl(move,0,0,-5)
ogl(cuboid,1,1,1)
ogl(origin,0,0,0)
glMatrixMode(GL_PROJECTION)
ogl.ortho(0,yy&-1,xx&,-1,0-xx&,xx&)
ogl.line(10,10,200,100)
ogl(show)
waitInput
end

proc OGL.ORTHO

    PARAMETERS X&,Y&,XX&,YY&,Z&,ZZ&
    OGL(glLoadIdentity)
    OGL(glViewport,0,0,WIDTH(%HWND),HEIGHT(%HWND))
    DECLARE MEM#
    DIM MEM#,48
    FLOAT MEM#,0=X&,XX&,Y&,YY&,Z&,ZZ&
    OGL(glOrtho,LONG(MEM#,0 ),LONG(MEM#,4 ),LONG(MEM#,8 ),LONG(MEM#,12),LONG(MEM#,16),LONG(MEM#,20),LONG(MEM#,24),LONG(MEM#,28),LONG(MEM#,32),LONG(MEM#,36),LONG(MEM#,40),LONG(MEM#,44))
    DISPOSE MEM#

endproc

proc OGL.LINE

    PARAMETERS X!,Y!,XX!,YY!
    OGL(glBegin,1)
    OGL(glVertex3f,X!,Y!,0)
    OGL(glVertex3f,XX!,YY!,0)
    OGL(glEnd)

endproc


1.032 kB
Kurzbeschreibung: xprofan11
Hochgeladen:05.04.2009
Ladeanzahl156
Herunterladen
5 kB
Hochgeladen:05.04.2009
Ladeanzahl231
Herunterladen
307 kB
Kurzbeschreibung: prf2cpp2.0a
Hochgeladen:05.04.2009
Ladeanzahl118
Herunterladen
 
05.04.2009  
 




Sebastian
König
Also bei mir läuft der Code zunächst mal unter XProfan garnicht... Schuld daran ist die Zeile

glMatrixMode(GL_PROJECTION)

Wenn ich die in

ogl(glMatrixMode,~GL_PROJECTION)

ändere, funktioniert es - auch mit Profan2Cpp. Löst das bei Dir evtl. auch schon das Problem?

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
05.04.2009  
 



Mein Problem ist, dass ein schnelleres Call von z.B.
KompilierenMarkierenSeparieren von Prf2Cpp nicht klappt wenn die Übersetzung so lautet:
KompilierenMarkierenSeparieren?

Erfolgreich testen konnte ich, dass die Funktionsadresse in __cf1& korrekt abgelegt ist.
 
05.04.2009  
 




Sebastian
König
iF
von Prf2Cpp nicht klappt wenn die Übersetzung so lautet: (...)
Erfolgreich testen konnte ich, dass die Funktionsadresse in __cf1& korrekt abgelegt ist.


Ah, ich denke, ich sehe das Problem: Der Thread-Kontext ist falsch!

Zur Erläuterung: In mit Profan2Cpp übersetzten Programm laufen grundsätzlich zwei Threads, wovon sich einer nur um Fensterverwaltung und Nachrichtenschleife kümmert. In dem anderen läuft der übersetzte Code. Und auch die OpenGL-Sachen laufen im Kontext dieses Threads ab. Funktionen, die via Call() und External() aufgerufen werden, laufen aber grundsätzlich im Kontext des ersten Threads, aus dem einfachen Grund, dass dies so gut wie immer die sichere Wahl ist (denn sie könnten ja Fenster manipulieren).

Ich habe es jetzt nicht getestet, aber ich würde fast wetten, dass es wieder funktioniert, wenn Du für die Call-Zeile das Verhalten explizit änderst:
KompilierenMarkierenSeparieren
P2CPP: <USE_CALL_ST>
call(__cf1&,$1701)
P2CPP: </USE_CALL_ST>

Der bequemere Weg ist natürlich die Verwendung von oGL(glMatrixMode,...) - und wenn Du mit Profan2Cpp arbeitest, ist es auch nicht langsamer, als Deine Call-Optimierung, denn ich verwende quasi das gleiche Konzept. In der .cpp-Datei wirst Du die Zeile

OGL_direct(GLFN(0, _S(glMatrixMode)), 1, PV(0x1701L));

finden...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
05.04.2009  
 



ogl(glMatrixMode,~GL_PROJECTION)

So hat uns der Herr das gelehrt....
 
06.04.2009  
 



Wäre aber Müll weil deutlich lahmer...

Die opengl32.dll ist vorhanden und die Funktionsadresse bekannt - da muss doch nicht ständig zur Laufzeit erst mit Strings verglichen werden etc. wenn ein Call doch so viel fixer geht...

@Sebastian: Die Zeile OGL_direct(GLFN(0, _S(glMatrixMode)), 1, PV(0x1701L)) beinhaltet einen String welcher erst zur Laufzeit aufgedröselt wird? (Das wäre ja dann bei Weitem nicht so fix.)

Da in Spielen calls auf OpenGL-Funktionen die Regel sind und ich sehr gerne natürlich dank xpse die normalen Befehle schreiben möchte statt ogl Fingerwürg Klammer Anführungszeichen Befehle Anführungszeichen... wäre dies echt schade.

Ich könnte dem XPSE vielleicht beibringen opengl32-Calls im $CPP_mode mit P2CPP: umzuschreiben - aber faktisch kann ich damit erstmal für mich wieder kein Prf2Cpp nutzen. (irgendwie geht mir das immer so)
 
06.04.2009  
 




Sebastian
König
iF
Wäre aber Müll weil deutlich lahmer...

Die opengl32.dll ist vorhanden und die Funktionsadresse bekannt - da muss doch nicht ständig zur Laufzeit erst mit Strings verglichen werden etc. wenn ein Call doch so viel fixer geht...

@Sebastian: Die Zeile OGL_direct(GLFN(0, _S(glMatrixMode)), 1, PV(0x1701L)) beinhaltet einen String welcher erst zur Laufzeit aufgedröselt wird? (Das wäre ja dann bei Weitem nicht so fix.)

Da in Spielen calls auf OpenGL-Funktionen die Regel sind und ich sehr gerne natürlich dank xpse die normalen Befehle schreiben möchte statt ogl Fingerwürg Klammer Anführungszeichen Befehle Anführungszeichen... wäre dies echt schade.

Ich könnte dem XPSE vielleicht beibringen opengl32-Calls im $CPP_mode mit P2CPP: umzuschreiben - aber faktisch kann ich damit erstmal für mich wieder kein Prf2Cpp nutzen. (irgendwie geht mir das immer so)


Guck Dir doch mal das Makro GLFN() in der pgl.h an Der String wird nur beim ersten Aufruf einmal gebraucht, um die Adresse zu ermitteln; danach ist das Ergebnis immer schon vorhanden und wird nicht neu ermittelt. Das meinte ich damit, dass ich im Prinzip die gleiche Optimierung wie Du verwende, mit der Ergänzung, dass die Adressen nur on demand wirklich bestimmt werden...

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
06.04.2009  
 



Hab im Moment keine pgl.h zu Hand, ich glaube aber nicht dass es von der Geschwindigkeit her z.B. kaum etwas ausmacht im Ggs. zum direkten Call auf die Funktion - einfach wegen dem Umweg.

So wäre es z.B. auch sehr entmutigend und schade, alle direkten Calls wiederum in die in XProfan langsameren umzuschreiben, damit diese in Prf2CPP funktionieren.

Da das Problem hier imho nur OpenGL betrifft die Frage, ob Du diese Calls nicht im richtigen Thread landen lassen kannst bzw. den richtigen Thread diese Calls empfangen lassen kannst - so dass ein Call auf Sendmessage funktioniert und ein call auf glViewPort eben auch.
 
06.04.2009  
 




Sebastian
König
iF
Hab im Moment keine pgl.h zu Hand, ich glaube aber nicht dass es von der Geschwindigkeit her z.B. kaum etwas ausmacht im Ggs. zum direkten Call auf die Funktion - einfach wegen dem Umweg.


Also die pgl.h findest Du z.B. im Ordner mit dem übersetzten Code. Aber hier mal ganz konkret:

#define GLFN(n,f) (g_Externals[n] ? g_Externals[n] : (g_Externals[n] = pgl_GetProcAddr(f)))

Effektiv hat man also (bis auf den ersten Aufruf) ein direkts Call, weil die Adresse schon bekannt ist. Der String-Vergleich ist bei wiederholten Aufrufen nicht mehr notwendig, weil die Funktion eindeutig über den Integer n nummeriert ist. Dies geschieht schon beim Übersetzen.

iF
So wäre es z.B. auch sehr entmutigend und schade, alle direkten Calls wiederum in die in XProfan langsameren umzuschreiben, damit diese in Prf2CPP funktionieren.

Da das Problem hier imho nur OpenGL betrifft die Frage, ob Du diese Calls nicht im richtigen Thread landen lassen kannst bzw. den richtigen Thread diese Calls empfangen lassen kannst - so dass ein Call auf Sendmessage funktioniert und ein call auf glViewPort eben auch.

Hmm... das Problem dabei ist, dass diese Abfrage (womöglich mit Stringvergleich des Modulnamens...) dann bei jedem Call() stattfinden würde. Nur für den Spezialfall OpenGL, für den obendrein extra der Mechanismus mit oGL(...) vorgesehen ist, würde ich also generell neuen Overhead einführen. Irgendwie gefällt mir der Gedanke nicht...

Das Ganze ist doch im Grunde eine XPSE-Spezialität... kannst Du den Hebel nicht wie Du schon vorgeschlagen hast, entsprechend dort ansetzen und USE_CALL_ST verwenden?

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
06.04.2009  
 




KompilierenMarkierenSeparieren
P2CPP: <USE_CALL_ST>
call(__cf1&,$1701)
P2CPP: </USE_CALL_ST>

würde dann zu welchem c++-Source konvertiert werden?
 
06.04.2009  
 




Sebastian
König
iF

KompilierenMarkierenSeparieren
P2CPP: <USE_CALL_ST>
call(__cf1&,$1701)
P2CPP: </USE_CALL_ST>

würde dann zu welchem c++-Source konvertiert werden?


Call_ST(l__cf1, 1, _L(0x1701L));

Das ST steht für same thread, also ein Call(), das ohne Wechsel im Kontext des aufrufenden Threads stattfindet.

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
06.04.2009  
 



Und wenn ich z.B. per einem Inline-ASM im Inline-Cpp ein CALL schreibe, landet dieses dann im OGL-Thread?

Ich will einfach jeden Umweg über Wrapperfunktionen umgehen, wenn schon in die schnelleren Calls umgewandelt wird.
 
06.04.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

13.030 Betrachtungen

Unbenanntvor 0 min.
Sven Bader25.07.2021
funkheld25.05.2016
iF09.11.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie