Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 15:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: PBO auf ATI (X1600) und NVIDIA
BeitragVerfasst: Mi Sep 05, 2007 17:59 
Offline
DGL Member

Registriert: Mi Sep 05, 2007 16:04
Beiträge: 3
Hallo!

Habe letzten Monat versucht Videostreaming in OpenGL auf PBOs umzustellen und musste leider nach vielen Versuchen festellen, dass der folgende Code SEHR langsam auf ATI Karten läuft (ein HD-1920-Frame wird in 100-200ms übertragen).
NVIDIA Karten führen das Ganze aber sehr schnell + asynchron aus (<1ms).

Code:
  1. glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, Fpbo);
  2.  
  3. glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);
  4.  
  5. glBindTexture(Ftarget, FtexID);
  6. glTexSubImage2D(Ftarget, 0, 0, 0, Fwidth, Fheight,
  7.     GL_RGBA, GL_UNSIGNED_BYTE, nil);
  8. glBindTexture(Ftarget, 0);
  9.  
  10. glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
  11.  

Der problematische Teil des Ganzen scheint das anschließende Textur Update per glTexSubImage2d() zu sein. Kommentiert man diesen Teil aus, läuft der obige Code auch auf ATI Karten mit gleicher Performance wie NVIDIA.

Meiner Meinung nach scheint ATI's internes Texturformat nicht kompatibel mit GL_RGBA, GL_UNSIGNED_BYTE zu sein, weshalb wahrscheinlich der übertragene Buffer wieder zurück in den CPU RAM kopiert, konvertiert und wieder in den VRAM geladen wird.

Habe deshalb auch schon viele Kombinationen durchprobiert (inkl. glPixelStore). Leider ohne Erfolg.

Bisher habe ich immer auf ATI Systeme gesetzt, aber bei der bisherigen Informationspolitik liegen Welten zwischen NVIDIA und ATI.

Weiss irgendwer Rat??


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du eine möglichkeit, GL_BGRA zu verwenden? Grafikkarten verwenden eher dieses Format.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 09:48 
Offline
DGL Member

Registriert: Mi Sep 05, 2007 16:04
Beiträge: 3
Mit der Umstellung auf GL_BGRA, kann man tatsächlich noch ein paar Millisekunden gewinnen. Unglaublicherweise halbiert man damit bei NVIDIA fast die Update Zeit nochmal. :shock:
Bei ATI gibt es aber keinen signifikaten Unterschied. Habe außer GL_BGRA auch nochmal die ATI spezifischen Formate GL_RGBA_FLOAT32_ATI / GL_RGBA_FLOAT16_ATI durchprobiert (dann auch GL_FLOAT anstatt GL_UNSIGNED_BYTE).

Bzgl. des Textur Formates kann ich eigentlich jeden Input vertragen, da ich sowieso noch eine Farbkonvertierung durch ein selbst geschriebenes Fragment Program von YUY2 oder YV12 nach RGB32 vornehme (Diese kommt aber erst im Anschluß an den Transfer und verlangsamt den Transfer Prozess nicht)

Denke mir aber mal, dass mehrere Leute schon mal ein PBO genutzt haben. Finds erstaunlich, dass bzgl. ATI noch kein Forumbeitrag gepostet wurde -> heißt ja im Umkehrschluss, dass es irgendwie gehen muss...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 10:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also mit PBO habe ich noch nichts gemacht nur was gelesen. Was ich aber bei ATI definitiv weiß ist, dass solche Format wie GL_RGB (24Bit) doch schon einige Zeit benötigen. Also beim normalen Texturupload. Und die PBO-Unterstützung hat ATI erst vor nicht alzulanger Zeit in die Treiber eingebaut.

Aber mal ein Paar Sachen die du evtl probieren könntest.
1. Die Textur direkt zerstören und neu erstellen. Und dann glTexImage benutzen. Und ein 32 Bitiges Format.

2. PBOs sind Asynchron. Es kann auch sein, dass die Befüllung des Buffers länger dauert. Und eine ATI Karte deswegen etwas länger warten muss bis es die Daten in die Textur übernehmen kann. Bzw war in der Spezifikation der PBOs auch ein Beispiel enthalten wie man Asynchron den Bildschirminhalt auslesen kann. Und so kann man unter Umständen schon ein wenig Zeit einsparen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 21:36 
Offline
DGL Member

Registriert: Mi Sep 05, 2007 16:04
Beiträge: 3
So habe nochmal die gesamte Prozedur zerlegt.
Der Transfer der Pixeldaten läuft asynchron und ohne nennenswerte Leistung der CPU. Habe dies mit dem Process Explorer überprüft.

Hierfür habe ich desweiteren das Texturupdate wie oben gepostet auskommentiert und an anderer Stelle wieder implementiert. Vor dem Aufruf von glTexSubImage2d lege ich den aktuellen (und einzigen) Thread für 100ms schlafen, um alle eventuellen Memory-Transfers beenden zu lassen. Nehme danach ein "normales" Texturupdate vor:

Code:
  1.   glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, Fpbo);
  2.   glBindTexture(Ftarget, FtexID);
  3.  
  4.   glTexSubImage2D(Ftarget, 0, 0, 0, Fwidth, Fheight,
  5.     GL_BGRA, GL_UNSIGNED_BYTE, nil);
  6.  
  7.   glBindTexture(Ftarget, 0);
  8.   glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);



PBO binden, Texture binden, Update...
(Habe für Ftarget GL_TEXTURE_2D, als auch GL_TEXTURE_RECTANGLE_ARB, POT und NPOT Auflösungen probiert)

Das Update überprüfe ich mit QueryPerformanceCounter und stelle auch hier wieder fest: Der Treiber blockt und braucht extrem lange für glTexSubImage2D; CPU Last hoch.
Ist das noch niemandem aufgefallen?

Die Implementation habe ich nach OpenGL (opengl.org) Spezifikation durchgeführt.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]